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

参考文档

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/26/spring-cloud-gateway-replace-zuul-as-api-gateway/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Spring Cloud Gateway替代Zuul作为API网关
本文非常简要介绍如何使用Spring Cloud Gateway作为API网关(不是使用Zuul作为网关),关于Spring Cloud Gateway和Zuul的性能比较本文不再赘述,基本可以肯定S……
<<上一篇
下一篇>>
文章目录
关闭
目 录