微服务-网关
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具