前两篇文章我们已经初步的完成了一个小型的微服务框架,有服务注册中心,有订单服务,也有库存服务;订单服务也能通过feign进行服务间调用库存服务。那本文我们将引入服务网关Spring Cloud Gateway。
Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API。Spring Cloud Gateway是基于Spring Framework5,Spring Boot 2.0构建的。Spring Cloud Gateway是Spring开发并用来替代Zuul的。Spring Cloud Gate是基于Spring Framework5的WebFlux实现的。
Zuul和Spring Cloud Gateway的对比大家请参考这篇文章:https://www.cnblogs.com/yizhishi/archive/2019/09/26/11588860.html
接下来我们开始引入Spring Cloud Gateway。
1. 创建网关服务module
按照第二篇文章创建一个module,起名为server-gateway。
2. 修改pom文件,引入gateway
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这里我们同样将gateway注册到eureka。
3. 修改启动类
@SpringBootApplication
@EnableEurekaClient
public class ServerGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ServerGatewayApplication.class, args);
}
}
这里只需要加上eureka客户端的注解即可
4. 修改配置文件
server.port=10010
spring.application.name=server-gateway
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}
# 路由到app-storage服务
spring.cloud.gateway.routes[0].id=app-storage
spring.cloud.gateway.routes[0].uri=lb://APP-STORAGE
spring.cloud.gateway.routes[0].predicates[0]=Path=/storage/v1/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=2
# 路由到app-order服务
spring.cloud.gateway.routes[1].id=app-order
spring.cloud.gateway.routes[1].uri=lb://APP-ORDER
spring.cloud.gateway.routes[1].predicates[0]=Path=/order/v1/**
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=2
这里我们着重介绍下,怎么配置路由,以app-storage为例。
spring.cloud.gateway.routes[0].id 是配置这个路由唯一id
spring.cloud.gateway.routes[0].uri是配置uri也就是app-storage所在的服务,这里使用lb://是代表采用负载均衡
spring.cloud.gateway.routes[0].predicates[0]是配置请求app-storage下所有接口的请求前缀
spring.cloud.gateway.routes[0].filters[0]是用来配置转发到app-storage上的服务路径时,要去掉两个/的路径。比如直接访问app-storage的服务的路径是http://ip:port/storage/deduct,我们这里配置的是/storage/v1,那么我们通过网关访问的时候就是http://ip:port/storage/v1/storage/deduct,当网关转发的时候,会去找app-storage服务下的storage/v1/storage/deduct接口,这个接口显然是没有的,只有storage/deduct接口,这个时候就需要去掉storage/v1,一共是两个前缀,所以这儿要写2.
好了,这里我们就可以通过网关访问app-storage和app-order服务了
5. 通过gateway访问服务
依次启动server-eureka,server-gateway,app-storage,app-order
访问 http://127.0.0.1:10010/order/v1/order/placeOrder/commit ,我们上一篇文章写好的下单接口。因为我们加了请求前缀order/v1,所以在这里要加上。
如果返回true,代表网关配置成功。
网关如果只是用来路由就没有必要上Spring Cloud Gateway了,nginx就可以搞定了,路由仅仅是网关的基本本能,基于网关我们可以做接口鉴权,限流等。下一篇文章我们讲讲怎么通过网关鉴权
本文分享自微信公众号 - 自增程序员(javaipp)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/2527319/blog/4546250