简介
本人在工作中用到Spring Cloud Gateway作为网关服务为公司提供服务,它具体的优点有:集成了Netty,实现了非阻塞式的请求转发处理,采用WebFlux架构风格,有完善的各类内置filter,方便扩展和动态配置。以后会记录常用的一些配置,这一期记录的是简单的搭建和一个集转发、重写、限流、熔断的路由配置规则示例:
环境
- Idea2019
- Jdk1.8
- Maven3.6.3
简单搭建
首先要搭建一个Spring Cloud Gateway服务。
pom依赖配置
因为我的Gateway配置是在redis中的所以引入了Gateway和Redis如下依赖:1
2
3
4
5
6
7
8
9
10<!--gateway 网关依赖,内置webflux 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--redis依赖,为了读取路由配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
application.yml配置
指定对外端口号,并加上了Hystrix超时配置1
2
3
4
5
6
7
8
9
10server:
port: 8090
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 10000
启动类代码
启动类中加入@EnableCircuitBreaker注解以启用Hystrix1
2
3
4
5
6
7
8
9
public class AppserverGatewayBaseApplication {
public static void main(String[] args) {
SpringApplication.run(AppserverGatewayBaseApplication.class, args);
}
}
改为Redis读取路由规则
1 | /** |
配置记录
如下是一个带有转发、限流、熔断、重写路径的配置,将网关的/xxx-api/Account/Login2路径转发的下游服务的/xxx-api/Account/Login路径去,并实现了限流和熔断。
url:1
2// 转发到的子服务
http://子服务名:端口
predicates:1
2
3
4
5
6
7
8[
{
"args": {
"_genkey_0": "/xxx-api/Account/Login2/**"
},
"name": "Path"
}
]
filters:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[
{// 限流配置
"args": {
"key-resolver": "#{@remoteAddrKeyResolver}",
"redis-rate-limiter.burstCapacity": "3",
"redis-rate-limiter.replenishRate": "3"
},
"name": "RequestRateLimiter"
},
{// 重写路径配置
"args": {
"regexp": "/Account/Login2",
"replacement": "/Account/Login"
},
"name": "RewritePath"
},
{// 熔断处理配置
"args": {
"name": "default",
"fallbackUri": "forward:/fallback"
},
"name": "Hystrix"
}
]
效果
- 加上限流后,被限制的返回如下:
- 超时熔断后会走/fallback的返回,这里可以自定义返回数据
结束语
本文仅做核心配置的记录,由于其他跨域鉴权等设计的代码涉及太多,就没有一一列出,扩展可参考:《第二代微服务网关组件 - Spring Cloud Gateway》、《Spring Cloud Gateway-使用自定义过滤器通过Hystrix实现降级处理》
本文链接: https://www.xiajunyi.com/pages/p76.html
版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明出处!