微服务-网关

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
posted @ 2023-06-09 10:42  谭五月  阅读(41)  评论(0)    收藏  举报