阅读文本大概需要 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实现断路器原理详解(下)
关注我
每天进步一点点