Spring Cloud Gateway替代Zuul作为API网关

本文非常简要介绍如何使用Spring Cloud Gateway作为API网关(不是使用Zuul作为网关),关于Spring Cloud GatewayZuul的性能比较本文不再赘述,基本可以肯定Spring Cloud Finchley版本的Gateway比Zuul 1.x系列的性能和功能整体要好。

特别提醒:Spring Cloud Finchley版本中,即使引入了spring-cloud-starter-netflix-zuul,也不是2.0版本的Zuul

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

pom依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

项目结构

  • 第一个项目是Eureka注册中心,非常简单,基本就一个Application
  • 第二个项目是User service,也非常简单提供两个rest api,为了简略不连接数据,直接在内存中生成一组数据,端口6001
  • 第三个项目就是网关,端口8001

目前项目中集成websocket服务配置,本文暂不介绍可直接忽略。

@SpringCloudApplication
public class APIGatewayApplication  {
    private static final Logger logger = LoggerFactory.getLogger(APIGatewayApplication.class);

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/baidu")
                    .uri("http://baidu.com:80/")
                )
                .route("websocket_route", r -> r.path("/apitopic1/**")
                    .uri("ws://127.0.0.1:6605")
                )
                .route(r -> r.path("/userapi3/**")
                    .filters(f -> f.addResponseHeader("X-AnotherHeader", "testapi3"))
                    .uri("lb://user-service/")
                )
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(APIGatewayApplication.class, args);
        logger.info(" Start APIGatewayApplication Done");
    }
}

网关的配置文件application.yml

server:
  port: 8001

#服务名
spring:
  application:
    name: gateway-service
  cloud:
    gateway:
      filter:
        remove-non-proxy-headers:
          headers:
          - dummy
      routes:
        - id: apiuser
          # 重点!/info必须使用http进行转发,lb代表从注册中心获取服务
          uri: lb://user-service
          predicates:
          # 重点!转发该路径!/userapi/**
          - Path=/userapi/**
          # http://localhost:8001/userapi/user/users/2 必须加上StripPrefix=1,否则访问服务时会带上userapi
          # 而不是我们期望的去掉userapi,只保留**部分
          filters:
          - StripPrefix=1
        - id: api2user
          uri: lb://user-service
          predicates:
          - Path=/userapi2/**
          filters:
          - StripPrefix=1

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7700/eureka/

配置了一个路由apiuser,当路径为- Path=/userapi/**,就转发到服务lb://user-servic,同时把路径中的userapi这部分去掉- StripPrefix=1

运行测试

直接访问User service: http://localhost:6001/user/users/2

通过网关访问User service: http://localhost:8001/userapi/user/users/2

参考文档

上一篇 Spring Cloud Gateway 与 Zuul 比较
下一篇 Nacos实现Spring Cloud Gateway的动态路由
目录
文章列表
1 Dubbo Spring Cloud 服务消费方开发步骤
Dubbo Spring Cloud 服务消费方开发步骤
2
Spring Boot 2.X返回json数据中null字段不显示解决方法
Spring Boot 2.X返回json数据中null字段不显示解决方法
3
Nacos服务端部署与操作
Nacos服务端部署与操作
4
Swift UI - 微调器或步进器(UIStepper)
Swift UI - 微调器或步进器(UIStepper)
5
获取Spring Cloud Gateway响应参数,可以查看、修改
获取Spring Cloud Gateway响应参数,可以查看、修改
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。