本文非常简要介绍如何使用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




