阅读文本大概需要 8 分钟。

前面对 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 实现路由就介绍这么多。

END

往期精彩:

Spring Cloud:喝杯咖啡,了解一下Spring Cloud微服务 Spring Cloud:基于的maven分布式项目框架的搭建 Spring Cloud:Eureka 服务注册与发现 Spring Cloud:如何把自己的服务打造的更加人性化? Spring Cloud:使用Eureka集群搭建高可用服务注册中心 Spring Cloud:Zookeeper和Eureka的区别在哪? Spring Cloud:使用Ribbon实现负载均衡详解(上) Spring Cloud:使用Ribbon实现负载均衡详解(下) Spring Cloud:自定义 Ribbon 负载均衡策略 Spring Cloud:使用 Feign 实现负载均衡详解 Spring Cloud:使用 Hystrix 实现断路器原理详解(上) Spring Cloud:使用Hystrix实现断路器原理详解(下)

关注我 每天进步一点点