学习Spring Cloud Gateway之前,先了解清楚什么事API Gateway。API Gateway本身也是一种服务,它负责将外部的请求路由到其他内部服务,客户端不必再关心各种复杂的服务,不需要再在客户端进行各种API组合。例如,订单详情,它可能不仅需要从订单服务获取信息,也可能需要从配送服务请求需要的数据。那么客户端需要请求这两个服务查询信息,需要知道两个服务的请求地址。服务发生变动,客户端也要进行修改。如果服务越来越多,客户端需要维护更多的信息。有了API Gateway就能很好的解决这个问题。
一、准备工作
假设现在有两个服务,分别是demo-provider-hello
和demo-provider-say
,现需要通过Gateway服务配置路由以及其他边缘功能(身份验证、访问授权、速率限制、缓存、指标收集、请求日志等)。这两个服务的bootstrap.yml配置如下:
demo-provider-hello
server:
port: 8081
servlet:
context-path: /h
spring:
application:
name: demo-provider-hello
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
提供了服务接口:
@RestController
public class HelloController {
@GetMapping("hello")
public String hello() {
return "Hello world!";
}
}
demo-provider-say
server:
port: 8082
servlet:
context-path: /s
spring:
application:
name: demo-provider-say
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
提供了服务接口:
@RestController
public class SayController {
@GetMapping("say")
public String say() {
return "I'm Mr Chou!";
}
}
二、创建API Gateway服务
1. 在IDE中创建demo-gateway模块:
2. 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.1</version>
</dependency>
<!-- Gateway需要负载到其他服务,所以必须添加 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.1</version>
</dependency>
3. 开始配置路由
在bootstrap.yml中进行如下配置:
server:
port: 8888
spring:
application:
name: demo-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
gateway:
discovery:
locator:
enabled: true
routes:
- id: hello # 保证唯一
uri: lb://demo-provider-hello # 要路由的服务,lb://后为服务名称
predicates: # 断言规则
- Path=/h/** # 匹配请求路径为/first开头的url
- Method=GET # 匹配请求方法为GET
- id: say
uri: lb://demo-provider-say
predicates:
- Path=/s/**
- Method=GET
-
id
:为路由唯一标识 -
uri
:要路由的服务,lb://表示启用负载均衡,否则直接配置http://[host]:[port]即可 -
predicates
:断言规则,主要是为了匹配请求,如果断言规则全部匹配,则会被路由到该服务。
常用的断言还有其他的,如:Before、After、Between、Cookie、Header等。
4. 开始运行
启动三个服务:
- 通过gateway服务访问hello接口:
- 通过gateway服务访问say接口:
路由配置成功。
三、结语
上面说了动态路由的断言,没有提到过滤器,其实学会了断言,过滤器配置起来也很简单。在工作使用时,根据业务需求进行配置。