个人学习SpringCloud系列 Zuul篇
Github Link: https://github.com/panjianlong13/SpringBoot-SpringCloud/tree/master/spring-cloud-zuul
Spring Cloud Zuul简介
外部的应用如何来访问内部各种各样的微服务呢?在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个API网关根据请求的url,路由到相应的服务。当添加API网关后,在第三方调用端和服务提供方之间就创建了一面墙,这面墙直接与调用方通信进行权限控制,后将请求均衡分发给后台服务端。例如,/可以映射到您的Web应用程序,/api/users
映射到用户服务,并将/api/order
映射到订单服务。Zuul
是Netflix
的基于JVM
的路由器和服务器端负载均衡器。
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API
的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud
Netflix
中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
Netflix使用Zuul进行以下操作:
认证
洞察
压力测试
金丝雀测试
动态路由
服务迁移
负载脱落
安全
静态响应处理
主动/主动流量管理
为什么需要API Gateway
1.简化客户端调用复杂度
在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。
2.数据裁剪以及聚合
通常而言不同的客户端对于显示时对于数据的需求是不一致的,比如手机端或者Web端又或者在低延迟的网络环境或者高延迟的网络环境。因此为了优化客户端的使用体验,API Gateway可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验
3.多渠道支持
当然我们还可以针对不同的渠道和客户端提供不同的API Gateway,对于该模式的使用由另外一个大家熟知的方式叫Backend for front-end, 在Backend for front-end模式当中,我们可以针对不同的客户端分别创建其BFF
4.遗留系统的微服务化改造
API Gateway的模式同样适用于这一类遗留系统的改造,通过微服务化的改造逐步实现对原有系统中的问题的修复,从而提升对于原有业务响应力的提升。通过引入抽象层,逐步使用新的实现替换旧的实现。
什么是服务网关
服务网关 = 路由转发 + 过滤器
路由转发:接收一切外界请求,转发到后端的微服务上去
过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成
技术历史发展沿革
1.每个服务都自身实现 -> 2.写到一个公共服务中 其他服务依赖这个服务 -> 3.写到服务网关前置过滤器 请求进行权限校验
第一种 缺点太明显
第二种 缺点
1.每个服务引入了这个公共服务,那么相当于在每个服务中都引入了相同的权限校验的代码,使得每个服务的jar包大小无故增加了一些
2.每个服务都引入了这个公共服务,那么我们后续升级这个服务可能就比较困难,而且公共服务的功能越多,升级就越难。进行改变升级后所有的服务都重新引包,编译部署
第三种 服务网关优点
1.将权限校验的逻辑写在网关的过滤器中,后端服务不需要关注权限校验的代码,所以服务的jar包中也不会引入权限校验的逻辑,不会增加jar包大小
2.如果想修改权限校验的逻辑,只需要修改网关中的权限校验过滤器即可,而不需要升级所有已存在的微服务
网关流程
1.Service启动时注册到注册中心
2.用户请求时直接请求网关,网关做智能路由转发,包含权限校验、监控、限流等操作
Zuul实战
新建SpringBoot项目
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
开启服务注册
参数配置
spring:
application:
name: zuul-service
server:
port: 8080
zuul:
routes:
blog:
path: /peter/**
url: https://blog.csdn.net/panjianlongWUHAN
启动服务进行测试
重定向到博客
服务转发
1.启动Eureka服务 端口6379(不再详述)
2.两个服务提供者 Eureka Provider 8081 和8082
添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
3.Zuul Service 配置修改
spring:
application:
name: zuul-service
server:
port: 8080
#zuul:
# routes:
# blog:
# path: /peter/**
# url: https://blog.csdn.net/panjianlongWUHAN
eureka:
client:
serviceUrl:
defaultZone: http://localhost:6379/eureka/
zuul:
routes:
api:
path: /**
serviceId: eureka-provider
依次启动
Eureka Service,Provider-1,Provider-2,Zuul Service
访问Eureka http://localhost:6379/
负载均衡方式通过Zuul访问两个Provider