概述

网关本质上是一个提供各种服务访问的入口,并提供服务接受与转发所有内外部的客户端调用,以及权限认证和限流控制.

Spring Cloud Gateway

Spring Cloud Gateway是Spring公司开发的网关组件,用于为微服务架构提供简单有效的API入口,服务于请求路由,组合以及协议转换,并基于Filter链的方式提供了权限验证,监控和限流功能.

使用入门

引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>

添加配置

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: sac-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8848
  10. gateway: #微服务网关配置
  11. routes: #网关路由的定义
  12. - id: router01 #名称唯一即可
  13. uri: http://localhost:8081/ #定义请求转发的uri
  14. predicates: #请求逻辑设计
  15. - Path=/nacos/provider/echo/**
  16. filters: #过滤规则定义,当predicates返回值为true则执行filter
  17. - StripPrefix=1 #StripPrefix表示去掉访问路径path中的第几层目录,这里为第一层及nacos
  18. logging:
  19. level:
  20. org.springframework.cloud.gateway: debug
  • routes:定义网关路由
  • id:路由唯一标识
  • uri:定义请求转发的uri
  • predicates:请求逻辑设计,断言(谓词)的作用是进行条件判断,只有断言都返回真,才会执行路由。
  • Path:伪装路径
  • filters:过滤规则定义,当predicates返回值为true则执行filter
  • StripPrefix:表示去掉访问路径path中的第几层目录

    创建启动类

    ```java @SpringBootApplication public class GatewayApplication { public static void main(String[] args) {
    1. SpringApplication.run(GatewayApplication.class, args);
    } }
  1. <a name="k4uEi"></a>
  2. ## 网关负载均衡实现
  3. <a name="DmIMR"></a>
  4. ### 添加依赖
  5. ```xml
  6. <dependency>
  7. <groupId>com.alibaba.cloud</groupId>
  8. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  9. </dependency>

修改配置文件

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: sac-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8848
  10. gateway: #微服务网关配置
  11. discovery:
  12. locator:
  13. enabled: true #开启通过服务注册中心的serviceId创建路由
  14. routes: #网关路由的定义
  15. - id: router01 #名称唯一即可
  16. #uri: http://localhost:8081/ #定义请求转发的uri
  17. uri: lb://sca-provider
  18. predicates: #请求逻辑设计
  19. - Path=/nacos/provider/echo/**
  20. filters: #过滤规则定义,当predicates返回值为true则执行filter
  21. - StripPrefix=1 #StripPrefix表示去掉访问路径path中的第几层目录,这里为第一层及nacos
  22. logging:
  23. level:
  24. org.springframework.cloud.gateway: debug

gateway为微服务网关配置.

discovery.locator.enabled=true:开启通过服务注册中心的serviceId创建路由
uri: lb://sca-provider:lb为服务前缀(负载均衡单词的缩写)
配置文件中routes表示定义网关路由,id为网关路由的唯一标识,
uri为请求转发的地址,lb://sca-provider其中lb表示负载均衡服务器,sca-provider为服务名称,所以lb://sca-provider针对负载均衡服务名sca-provider进行负载均衡配置.
predicates为谓词或称之为断言,设置请求逻辑,即请求网关路由地址的路由设置,只有当访问网关时加上此路由才会网关才会将请求转发至指定服务器.
filters用于定义过滤规则,StriPrefix为过滤器,表示过滤掉第几层目录.
fileters定义的过滤规则为局部过滤器,只可以过滤所在API的请求.
全局定义需要使用webflux.

断言Predicate

具体查看官方文档:https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/#gateway-request-predicates-factories
示例:

  1. server:
  2. port: 9000
  3. spring:
  4. application:
  5. name: sac-gateway
  6. cloud:
  7. nacos:
  8. discovery:
  9. server-addr: localhost:8848
  10. gateway: #微服务网关配置
  11. discovery:
  12. locator:
  13. enabled: true #开启通过服务注册中心的serviceId创建路由
  14. routes: #网关路由的定义
  15. - id: router01 #名称唯一即可
  16. #uri: http://localhost:8081/ #定义请求转发的uri
  17. uri: lb://sca-provider
  18. predicates: #请求逻辑设计
  19. - Path=/nacos/provider/echo/**
  20. - Method=GET #匹配GET请求
  21. filters: #过滤规则定义,当predicates返回值为true则执行filter
  22. - StripPrefix=1 #StripPrefix表示去掉访问路径path中的第几层目录,这里为第一层及nacos
  23. logging:
  24. level:
  25. org.springframework.cloud.gateway: debug

其中断言Predicates下的Method用于匹配请求方法,示例中表示只匹配GET方法,其他请求将会被网关拦截

  • Before匹配发生在指定 之前时间段的请求:例如Before=2017-01-20T17:42:47.789-07:00[America/Denver]表示只匹配美国丹佛时间2017年1月20号17点42分47秒的请求.
  • After匹配发生在指定 之后时间段的请求
  • Between谓词工厂有两个参数datetime1和datetime2 。此谓词匹配发生在 之后datetime1和之前的请求datetime2。该datetime2参数必须是datetime1之后.

例如:Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]

网关限流实现

  1. 添加依赖

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    4. </dependency>
    5. <!--使用sentinel网关服务-->
    6. <dependency>
    7. <groupId>com.alibaba.cloud</groupId>
    8. <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    9. </dependency>
  2. 配置文件

    1. sentinel:
    2. transport:
    3. dashboard: localhost:8180 #Sentinel 控制台地址
    4. port: 8719 #客户端监控API的端口
    5. eager: true #取消Sentinel控制台懒加载,即项目启动即连接
  3. 添加启动sentinel的jvm参数

    1. -Dcsp.sentinel.app.type=1

    image.png
    打开sentinel后显示界面如下图:
    image.png
    网关的流控规则配置在流控规则界面中,若想为指定路由新增流控规则需要设置路由id,且路由id需要与配置文件中的路由id匹配.
    image.png
    网关中限流可以针对请求属性进行设置.
    可以针对参数属性ip,端口号,请求头,url参数以及cookie进行设置,添加之后带有这些指定参数的请求将会被拦截.
    自定义网关流控返回值.