当前位置:   article > 正文

springcloud+nacos+gateway案例_springcloud gateway nacos

springcloud gateway nacos

一、先搭建好springcloud+nacos项目

地址:https://javazhong.blog.csdn.net/article/details/128899999

二、spring cloud gateway简述

Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上,目标是提供一个简洁、高效的API网关,同时也可以快速的拼装上Spring Cloud全家桶的API网关。

Spring Cloud Gateway的通信框架使用的是Netty

2.1 spring cloud gateway特征

  • 基于Spring Framework 5, Project Reactor, Spring Boot 2.0构建

  • 能够自由设置任何请求属性的路由

  • 路由可以自由设置断言(Predicates)和过滤器(Filter)

  • 可集成熔断器

  • 流量限速

  • 路径重写(rewrite)

三、spring cloud gateway网关作用

3.1 访问示意图

3.2 解释

增加了API网关以后(gateway),在API网关层可以把后端的多个服务进行整合,然后提供一个唯一的业务接口,客户端只需要调用这个接口就可以完成数据的获取和展示。而且,官网不只是做请求转发和服务整合。有了统一的网关入口以后,它还可以提供统一鉴权、限流、日志、熔断,以及统一错误码处理,针对后端多种不同协议,还可以进行协议转化

四、spring cloud流程介绍

4.1 spring cloud流程图

4.2 流程介绍

  1. 客户端发送请求给gateway

  1. 请求首先被HttpWebHandlerAdapter进行提取组装成网关上下文,

  1. 然后网关的上下文会传递到DispatcherHandler进行请求处理(DispatcherHandler是所有请求的处理分发器)

  1. DispatcherHandler负责将所有的请求分发给对应的处理器

  1. 比如分发给RoutePredicateHandlerMapping(路由断言处理映射器),路由断言映射器主要作用是进行路由查找,以及找到路由以后返回给对应的FilterWebHandler

  1. FilterWebHandler主要负责组装Filter链,并调用Filter执行一系列的Filter操作

  1. 然后再把请求转到后端对应的代理服务处理

  1. 处理完毕之后将Response返回到Gateway客户端

4.3 核心介绍

4.3.1 Filter过滤器

使用过滤器,可以在请求被路由之前或者之后对请求进行修改

过滤器按照请求和响应可以分为两种:Pre类型Post类型

Pre类型:在请求转发到微服务之前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出、协议转换等操作

Post类型:微服务处理完请求后,返回响应给网关,网关可以再次进行处理,例如可以修改响应内容、响应头、日志输出、流量监控等

按照过滤器Filter作用范围划分

GlobaFilter:全局过滤器,应用在所有路由上的过滤器

GatewayFilter:局部过滤器,应用在单个路由或一组路由上的过滤器

4.3.2 Route(路由)

构建网关的基础模块,由ID,目标URL,过滤器等组成

4.3.3 Predicate(断言)

开发人员可以匹配HTTP请求中的内容(请求头和请求参数),如果请求断言则进行路由

4.4 核心思想

路由转发+执行过滤器链

当用户发送请求达到Gateway之后,会通过一些匹配条件,定位到真正的服务节点,并且在这个过程的转发前后,进行一些细粒度控制,其中Predicate(断言)是我们的匹配条件,Filter是一个拦截器,有了这两点,再加上URL,就可以实现一个具体的路由。

五、源码实现

按照上一篇springcloud+nacos项目,创建一个gateway模块

https://javazhong.blog.csdn.net/article/details/128899999

5.1 pom代码

  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"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <artifactId>obwt-cloud</artifactId>
  7. <groupId>com.obwt</groupId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <groupId>com.gateway</groupId>
  11. <artifactId>gateway-cloud</artifactId>
  12. <version>0.0.1-SNAPSHOT</version>
  13. <name>gateway-cloud</name>
  14. <description>gateway-cloud</description>
  15. <properties>
  16. <java.version>1.8</java.version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.mybatis.spring.boot</groupId>
  29. <artifactId>mybatis-spring-boot-starter</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>com.alibaba</groupId>
  33. <artifactId>druid-spring-boot-starter</artifactId>
  34. </dependency>
  35. <!--mysql-connector-java-->
  36. <dependency>
  37. <groupId>mysql</groupId>
  38. <artifactId>mysql-connector-java</artifactId>
  39. </dependency>
  40. <!--jdbc-->
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-jdbc</artifactId>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework.boot</groupId>
  47. <artifactId>spring-boot-devtools</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.projectlombok</groupId>
  51. <artifactId>lombok</artifactId>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.springframework.boot</groupId>
  55. <artifactId>spring-boot-starter-test</artifactId>
  56. <scope>test</scope>
  57. </dependency>
  58. <!--nacos-->
  59. <dependency>
  60. <groupId>com.alibaba.cloud</groupId>
  61. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  62. </dependency>
  63. <dependency>
  64. <groupId>com.alibaba.cloud</groupId>
  65. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  66. </dependency>
  67. <!--bootstrap 启动器-->
  68. <dependency>
  69. <groupId>org.springframework.cloud</groupId>
  70. <artifactId>spring-cloud-starter-bootstrap</artifactId>
  71. </dependency>
  72. <!-- mybatis-plus -->
  73. <dependency>
  74. <groupId>com.baomidou</groupId>
  75. <artifactId>mybatis-plus-boot-starter</artifactId>
  76. </dependency>
  77. <dependency>
  78. <groupId>com.baomidou</groupId>
  79. <artifactId>mybatis-plus-core</artifactId>
  80. </dependency>
  81. <dependency>
  82. <groupId>com.baomidou</groupId>
  83. <artifactId>mybatis-plus-extension</artifactId>
  84. </dependency>
  85. <dependency>
  86. <groupId>com.alibaba</groupId>
  87. <artifactId>fastjson</artifactId>
  88. </dependency>
  89. <!--openfeign-->
  90. <dependency>
  91. <groupId>org.springframework.cloud</groupId>
  92. <artifactId>spring-cloud-starter-openfeign</artifactId>
  93. </dependency>
  94. <!-- SpringCloud Lo
  95. adbalancer -->
  96. <dependency>
  97. <groupId>org.springframework.cloud</groupId>
  98. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  99. </dependency>
  100. <!--gateway-->
  101. <dependency>
  102. <groupId>org.springframework.cloud</groupId>
  103. <artifactId>spring-cloud-starter-gateway</artifactId>
  104. </dependency>
  105. <!-- SpringCloud Alibaba Sentinel Gateway -->
  106. <!-- <dependency>-->
  107. <!-- <groupId>com.alibaba.cloud</groupId>-->
  108. <!-- <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>-->
  109. <!-- </dependency>-->
  110. </dependencies>
  111. <build>
  112. </build>
  113. </project>

5.2 bootstrap代码

  1. server:
  2. port: 8005
  3. spring:
  4. main:
  5. web-application-type: reactive #用于显示请求特定类型的Web应用程序标志,如果未设置,就会根据路径自行检测
  6. application:
  7. name: gateway-cloud-service
  8. profiles:
  9. active: dev
  10. cloud:
  11. nacos:
  12. discovery:
  13. server-addr: 192.168.139.128:8848
  14. group: LOCAL_GROUP
  15. service: ${spring.application.name}
  16. config:
  17. file-extension: yaml
  18. group: LOCAL_GROUP
  19. server-addr: 192.168.139.128:8848
  20. #网关配置
  21. gateway:
  22. routes:
  23.                 - id: baidu
  24. uri: http://www.baidu.com
  25. predicates: #当请求的路径包含url=baidu的时候,指向http://www.baidu.com
  26. - Query=url,baidu
  27. - id: userInfo #这个id只要保证唯一就好
  28. uri: lb://bms-cloud-service #负载均衡 lb 是负载均衡的缩写,在注册中心找叫做bms-cloud-service服务
  29. predicates: #设置路由断言
  30. - Path=/user/** #设置路由断言,当请求包含了/user开头的接口时进行转发,比如/user/Info的时候,这条路由会生效,会去找bms-cloud-service服务上的/user/info接口
  31. - id: copeInfo #这个id只要保证唯一就好
  32. uri: http://localhost:8001 #这种方式是直接定死的静态路由,当请求localhost:8005/test的时候会转发给localhost:8001/test
  33. predicates:
  34. - Path=/test
  35. - id: testBms #这个id只要保证唯一就好
  36. uri: lb://bms-cloud-service
  37. predicates:
  38. - Path=/api/test/**
  39. filters:
  40. #将跳转路径中包含的"api"替换成空,在请求的时候必须带上api,但是在对应的服务(bms-cloud-service)转接口的时候不需要有api
  41. - RewritePath=/api/(?<segment>.*),/$\{segment}
  42. - id: bms #这个id只要保证唯一就好
  43. uri: lb://bms-cloud-service
  44. predicates:
  45. - Path=/bms/**

5.3 controller测试代码

bms-cloud-service服务上对应的controller层测试代码

测试的时候要启动gateway-cloud-service模块和bms-cloud-service模块,但是入口就是gateway模块

  1. @RestController
  2. public class TestController {
  3. @GetMapping("/api/test")
  4. public String test() {
  5. return "bms的api的test";
  6. }
  7. @GetMapping("/api/test/22")
  8. public String test22() {
  9. return "bms的api的test22";
  10. }
  11. @GetMapping("/test")
  12. public String test1() {
  13. return "bms的test1";
  14. }
  15. @GetMapping("/test/test2")
  16. public String testTest() {
  17. return "bms的test2";
  18. }
  19. @GetMapping("/userInfo")
  20. public String userInfo() {
  21. return "bms的userInfo";
  22. }
  23. @GetMapping("/userInfo/user")
  24. public String userInfoUser() {
  25. return "bms的userInfo2";
  26. }
  27. @GetMapping("/user/userInfo")
  28. public String user() {
  29. return "bms的userInfo3";
  30. }
  31. @GetMapping("/user/userInfo2")
  32. public String user2() {
  33. return "bms的userInfo4";
  34. }
  35. }

六、配置拓展

  1. - id: bms #这个id只要保证唯一就好
  2. uri: lb://bms-cloud-service

断言

实例

说明

Path

- Path=/api/bms/**

请求路径于/api/bms/**匹配时,该请求才能转发到bms-cloud-service服务上,比如localhost:8005/api/bms/user,那么会自动去寻找bms-cloud-service服务上的/api/bms/user接口

Before

- Before=2023-01-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒之前请求,才会转发到bms-cloud-service服务上

After

- After=2023-01-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒之后请求,才会转发到bms-cloud-service服务上

Between

- Between=2023-01-01T08:29:59.100+08:00[Asia/Shanghai],

2023-02-01T08:29:59.100+08:00[Asia/Shanghai]

在2023年01月01日08是29分59.100秒至在2023年02月01日08是29分59.100秒之间请求,才会转发到bms-cloud-service服务上

Cookie

- Cookie=name,bmsservice.cc

携带Cookie且Cookie内容为name=bmsservice.cc的请求,才会转发到bms-cloud-service服务上

Header

- Header=X-Request-ld,\d+

请求头上携带属性X-request-ld,且属性值为整数的请求,才会转发到bms-cloud-service服务上

Method

- Method=GET

只有GET请求才会被转发到bms-cloud-service服务上

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57428
推荐阅读
相关标签
  

闽ICP备14008679号