微服务-网关
1、依赖:nacos服务发现,gateway
<!-- 网关也是一个微服务,需要引入服务发现依赖,随后配置Nacos地址注册 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、配置:路由ID,路由目标,路由断言,路由过滤器
spring:
cloud:
gateway:
routes:
- id: route_1 # 路由标识,唯一即可
uri: lb://document-service # 路由的目标地址
predicates: # 路由断言,判断请求是否符合规则
- Path=/api/document/** # 路径断言,判断路径是否以/document开头,若符合,请求将被路由到 document-service 微服务
- id: route_2
uri: lb://user-service
predicates:
- Path=/api/user/**
3、路由断言工厂:RoutePredicate Factory
Spring 提供了11种基本的路由断言工厂,如果接收到的请求不符合所配置的任何一种路由规则,则返回请求发送方404错误
| 名称 | 说明 | 示例 |
|---|---|---|
| After | 必须是某个时间点之后的请求 | - After=2022-01-20T17:42:47.789-07:00[America/Denver] |
| Before | 必须是某个时间点之前的请求 | -Before=2031-04-13T15:14:45.433+08:00[Asia/Shanghai] |
| Between | 必须是某两个时间点之间的请求 | -Between=2022-01-20T17:42:47.789-07:00[America/Denver], 2031-04-13T15:14:45.433+08:00[Asia/Shanghai] |
| Cookie | 请求必须包含某些cookie | -Cookie=chocolate, ch.p |
| Header | 请求必须包含某些header | - Header=X-Request-Id, \d+ |
| Host | 请求必须是访问某个host(域名) | - Host=ftp.somehost.org, www.anotherhost.org |
| Method | 请求方式必须是指定方式 | - Method=GET, POST |
| Path | 请求路径必须符合指定规则 | - Path=/document/{id}, /user/** |
| Query | 请求参数必须包含指定参数 | - Query=name, Jack 或者 -Query=name |
| RemoteAddr | 请求者的IP必须是指定范围 | - RemoteAddr=192.168.1.1/24 |
| Weight | 权重处理 | 无 |
4、过滤器工厂:GatewayFilter Factory
Spring提供了31种不同的路由过滤器工厂
| 名称 | 说明 |
|---|---|
| AddRequestHeader | 给当前请求添加一个请求头 |
| RemoveRequestHeader | 移除请求中的一个请求头 |
| AddResponseHeader | 给响应结果中添加一个响应头 |
| RemoveResponseHeader | 从响应结果中移除一个响应头 |
| RequestRateLimiter | 限制请求的流量 |
| ... | ... |
例如:给所有进入docuemnt-service的请求添加一个请求头:Truth=tanmujin is a handsome man!
spring:
cloud:
gateway:
routes:
- id: route_1
uri: lb://document-service
predicates:
- Path=/document/**
filters:
- AddRequestHeader=Truth, tanmujin is a handsome man!
默认过滤器:如果要对所有的路由都生效,则可以将过滤器工厂写到default下
spring:
cloud:
gateway:
default-filters:
- AddRequestHeader=Truth, tanmujin is a handsome man!
全局过滤器 GlobalFilter:全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的,而GlobalFilter的逻辑需要自己些代码实现。
网关的跨域问题
实践中,方案2较稳妥
方案1、在网关服务中做如下配置:
spring:
cloud:
gateway:
globalcors:
add-to-simple-url-handler-mapping: true #解决Options请求(浏览器发出的询问服务器是否允许跨域的这个请求)被拦截问题
cors-configurations:
'[/**]':
allowedOrigins:
- "http://localhost:8090"
- "http://www.tanmujin.com"
allowMethods:
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowHeaders: "*"
allowCredentials: true

浙公网安备 33010602011771号