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

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

pom依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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服务配置,本文暂不介绍可直接忽略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

参考文档

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :