網(wǎng)站建設(shè)要代碼有什么好處中國(guó)疫情最新數(shù)據(jù)
什么是網(wǎng)關(guān)?
網(wǎng)關(guān)是一個(gè)服務(wù),是訪問(wèn)內(nèi)部系統(tǒng)的唯一入口,提供內(nèi)部服務(wù)的路由中轉(zhuǎn),額外還可以在此基礎(chǔ)上提供如身份驗(yàn)證、監(jiān)控、負(fù)載均衡、限流、降級(jí)與應(yīng)用檢測(cè)等功能。
Spring Cloud Gateway 與 Zuul 對(duì)比
zuul1.x與zuul2.x
Zuul 1.x 基于同步 IO
zuul2.x
基于異步io
zuul1.x 對(duì)比 zuul2.x 性能提升
zuul 與Gateway對(duì)比
SpringCloud Gateway 使用
斷言 predicates
多個(gè)斷言可以配合使用
path斷言
predicates:- Path=/mg/**
Query斷言
參數(shù)值可以寫正則,也可以只寫參數(shù)名
predicates:- Query=foo,ba.
Method斷言
predicates:- Method=get
Host斷言
predicates:- Host=mashibing.com
Cookie斷言
predicates:- Cookie=name,yiming
基本路由
依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
配置文件
spring:cloud:gateway:routes:- id: xxoorouteuri: http://localhost:8080 filters:- StripPrefix=2server:port: 80
整合Eureka
依賴
<!-- eureka-client -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>4.0.0</version></dependency>
配置
spring:cloud:gateway:discovery:locator:// 開(kāi)啟從eureka 拉取服務(wù)列表 并自動(dòng)映射enabled: trueapplication:name: myGateWay
eureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80
負(fù)載均衡
spring:cloud:gateway:discovery:locator:enabled: trueroutes:- id: mdbpredicates:- Path=/mangodb/**uri: lb://MDBfilters:- StripPrefix=1application:name: myGateWayeureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80
自定義負(fù)載均衡
配置
MDB:ribbon:NFLoadBalancerRuleClassName: com.mashibing.admin.MyRule
package com.mashibing.admin;import java.util.List;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.Server;public class MyRule extends AbstractLoadBalancerRule{@Overridepublic Server choose(Object key) {// TODO Auto-generated method stubList<Server> list = this.getLoadBalancer().getReachableServers();System.out.println(list);// 各種邏輯~~~~System.out.println("xxoo");return list.get(0);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}}
自定義路由
@Beanpublic RouteLocator routeLocator (RouteLocatorBuilder locatorBuilder) {return locatorBuilder.routes().route(p -> p.path("/xxoo").filters(f -> f.stripPrefix(1)).uri("http://mashibing.com")).route(p ->p.path("/go").filters(f -> f.stripPrefix(1)).uri("lb://MDB")).build();}
自定義過(guò)濾器
package com.mashibing.admin;import java.util.List;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@Component
public class MyFilter implements Ordered,GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> queryParams = request.getQueryParams();List<String> list = queryParams.get("id");if (null == list || list.size() ==0) {// 非法請(qǐng)求System.out.println("不要~");// exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//
// return exchange.getResponse().setComplete();DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("xiake~!!".getBytes());exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().writeWith(Mono.just(dataBuffer));}return chain.filter(exchange);}@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 0;}}
SpringCloud Gateway
路由
使用webflux
@Beanpublic RouterFunction<ServerResponse> function(){RouterFunction<ServerResponse> route = RouterFunctions.route(RequestPredicates.path("/002"),req -> ServerResponse.ok().body(BodyInserters.fromValue("xxx")));return route;}
緩存
權(quán)重與灰度發(fā)布
隨機(jī)算法
routes:- id: w1predicates:- Path=/w/**- Weight=service,95uri: lb://MDBfilters:- StripPrefix=1- id: w2predicates:- Path=/w/**- Weight=service,5uri: lb://MDB2filters:- StripPrefix=1
過(guò)濾器
SpringCloud Gateway用于攔截用戶請(qǐng)求和鏈?zhǔn)教幚?#xff0c;可以實(shí)現(xiàn)面向切面編程,在切面中可以實(shí)現(xiàn)與應(yīng)用無(wú)關(guān)的需求,比如安全、訪問(wèn)超時(shí)等
有序
order值越小 優(yōu)先級(jí)越高
@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 110;}
限流
內(nèi)置令牌桶 + Redis
pom
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:key-resolver: '#{@userKeyResolver}'redis-rate-limiter.replenishRate: 1redis-rate-limiter.burstCapacity: 3
public class RateLimitConfig {KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));}
}
整合GoogleGuava
DefaultRateLimiter
package com.mashibing.admin;import java.util.HashMap;
import java.util.Objects;import javax.validation.constraints.DecimalMin;import org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter;
import org.springframework.cloud.gateway.support.ConfigurationService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import com.google.common.util.concurrent.RateLimiter;import reactor.core.publisher.Mono;@Component
@Primary
public class DefaultRateLimiter extends AbstractRateLimiter<DefaultRateLimiter.Config> {public DefaultRateLimiter() {super(Config.class, "default-rate-limit", new ConfigurationService());}/*** 每秒一個(gè)請(qǐng)求,每秒發(fā)一個(gè)令牌*/private final RateLimiter limiter = RateLimiter.create(1);@Overridepublic Mono<Response> isAllowed(String routeId, String id) {Config config = getConfig().get(routeId);limiter.setRate(Objects.isNull(config.getPermitsPerSecond()) ? 1 : config.getPermitsPerSecond());boolean isAllow = limiter.tryAcquire();return Mono.just(new Response(isAllow, new HashMap<>()));}@Validatedpublic static class Config {@DecimalMin("0.1")private Double permitsPerSecond;public Double getPermitsPerSecond() {return permitsPerSecond;}public Config setPermitsPerSecond(Double permitsPerSecond) {this.permitsPerSecond = permitsPerSecond;return this;}}}
配置
routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:rate-limiter: "#{@defaultRateLimiter}"key-resolver: "#{@userKeyResolver}"default-rate-limit.permitsPerSecond: 0.5
權(quán)限
寫在filter中
hystrix
項(xiàng)目里講
生命周期
Spring Cloud Gateway同zuul類似,有“pre”和“post”兩種方式的filter??蛻舳说恼?qǐng)求先經(jīng)過(guò)“pre”類型的filter,然后將請(qǐng)求轉(zhuǎn)發(fā)到具體的業(yè)務(wù)服務(wù),比如上圖中的user-service,收到業(yè)務(wù)服務(wù)的響應(yīng)之后,再經(jīng)過(guò)“post”類型的filter處理,最后返回響應(yīng)到客戶端。