介绍
Spring Cloud Gateway 根据请求的路径、HTTP 方法、头部等信息,将请求路由到对应的微服务实例。它支持基于动态路由规则的配置,可以根据请求的 URL、查询参数、请求头等条件,灵活地决定将请求转发到哪个微服务。Spring Cloud Gateway 提供了一个单一的入口点,所有来自客户端的请求都通过该网关进行转发。通过这种方式,外部应用无需直接访问各个微服务,提高了架构的可维护性和安全性。
网关也是一个微服务
依赖
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.4</version>
<!-- 对应 Spring Cloud 2021.0.4 版本 -->
</dependency>
其他配合依赖
xml
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.3</version> <!-- Spring Cloud OpenFeign 版本 -->
</dependency>
<!-- nacos 服务的注册发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.5.0</version>
</dependency>
配置文件
yml
server:
port: 80
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: 172.23.4.128:8848 #注册中心
路由配置
yml
server:
port: 80
spring:
application:
name: gateway #服务名称
cloud:
nacos:
server-addr: 172.23.4.128:8848 #注册中心
gateway:
routes:
- id: java-user #路由ID 一般为服务名称
uri: lb://java-user #转发的路径 lb为负载均衡 java-user为服务接口
predicates: #路由条件
- Path=/user/** #请求接口路径
# - Path=/user/**,/path/** 多个控制器这样写
- id: java-goods
uri: lb://java-goods
predicates:
- Path=/goods/**
这样就可以通过127.0.0.1:80/user/xxx/ 将请求负载均衡到其他微服务上了
路由属性
- id 路由的唯一标识符
- uri 路由的目标地址
- predicates 路由断言,判断请求是否符合当前路由。
- filter 路由过滤器,对请求或响应做特殊处理
路由断言
路由过滤器
添加请求头
token为请求头名称,123456为值
yml
gateway:
routes:
- id: java-user #路由ID 一般为服务名称
uri: lb://java-user #转发的路径 lb为负载均衡 java-user为服务接口
predicates: #路由条件
- Path=/user/** #请求接口路径
# - Path=/user/**,/path/** 多个控制器这样写
- id: java-goods
uri: lb://java-goods
predicates:
- Path=/goods/**
filters:
- AddRequestHeader=token,123456
如果微服务的接口很多,每个服务但需要去配置filters就特别麻烦,可以配置全局的请看下方。
微服务获取请求头
java
@GetMapping("/list")
public List<Goods> list(@RequestHeader("token") String token ){
System.out.println(token);
System.out.println("我被调用");
return goodsService.list();
}
全局过滤器
default-filters为全局的不需要一个个配置
yml
gateway:
routes:
- id: java-user #路由ID 一般为服务名称
uri: lb://java-user #转发的路径 lb为负载均衡 java-user为服务接口
predicates: #路由条件
- Path=/user/** #请求接口路径
# - Path=/user/**,/path/** 多个控制器这样写
- id: java-goods
uri: lb://java-goods
predicates:
- Path=/goods/**
default-filters:
- AddRequestHeader=token,123456