Gateway(微服务网关:路由转发、权限校验、限流控制)扫盲知识
SpringCloud Gateway是什么SpringCloud Gateway使用的webflux中的reactor-netty响应式编程组件,底层使用了netty通讯框架.SpringCloud Gateway特性SpringCloud Gateway和Zuul的区别Zuul1.x模型缺点:SpringCloud Gateway是基于WebFlux框架实现的,俺么WebFlux框架是什么?G
·
-
SpringCloud Gateway是什么
SpringCloud Gateway使用的webflux中的reactor-netty响应式编程组件,底层使用了netty通讯框架.
-
SpringCloud Gateway特性
-
SpringCloud Gateway和Zuul的区别
-
Zuul1.x模型
缺点:
-
SpringCloud Gateway是基于WebFlux框架实现的,那么WebFlux框架是什么?
-
GateWay的三大概念
图片引用链接 -
GateWay的核心逻辑和工作流程
核心逻辑: 路由转发+ 执行过滤器链
工作流程:
-
网关路由的配置方式
-
在配置文件yml中配置(简单)
server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由 # 路由是有id、uri、predicate(断言)、一系列filter(过滤器)组成 routes: - id: payment_routh # 路由的id,没有固定规则但是要求唯一,建议配合服务名 # localhost:9527即调用该微服务,比如localhost:9527/payment/get/1即调用localhost:8001/payment/get/1或者localhost:8002/payment/get/1 uri: lb://cloud-payment-service # lb://表示基于服务注册的负载均衡 # uri: http://localhost:8001 # 匹配后提供服务的路由地址(手动执行服务实例,太笨拙) predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由 - id: payment_routh2 uri: lb://cloud-payment-service # lb://表示基于服务注册的负载均衡 # uri: http://localhost:8002(手动执行服务实例,太笨拙) predicates: - Path=/payment/lb/** # - After=2020-12-05T14:35:53.747+08:00[Asia/Shanghai] # 在这个时间点之后该路由才生效 # - Before=2020-12-05T15:35:53.747+08:00[Asia/Shanghai] # 在这个时间点之前该路由才生效 # - Between=2020-12-05T15:35:53.747+08:00[Asia/Shanghai],2020-12-31T15:35:53.747+08:00[Asia/Shanghai] # 在这个时间点之间该路由才生效 # - Cookie=username,zzyy # cookie键值对,只有带上cookie才能使用网关,否则404 # - Method=GET # get方法才允许访问 # - Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为正数的正则表达式 # - Query=username, \d+ # 要有参数名username并且值是正数才能路由 # - Host=**.atguigu.com # 限制主机名 eureka: instance: hostname: cloud-gateway-service client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
-
代码中注入RouteLocator的Bean
@Configuration public class GateWayConfig { /** * 配置一个id为path_route_atguigu的路由规则 * 当访问防止http://localhost:9527/guonei将会自动转发到地址http://news.baidu.com/guonei * @param routeLocatorBuilder * @return */ @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){ RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); routes.route("path_route_atguigu", r -> r.path("/guonei").uri("http://news.baidu.com/guonei")).build(); return routes.build(); } }
-
GateWay的Filter使用
package com.atguigu.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; @Component @Slf4j public class MyLogGateWayFilter implements GlobalFilter, Ordered{ @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("********come in MyLogGateWayFilter: " + new Date()); String uname = exchange.getRequest().getQueryParams().getFirst("uname"); if(uname == null){ log.info("********用户名为null,非法用户"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } // 过滤器链续传下去 return chain.filter(exchange); } @Override // 加载过滤器的顺序,值越小,级别越高 public int getOrder() { return 0; } }
更多推荐
已为社区贡献2条内容
所有评论(0)