【SpringCloud】Zuul路由网关

1. 是什么

Zuul包含了对请求的路由和过滤两个最主要的功能:

  1. 路由功能: 负责将外部的请求转发到具体的微服务实例上,是实现外部访问统一入口的基础
  2. 过滤功能: 负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础

  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.项目框架

  1. 使用nignx负载均衡和反向代理技术可以实现网关的高可用
  2. zuul网关自动集成ribbon客户端,实现路由的反向代理

6. zuul和feign的区别

两者的应用层次以及原理均不相同。

  1. zuul作为整个应用的流量入口,接收所有的请求,如app、网页等,并且将不同的请求转发至不同的处理微服务模块,其作用可视为nginx
  2. feign则是将当前微服务的部分服务接口暴露出来,并且主要用于各个微服务之间的服务调用
  3. zuul也含有hystrix和ribbon,基于http通讯的,可以直接代理服务就行。在它和服务间增加feign只会增加通讯消耗,没有特别的意义。feign在服务互相调用的时候用就行了,可以仿rpc通讯。
  4. Feign主要作服务端流控,Feign的负载均衡是基于Eureka实现的
  5. Zuul主要作客户端流控,并且Zuul的负载均衡结合Eureka实现易用性较好,并且Zuul我一般用在对第三方提供访问接口。

7.zuul和nginx的区别

相同点:

  1. 都实现负载均衡、反向代理、过滤请求、实现网关效果

不同点

  1. nginx采用c语言编写,zuul采用java语言编写
  2. nginx实现服务端负载均衡,而zuul采用ribbon+eureka实现客户端负载均衡

我们只所以选用zuul,是因为(采用自己熟悉语言开发,易学):

  1. zuul对所有服务会话可以进行拦截
  2. zuul可实现安全控制,统一异常处理,xxs
  3. 权限控制、黑名单和白名单、性能监控、日志打印

猜你喜欢

转载自blog.csdn.net/wrs120/article/details/91782432