Spring Cloud:使用 Zuul 实现路由网关详解

来自:程序员私房菜(微信号:eson_15),作者:倪升武

前面对 Hystrix 的知识做了比较详细的分析,这篇文章主要对 Zuul 来做一下讲解。


1. 什么是 Zuul?


Zuul 包含了对请求的路由和过滤两个最主要的功能。其中,路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤功能则是负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。


Zuul 和 eureka 进行整合,将 zuul 自身注册为 eureka 服务治理下的应用,同时从 eureka 中获得其他微服务的消息,也即以后的访问微服务都是通过 zuul 跳转之后获得。


所以,Zuul 提供:代理+路由+过滤三大功能。接下来,我们来看一看如何实现。


2. 落地实现


我们自定义一个新的项目工程:microservice-zuul-gateway。


2.1 依赖导入


<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>


我们需要将 zuul 注册到 eureka,所以也需要导入 eureka client 依赖。


2.2 主启动类注解


在主启动类中需要添加:@EnableZuulProxy 注解,表示开启 zuul 代理。


@SpringBootApplication
@EnableZuulProxy
public class ZuulGateway {
   public static void main(String[] args) {
       SpringApplication.run(ZuulGateway.class, args);
   }
}


2.3 application.yml 配置文件


接下来看看 application.xml 配置文件,由于要注册到 eureka,所以和 eureka 相关的配置,也是需要的,如下:


# 服务端口号
server:
 port: 6001

spring:
 application:
   name: microservice-zuul-gateway # 对外暴露的服务名称

# 客户端注册进eureka服务列表里
eureka:
 client:
   service-url:
     defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/,
   healthcheck:
     enabled: true
 instance:
   instance-id: zuul网关服务-6001  # 人性化显示出服务的信息
   prefer-ip-address: true    # 访问路径可显示ip地址
   lease-renewal-interval-in-seconds: 2
   lease-expiration-duration-in-seconds: 5

# 使用actuator来展示项目的基本信息
info:
 author.name: shengwu ni
 app.name: microservice
 server.port: ${server.port}
 application.name: ${spring.application.name}


2.4 测试一下


启动 eureka 集群、订单服务(8001)和 zuul-gateway(6001)。在浏览器中输入 http://eureka7001:7001 ,可以看到如下信息,说明服务都正常注册到 eureka。



我们首先直接访问一下订单服务,确保服务可用:http://localhost:8001/provider/order/get/1。


然后我们通过 zuu l来访问该订单服务:http://localhost:6001/microservice-order/provider/order/get/1 ,也可以正常访问。microservice-order 是订单服务的服务名。即 zuul 在 eureka 里找到了一个叫 microservice-order 的订单服务,然后去请求数据。所以说,zuul 是可以根据注册到 eureka 中的服务名称来访问服务的。


那么我们自然会想到,如果我把三个订单服务都启动起来,因为它们的服务名称都是 microservice-order,zuul 到底会将请求转发给哪个服务呢?


启动下 8001、8002 和 8003,然后还是访问http://localhost:6001/microservice-order/provider/order/get/1 ,查看输出的信息,可以知道,zuul 中默认集成了轮询的规则,三个服务轮流调用。


3. 自定义路由规则


如果我们不想像上面那样在 url 中直接暴露微服务名称,可以在配置文件中配一下路由规则。


# 配置路由规则
zuul:
 routes:
   order:
     serviceId: microservice-order
     path: /order/**


这样的话,在配置了路由规则之后,就可以使用:http://localhost:6001/order/provider/order/get/1 来访问订单服务了。


但是这样的话,原来使用微服务名称的方式还是可以访问,所以我们可以禁用原来使用微服务名称的方式访问。如下:


# 配置路由规则
zuul:
 ignored-services: microservice-order # 不允许用微服务名访问了,如果禁用所有的,可以使用 "*"
 routes:
   # 如下指定新的映射
   order:
     serviceId: microservice-order
     path: /order/**


我们还可以给路由加一个统一的前缀:


# 配置路由规则
zuul:
 ignored-services: microservice-order # 不允许用微服务名访问了,如果禁用所有的,可以使用 "*"
 routes:
   prefix: /zuul # 给路由加一个统一的前缀
   # 如下指定新的映射
   order:
     serviceId: microservice-order
     path: /order/**


这样的话,就可以使用:http://localhost:6001/zuul/order/provider/order/get/1 来访问订单服务了。


OK,Spring Cloud 中使用 zuul 实现路由就介绍这么多。

推荐↓↓↓
Java编程
上一篇:Java 中 15 种锁的介绍! 下一篇:谈谈怎么做服务隔离