微服务 SpringCloud gateway服务网关

墨蓝 2022-10-26 04:58 346阅读 0赞

微服务 SpringCloud gateway服务网关

  • 微服务 SpringCloud gateway服务网关
    • 一、概述简介
      • 1、什么是gateway
      • 2、gateway使用场景
      • 3、gateway架构
      • 4、zuul与gateway区别
    • 二、三大核心概念
    • 三、gateway工作流程
    • 四、入门配置
      • 1、yml配置断言路由(推荐,简单明了)
      • 2、配置类配置断言路由
    • 五、Predicate使用
      • 1、Route Predicate Factories
      • 2、常用的Route Predicate
    • 六、Filter使用
      • 1、什么是Filter过滤器
      • 2、Filter的生命周期与种类
      • 4、常用的GatewayFilter
      • 5、自定义过滤器
    • 七、案例

微服务 SpringCloud gateway服务网关

一、概述简介

1、什么是gateway

官网地址:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
在这里插入图片描述

  1. Spring Cloud Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。

在这里插入图片描述

2、gateway使用场景

  1. 反向代理
  2. 鉴权
  3. 流量控制
  4. 熔断
  5. 日志监控
  6. ... ...

3、gateway架构

在这里插入图片描述

4、zuul与gateway区别

在这里插入图片描述springcloud gateway具有特性
在这里插入图片描述
在这里插入图片描述

二、三大核心概念

  1. 三大核心概念
  2. Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
  3. Predicate(断言):参考的是java8java.util.function.Predicate开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
  4. Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

在这里插入图片描述

三、gateway工作流程

官网gateway工作流程。
在这里插入图片描述

  1. gateway核心逻辑:路由转发+执行过滤器链

四、入门配置

gateWay配置的两种方式:1.yml文件,2.配置类

1、yml配置断言路由(推荐,简单明了)

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: cloud-gateway
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
  11. routes:
  12. - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  13. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  14. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  15. predicates:
  16. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  17. - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  18. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  19. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  20. predicates:
  21. - Path=/payment/lb/** # 断言,路径相匹配的进行路由
  22. #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
  23. #- Cookie=username,zzyy
  24. #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式

2、配置类配置断言路由

  1. /** * springcloud gateway配置类 * * @author zrj * @date 2021/2/2 * @since V1.0 **/
  2. @Configuration
  3. public class GatewayConfig {
  4. /** * 配置相当于在yml中配置了一个id为path_route_hello的路由规则 * 当访问地址http://localhost:9527/guonei的时候,gateway会通过断言是否为true * 匹配到对应的URI地址:http://news.baidu.com/guonei * * @param routeLocatorBuilder * @return */
  5. @Bean
  6. public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
  7. RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
  8. routes.route( "path_route_hello",
  9. r -> r.path( "/guonei" )
  10. .uri( "http://news.baidu.com/guonei" ) ).build();
  11. return routes.build();
  12. }
  13. }

五、Predicate使用

1、Route Predicate Factories

Route Predicate Factories:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
在这里插入图片描述

2、常用的Route Predicate

在这里插入图片描述

  1. 具体参考1中的官网案例
  2. 1.After Route Predicate:- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
  3. 2.Before Route Predicate:- Before=2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
  4. 3.Between Route Predicate - Between=2020-03-08T10:59:34.102+08:00[Asia/Shanghai] , 2020-03-08T10:59:34.102+08:00[Asia/Shanghai]
  5. 4. Cookie Route Predicate:- Cookie=username,zzyy
  6. 5. Header Route Predicate:- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
  7. 6.Host Route Predicate:- Host=**.hello.com
  8. 7.Method Route Predicate - Method=GET
  9. 8.Path Route Predicate:- Path=/payment/lb/** # 断言,路径相匹配的进行路由
  10. 9. Query Route Predicate: - Query=username, \d+ #要有参数名称并且是正整数才能路由

六、Filter使用

1、什么是Filter过滤器

GatewayFilter
在这里插入图片描述

2、Filter的生命周期与种类

在这里插入图片描述

4、常用的GatewayFilter

过滤器地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters
在这里插入图片描述

5、自定义过滤器

  1. implements GlobalFilter,Ordered

七、案例

git地址:https://github.com/zrj-coder/cloudboot3

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <parent>
  4. <artifactId>cloudboot3</artifactId>
  5. <groupId>com.hello.springcloud</groupId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. </parent>
  8. <modelVersion>4.0.0</modelVersion>
  9. <artifactId>cloud-gateway-gateway9527</artifactId>
  10. <dependencies>
  11. <!--gateway-->
  12. <dependency>
  13. <groupId>org.springframework.cloud</groupId>
  14. <artifactId>spring-cloud-starter-gateway</artifactId>
  15. </dependency>
  16. <!--eureka-client-->
  17. <dependency>
  18. <groupId>org.springframework.cloud</groupId>
  19. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  20. </dependency>
  21. <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  22. <dependency>
  23. <groupId>com.hello.springcloud</groupId>
  24. <artifactId>cloud-api-commons</artifactId>
  25. <version>${project.version}</version>
  26. </dependency>
  27. <!--一般基础配置类-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>
  45. </project>
  46. server:
  47. port: 9527
  48. spring:
  49. application:
  50. name: cloud-gateway
  51. cloud:
  52. gateway:
  53. discovery:
  54. locator:
  55. enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
  56. routes:
  57. - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  58. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  59. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  60. predicates:
  61. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  62. - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  63. #uri: http://localhost:8001 #匹配后提供服务的路由地址
  64. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  65. predicates:
  66. - Path=/payment/lb/** # 断言,路径相匹配的进行路由
  67. #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai]
  68. #- Cookie=username,zzyy
  69. #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式
  70. eureka:
  71. instance:
  72. hostname: cloud-gateway-service
  73. client: #服务提供者provider注册进eureka服务列表内
  74. service-url:
  75. register-with-eureka: true
  76. fetch-registry: true
  77. defaultZone: http://eureka7001.com:7001/eureka
  78. /** * 网关服务启动类 * * @author zrj * @date 2021/2/2 * @since V1.0 **/
  79. @EnableEurekaClient
  80. @SpringBootApplication
  81. public class GatewayApplication9527 {
  82. public static void main(String[] args) {
  83. SpringApplication.run( GatewayApplication9527.class, args );
  84. }
  85. }
  86. /** * springcloud gateway配置类 * * @author zrj * @date 2021/2/2 * @since V1.0 **/
  87. @Configuration
  88. public class GatewayConfig {
  89. /** * 配置相当于在yml中配置了一个id为path_route_hello的路由规则 * 当访问地址http://localhost:9527/guonei的时候,gateway会通过断言是否为true * 匹配到对应的URI地址:http://news.baidu.com/guonei * * @param routeLocatorBuilder * @return */
  90. @Bean
  91. public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder) {
  92. RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
  93. routes.route( "path_route_hello",
  94. r -> r.path( "/guonei" )
  95. .uri( "http://news.baidu.com/guonei" ) ).build();
  96. return routes.build();
  97. }
  98. }
  99. /** * 自定义过滤器 * * @author zrj * @date 2021/2/2 * @since V1.0 **/
  100. @Slf4j
  101. @Component
  102. public class MyLogGatewayFilter implements GlobalFilter, Ordered {
  103. @Override
  104. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  105. log.info( "***********come in MyLogGateWayFilter: " + new Date() );
  106. String uname = exchange.getRequest().getQueryParams().getFirst( "uname" );
  107. if (uname == null) {
  108. log.info( "*******用户名为null,非法用户,o(╥﹏╥)o" );
  109. exchange.getResponse().setStatusCode( HttpStatus.NOT_ACCEPTABLE );
  110. return exchange.getResponse().setComplete();
  111. }
  112. return chain.filter( exchange );
  113. }
  114. @Override
  115. public int getOrder() {
  116. return 0;
  117. }
  118. }
  119. ```java
  120. /** * 获取当前时间,带时区 * 用于配置断言 * * @author zrj * @date 2021/2/2 * @since V1.0 **/
  121. public class DateTime {
  122. public static void main(String[] args) {
  123. ZonedDateTime zbj = ZonedDateTime.now(); // 默认时区
  124. System.out.println( zbj );
  125. //2021-02-02T23:15:43.456+08:00[Asia/Shanghai]
  126. }
  127. }

发表评论

表情:
评论列表 (有 0 条评论,346人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务网Gateway

    使用场景 不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题: 客户