GateWay原理
1. 网关Gateway的基本组成
GateWay官网地址
中文官网
- Route:路由是GateWay最基础的组件,它包含一个ID,一个目标Url,一些断言集合,一些过滤器集合;如果断言成功的话,路由器就会被匹配
- Predicate:输入类型是 Spring Framework
ServerWebExchange
。这使您可以匹配HTTP请求中的所有内容,例如标头或参数。 - Filter:这些是使用特定工厂构造的 Spring Framework
GatewayFilter
实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
2. 工作原理
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。
3.Predicate的两种配置方式
-
快捷方式配置
快捷方式配置由过滤器名称识别,后跟一个等号(
=
),然后是由逗号分隔的参数值(,
)spring: cloud: gateway: routes: - id: after_route uri: https://example.org predicates: - Cookie=mycookie,mycookievalue
-
扩展方式配置
参数看起来更像带有名称/值对的标准Yaml配置。通常,将有一个
name
钥匙和一个args
钥匙,args
键是用于配置断言器或过滤器的键值对的映射spring: cloud: gateway: routes: - id: after_route uri: https://example.org predicates: - name: Cookie args: name: mycookie regexp: mycookievalue
-
properties 配置
server.port=8080 spring.application.name=api-gateway spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务。 spring.cloud.gateway.discovery.locator.enabled=true #是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了),比如以/service-hi/*的请求路径被路由转发到服务名为service-hi的服务上。 spring.cloud.gateway.discovery.locator.lower-case-service-id=true spring.cloud.gateway.routes[0].id=gateway-service spring.cloud.gateway.routes[0].uri=lb://service-provider spring.cloud.gateway.routes[0].predicates[0]=Path=/provider/**
4. Route Predicate Factories (路由断言工厂)
SpringCloudGateway将路由作为SpringWebFlux HandlerMapping基础设施的一部分进行匹配。SpringCloudGateway包含许多内置的路由断言工厂。所有这些断言都匹配HTTP请求的不同属性。可以将多个路由断言工厂与逻辑and语句组合在一起使用。
-
The After Route Predicate Factory
-
The Before Route Predicate Factory
-
The Between Route Predicate Factory
-
The Cookie Route Predicate Factory
-
The Header Route Predicate Factory
-
The Host Route Predicate Factory
-
The Method Route Predicate Factory
-
The Path Route Predicate Factory(基于请求路径的断言,也是用的最多一个)
weixin_39235623: 您好 我遇到了一个问题,就是在 eureka 集群中的服务并不能通过 feign 调用到 nacos 集群的服务,原因是从 nacos 中同步到 eureka 中的服务 discoveryClient.getInstances("xxx") 这里拿到 ServiceInstance 对象 的 hostName 并不是 ip 地址
是卿卿: 4.3.1 搭建同步服务的2,是在哪里配鸭,之前的eureka项目只有application.yml
独孤暮阳: 大佬,UserInterceptor 的checkToken方法是空的,公共模块使用openfeigh也不合适,那么怎么去网关做token校验呢
旺仔OO糖: 冲冲冲
旺仔OO糖: 对我很有帮助