gateway路由网关,zuul的替代品
https://spring.io/projects/spring-cloud-gateway
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
gateway
- 特性
- 網關的三大核心對象
- 入門配置
- 斷言配置
- 支持自定義過濾器
特性
Spring Cloud Gateway 使用的Webflux中的reactor-netty響應式編程組件,底層使用了Netty通訊框架.
網關在微服務的哪個地方, nginx后面就是。
網關的三大核心對象
路由Route
路由是構建網關的基本模塊,它由ID,目標URI,一系列的斷言和過濾器組成,如果斷言為true則匹配該路由。
route --> 根據規則將請求轉發到對應的微服務。斷言Predicate
參考的是java8的java.util.function.Predicate開發人員可以匹配HTTP請求中的所有內容(例如請求頭或請求參數),如果請求與斷言相匹配則進行路由。
可以設置對應的規則來設置斷言。符合規則轉發請求, 不符合可以做出對應處理。過濾 filter
指的是Spring框架中GatewayFilter的實例,使用過濾器,可以在請求被路由前或者之后對請求進行修改。
java web 中的過濾器, 過濾器鏈, 懂吧。入門配置
pom
<!--新增gateway 需要排除web和actuator 2.2.1.RELEASE --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>routes 下面可以配置多個路由路徑。‘
使用yaml配置路由
# gateway --> 路由 斷言 過濾器 server:port: 9527# 網關配置 spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true # 開啟從注冊中心獲取動態路由的功能。利用微服務名進行路由。routes:- id: payment_routh1 # 路由的id 沒有固定規則但是要求唯一 配合服務名稱# uri: http://localhost:8001 # 匹配后提供服務的路由地址uri: lb://cloud-payment-service # 根據服務名進行路由predicates:- Path=/payment/get/** # 路徑像匹配的進行斷言~使用bean的方式配置路由
package top.bitqian.springcloud.config;import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** 網關規則bean配置* @author echo lovely* @date 2020/12/12 16:53*/@Configuration public class GatewayConfig {// 可以配置多個bean, 根據規則跳轉到不同的url@Beanpublic RouteLocator customerRouteLocator(RouteLocatorBuilder routeBuilder) {RouteLocatorBuilder.Builder routes = routeBuilder.routes();routes.route("adorable1",r -> r.path("/team"). // localhost:9527/teamuri("https://github.com/team")). // to teambuild();return routes.build();}@Beanpublic RouteLocator customerRouteLocator1(RouteLocatorBuilder routeBuilder) {RouteLocatorBuilder.Builder routes = routeBuilder.routes();routes.route("adorable2",r -> r.path("/explore"). // localhost:9527/exploreuri("https://github.com/explore")). // to explorebuild();return routes.build();}}斷言配置
https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories
支持cookie, 請求頭, 請求方法,請求參數, 請求時間…
可以本地使用curl來測試, 像linux curl localhost:8080
# gateway --> 路由 斷言 過濾器 server:port: 9527# 網關配置 spring:application:name: cloud-gatewaycloud:gateway:discovery:locator:enabled: true # 開啟從注冊中心獲取動態路由的功能。利用微服務名進行路由。routes:- id: payment_routh1 # 路由的id 沒有固定規則但是要求唯一 配合服務名稱# uri: http://localhost:8001 # 匹配后提供服務的路由地址uri: lb://cloud-payment-service # 根據服務名進行路由predicates:- Path=/payment/get/** # 路徑像匹配的進行斷言~- id: payment_routh2 # 路由的id 沒有固定規則但是要求唯一 配合服務名稱# uri: http://localhost:8001 # 匹配后提供服務的路由地址uri: lb://cloud-payment-servicepredicates:- Path=/payment/lb/** # 路徑像匹配的進行斷言~# 新增斷言配置# https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories- After=2020-12-13T11:37:03.340+08:00[Asia/Shanghai] # 必須在這個時間之后# - Cookie=username, adorable # 測試 curl --cookie "username=adorable" localhost:9527/payment/lb# - Header=X-Request-Id, \d+ # 屬性必須是整數 curl --header "X-Request-Id:99" localhost:9527/payment/lb# - Query=age # curl localhost:9527/payment/lb?age=19# - Host=**.adorable.cn,**.adorable.top # curl localhost:9527/payment/lb -H "host:bitqian.lovely.adorable.top"# gateway 入駐eureka~ eureka:instance:hostname: cloud-gateway-serviceclient:service-url:register-with-eureka: truefetch-registry: truedefaultZone: http://eureka7001.com:7001/eureka支持自定義過濾器
package top.bitqian.springcloud.filter;import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono;import java.util.Date;/*** 網關自定義過濾器配置* 官方有兩種過濾器, 單一的和全局的。* @author echo lovely* @date 2020/12/13 14:37*/@Component @Slf4j public class MyGatewayFilter implements GlobalFilter, Ordered { // global filter...@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("=======================gateway進來了======" + new Date());// 獲取到請求中的參數String username = exchange.getRequest().getQueryParams().getFirst("username");if (username == null) {log.info("/(ㄒoㄒ)/~~ 用戶名為空了,非法的用戶名稱......");// 406 不被服務器接受的exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);// 返回monoreturn exchange.getResponse().setComplete();}// 放行return chain.filter(exchange);}@Overridepublic int getOrder() {// 數字越小, 越優先return 0;} }總之網關作為分布式,微服務架構 在安全,限流,日志記錄方面具有強大的功能。
總結
以上是生活随笔為你收集整理的gateway路由网关,zuul的替代品的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wdcp mysql密码_wdcp默认的
- 下一篇: C# 读写json文件