Spring Cloud Gateway替代Zuul作为API网关
本文非常简要介绍如何使用Spring Cloud Gateway
作为API网关(不是使用Zuul
作为网关),关于Spring Cloud Gateway
和Zuul
的性能比较本文不再赘述,基本可以肯定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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论