文章目录

  • 介绍
  • 基础示例
  • 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,独立的网关服务

springcloud gateway获取响应body大小 springcloudgateway性能调优_spring boot

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的路由配置。

springcloud gateway获取响应body大小 springcloudgateway性能调优_spring_02


springcloud gateway获取响应body大小 springcloudgateway性能调优_spring boot_03

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

springcloud gateway获取响应body大小 springcloudgateway性能调优_Cloud_04