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

前两篇文章我们已经初步的完成了一个小型的微服务框架,有服务注册中心,有订单服务,也有库存服务;订单服务也能通过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


        1.8
        Hoxton.SR1
    

    
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        

        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
    
    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

这里我们同样将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就可以搞定了,路由仅仅是网关的基本本能,基于网关我们可以做接口鉴权,限流等。下一篇文章我们讲讲怎么通过网关鉴权

你可能感兴趣的:(Spring,Cloud)