文章目录
- After断言工厂
- Before 断言工厂
- Between断言工厂
- Cookie 断言工厂
- Header断言工厂
- Host 断言工厂
- Method 断言工厂
- Path 断言工厂
- Query 断言工厂
- RemoteAddr 断言工厂
- Weight 断言工厂
- AddRequestHeaderGatewayFilterFactory
- AddRequestParameterGatewayFilterFactory
- AddResponseHeaderGatewayFilterFactory
- StripPrefixGatewayFilterFactory
- RewritePathGatewayFilterFactory
- RetryGatewayFilterFactory
- HystrixGatewayFilterFactory
项目版本
1、jdk:1.8
2、springboot 2.1.6.RELEASE ,springcloud Greenwich.SR6
前言
网关提供 API 全托管服务,丰富的 API 管理功能,辅助企业管理大规模的 API ,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略( WAF )、防刷、流量、监控日志等功能。一般来说,网关对外暴露的 URL 或者接口信息,我们统称为路由信息。网关的核心是Filter 和 Filter Chain(过滤器链)
Spring Cloud Gateway 是什么
Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,旨在取代Zuul网关。关于zuul可查看springcloud 入门(6) 网关 zuul
Spring Cloud Gateway是Spring Cloud官方基于Spring 5、Spring Boot 2 和 Project Reactor等技术开发的网关,旨在提供一种简单而有效的方式来路由到 API 并为它们提供交叉关注点,例如:安全性、监控/指标和弹性。
术语
路由(Route):网关的基本构建块。 它由 ID、目标 URI、断言集合和过滤器集合定义。 如果断言为真,则路由匹配成功。
断言(Predicate):Java 8 断言函数。 输入类型是 Spring 框架的ServerWebExchange。 可以匹配来自 HTTP 请求的任何内容,例如请求头或参数。
过滤器(Filter):使用特定工厂构建的 GatewayFilter 实例。 通过Filter可以在发送下游请求之前或之后修改请求和响应。
Spring Cloud Gateway 工作流程
流程图,来自官网
客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web Handler处理程序。此处理程序通过特定于请求的过滤器链运行请求。过滤器被虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。执行所有“pre”类型过滤器逻辑,然后进行代理请求,发出代理请求后,将运行“post”类型过滤器逻辑。
入门示例
入门小样
**注意: 在没有端口的路由中 ,HTTP 和 HTTPS 默认的端口分别是80 和 443。 Spring Cloud Gateway 启动容器目前只支持netty
**
1、创建cloud-gateway springboot项目,引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2、修改配置文件
添加日志和监控
server.port=7201 spring.application.name=CLOUD-GATEWAY # 日志配置 logging.level.org.springframework.cloud.gateway=trace logging.level.org.springframework.http.server.reactive=debug logging.level.org.springframework.web.reactive=debug logging.level.reactor.netty=debug # actuator 监控 http://localhost:7201/actuator/gateway/routes management.endpoints.web.exposure.include=*
3、配置路由信息
配置路由信息有两种方式:
3.1 通过配置类
@Configuration public class RouteLocatorConfig { @Bean public RouteLocator routeLocator(RouteLocatorBuilder locatorBuilder){ final RouteLocatorBuilder.Builder routes = locatorBuilder.routes(); routes.route(baidu-> baidu.path("/qq_39654841").uri("http://blog.csdn.net/").id("my_csdn_route")); return routes.build(); } }
3.2 在配置文件中配置
# 路由配置 spring.cloud.gateway.routes[0].id=my_csdn_route spring.cloud.gateway.routes[0].uri=http://blog.csdn.net/ spring.cloud.gateway.routes[0].predicates[0]=Path=/qq_39654841
4、测试
不管选择哪种方式,访问http://localhost:7201/qq_39654841,会跳到https://blog.csdn.net/qq_39654841页面
前面引入了actuator,通过访问http://localhost:7201/actuator/gateway/routes可以看到所有路由信息
路由发现
Spring Cloud Gateway 路由发现规则在不同的注册中心也有所不同:
- 如果把Gateway 注册到Eureka 上,通过网关转发服务调用,访问网关的URL是http://Gateway_HOST:Gateway_port/大写serviceld /*,其中服务名默认必须是大写,否则会抛404错误,如果服务名要用小写访问,可以在属性配置文件里面加spring.cloud .gateway.discovery .locator.lowerCaseServiceld =true配置解决。
- 如果把Gateway 注册到Zookeeper 上,通过网关转发服务调用,服务名默认小写,因此不需要做任何处理。
- 如果把Gateway 注册到Consul 上,通过网关转发服务调用,服务名默认小写,也不需要做人为修改。
路由发现示例
示例使用eureka作为注册中心,有关eureka可以查看 springcloud 入门(1) eureka注册中心
1、在cloud-gateway引入eureka依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2、修改cloud-gateway配置文件
添加eureka、日志配置
# 此客户端是否应该从eureka server 获取eureka注册信息 eureka.client.register-with-eureka=true eureka.instance.instance-id=cloud-gateway # 和eureka服务器通讯的URL eureka.client.service-url.defaultZone=http://eurekaUser:eurekaUserPassword@localhost:8001/eureka # 在地址栏上使用 IP 地址进行显示 eureka.instance.prefer-ip-address=true # 设置心跳的时间间隔(默认是30秒) eureka.instance.lease-renewal-interval-in-seconds=15 # eureka server 最后一次收到心跳时等待的时间,超时将会移除client(默认是90秒) eureka.instance.lease-expiration-duration-in-seconds=90 # 日志配置 logging.level.org.springframework.cloud.gateway=debug logging.level.org.springframework.http.server.reactive=debug logging.level.org.springframework.web.reactive=debug logging.level.reactor.netty=debug # 是否与服务发现组件相结合,通过serviceId 转发到具体的实例 spring.cloud.gateway.discovery.locator.enabled=true # 注册中心为eureka时,设置为true表示开启用小写的serviceId 进行服务路由的转发 spring.cloud.gateway.discovery.locator.lower-case-service-id=true
eureka-server做了安全处理,可参考springcloud 入门(10) Spring Security 安全与权限 ,没有做处理的可以不用账号密码。
3、eureka-consumer在之前的基础上添加测试方法
@RequestMapping("/consumer/feign") @RestController public class FeignController { @GetMapping("/gateway/request") public String getRequest(HttpServletRequest request){ final String header = request.getHeader("request-arg"); System.out.println(header); return "request"; } }
4、测试
分别启动eureka-server、eureka-consumer、cloud-gateway
访问 http://localhost:7201/eureka-consumers/consumer/feign/gateway/request,出现下面页面成功调用eureka-consumer。
当Spring Cloud Gateway 注册到eureka时,会自动发现服务并生成默认的路由规则
可以通过cloud-gateway控制台发现
或者访问http://localhost:7201/actuator/gateway/routes
{ "route_id": "CompositeDiscoveryClient_EUREKA-CONSUMERS", "route_definition": { "id": "CompositeDiscoveryClient_EUREKA-CONSUMERS", "predicates": [ { "name": "Path", "args": { "pattern": "/eureka-consumers/**" } } ], "filters": [ { "name": "RewritePath", "args": { "regexp": "/eureka-consumers/(?<remaining>.*)", "replacement": "/${remaining}" } } ], "uri": "lb://EUREKA-CONSUMERS", "order": 0 }, "order": 0 },
如果把spring.cloud.gateway.discovery.locator.lower-case-service-id改成false
# 注册中心为eureka时,设置为true表示开启用小写的serviceId 进行服务路由的转发 spring.cloud.gateway.discovery.locator.lower-case-service-id=false
路由变成了大写的
{ "route_id": "CompositeDiscoveryClient_EUREKA-CONSUMERS", "route_definition": { "id": "CompositeDiscoveryClient_EUREKA-CONSUMERS", "predicates": [ { "name": "Path", "args": { "pattern": "/EUREKA-CONSUMERS/**" } } ], "filters": [ { "name": "RewritePath", "args": { "regexp": "/EUREKA-CONSUMERS/(?<remaining>.*)", "replacement": "/${remaining}" } } ], "uri": "lb://EUREKA-CONSUMERS", "order": 0 }, "order": 0 },
再访问 http://localhost:7201/eureka-consumers/consumer/feign/gateway/request,就会出现404页面