1. 是什么
Zuul包含了对请求的路由和过滤两个最主要的功能:
- 路由功能: 负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础
- 过滤功能: 负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础
Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,即以后的访问微服务都是通过Zuul跳转后获得
注:Zuul最终会作为一个单独的服务注册到Eureka
2. 作用
代理 + 路由 +过滤 三大功能,如果这三大功能不太理解,可以结合nginx,我们都知道nginx实现了反向代理的功能,zuul同样也实现了反向代理的功能,这篇博客主要讲的是反向代理,它也有负载均衡(内置了Ribbon),权限控制的作用,只要配置serviceId一样即可
3. 项目实战
3.1 引依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3.2 配置文件
server:
port: 9527 # zuul服务的端口号
spring:
application:
name: microservicecloud-zuul-gateway # 注册到Eureka上的服务的名称
# eureka配置
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
# zuul配置
zuul:
#在服务前统一加前缀
prefix: /dmsd
# 将真实的服务名称忽略
#ignored-services: microservicecloud-dept # 要隐藏的服务名称
ignored-services: "*" ,* 代表忽略所有的,即不能通过真实服务名路径访问,只能用替换会后的名,遵守单一入口原则
routes:
mydept.serviceId: microservicecloud-dept # 被隐藏的服务名
mydept.path: /mydept/** # 将服务名替换为此名
3.3 启动项配置
@SpringBootApplication
@EnableZuulProxy
public class Zuul_9527_StartSpringCloudApp
{
public static void main(String[] args)
{
SpringApplication.run(Zuul_9527_StartSpringCloudApp.class, args);
}
}
到此zuul服务就搭建成功了,并修改本地hosts文件,将127.0.0.1 映射为 myzuul.com ;
以前我们访问一个服务输入的是:http://localhost:8080/dept/get/2 ;
但是使用Zuul路由后输入的是:http://myzuul.com:9527/microservicecloud-dept/dept/get/2 ;
Zuul路由加前缀和隐藏真实服务名可输入: http://myzuul.com:9527/dbsd/mydept/dept/get/2 ;
4. 总结思路
搭建Zuul服务,并注册到Eureka,此时Zuul会获取注册到Eureka上的服务的信息,当我们输入地址(zuul+微服务名+url)后,首先通过Zuul找到要访问的服务,然后通过Zuul路由到要访问服务的地址上进行跳转
5.项目框架
- 使用nignx负载均衡和反向代理技术可以实现网关的高可用
- zuul网关自动集成ribbon客户端,实现路由的反向代理
6. zuul和feign的区别
两者的应用层次以及原理均不相同。
- zuul作为整个应用的流量入口,接收所有的请求,如app、网页等,并且将不同的请求转发至不同的处理微服务模块,其作用可视为nginx
- feign则是将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用
- zuul也含有hystrix和ribbon,基于http通讯的,可以直接代理服务就行。在它和服务间增加feign只会增加通讯消耗,没有特别的意义。feign在服务互相调用的时候用就行了,可以仿rpc通讯。
- Feign主要作服务端流控,Feign的负载均衡是基于Eureka实现的
- Zuul主要作客户端流控,并且Zuul的负载均衡结合Eureka实现易用性较好,并且Zuul我一般用在对第三方提供访问接口。
7.zuul和nginx的区别
相同点:
- 都实现负载均衡、反向代理、过滤请求、实现网关效果
不同点
- nginx采用c语言编写,zuul采用java语言编写
- nginx实现服务端负载均衡,而zuul采用ribbon+eureka实现客户端负载均衡
我们只所以选用zuul,是因为(采用自己熟悉语言开发,易学):
- zuul对所有服务会话可以进行拦截
- zuul可实现安全控制,统一异常处理,xxs
- 权限控制、黑名单和白名单、性能监控、日志打印