文章目录
- 介绍
- 基础示例
- spring-cloud-gateway-service
- spring-cloud-gateway-sample网关
介绍
Spring Cloud Gateway是Spring官方团队研发的API网关技术,它的目的是取代Zuul为微服务提供一种简单高效的API网关。
一般来说,Spring团队不会重复造轮子,为什么又研发出一个Spring Cloud Gateway呢?有以下几方面原因。
1:Zuul 1.x采用的是传统的thread per connection方式来处理请求,也就是针对每一个请求,会为这个请求专门分配一个线程来进行处理,直到这个请求完成之后才会释放线程,一旦后台服务器响应较慢,就会使得该线程被阻塞,所以它的性能不是很好。
2:Zuul本身存在的一些性能问题不适合于高并发的场景,虽然后来Netflix决定开发高性能版Zuul2.x,但是Zuul 2.x的发布时间一直不确定。虽然Zuul 2.x后来已经发布并且开源了,但是Spring Cloud并没有打算集成进来。
Spring Cloud Gateway是依赖于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能。
基础示例
spring-cloud-gateway-service,模拟一个微服务
spring-cloud-gateway-sample,独立的网关服务
spring-cloud-gateway-service
创建一个SpringBoot项目,添加web依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建一个测试接口资源
@RestController
public class HelloController {
@GetMapping("/say")
public String sayHello(){
return "HelloWorld";
}
}
spring-cloud-gateway-sample网关
创建SpringBoot项目,添加如下依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
在application.yml文件中添加Gateway的路由配置。
spring:
cloud:
gateway:
routes:
- id: define_filter
predicates:
- Path=/gateway/**
filters:
- name: GpDefine
args:
name: Gp_Mic
- name: RequestRateLimiter
args:
denyEmptyKey: false
emptyKeyStatus: SERVICE_UNAVAILABLE
keyResolver: '#{@ipAddressKeyResolver}'
redis-rate-limiter.replenishRate: 1
redis-rate-limiter.burstCapacity: 2
- StripPrefix=1
uri: http://localhost:8081/say
server:
port: 8088
配置文件说明:其中routes对应的就是下面的这个属性类
public class RouteDefinition {
// 自定义路由ID,保持唯一
private String id = UUID.randomUUID().toString();
//路由条件,根据匹配的结果决定是否执行该请求路由
private List<PredicateDefinition> predicates = new ArrayList();
//过滤规则,包含pre和post过滤,在上面的示例中,StripPrefix=1,表示
//Gateway根据该配置的值去掉URL路径中的部分前缀,上面的事去掉一个前缀
//即在转发的目标URI中去掉gateway
private List<FilterDefinition> filters = new ArrayList();
//目标服务地址,支持普通URI以及服务注册名称,即从注册中心获取集群服务地址
private URI uri;
private int order = 0;
启动两个项目
测试如下URL:http://localhost:8088/gateway/say