Spring Cloud微服务架构从入门到会用(四)—服务网关Spring Cloud Gateway

心不动则不痛 提交于 2021-02-02 00:47:09

前两篇文章我们已经初步的完成了一个小型的微服务框架,有服务注册中心,有订单服务,也有库存服务;订单服务也能通过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源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!