(说好的今天要学完全家桶!)
先来复习一下!Spring Cloud Eureka实现了服务注册中心和服务的注册与发现,而服务间通过Ribbon或Feign实现服务之间的消费和负载均衡,Config实现了应用多环境的外部化配置以及版本管理。为了使服务集群更加健壮,使用Hystrix的熔断机制避免微服务架构中由个别服务出现异常时引起的故障蔓延。
是不是觉得还缺了个东西?对!就是服务网关。为什么说缺他呢?
因为他是微服务架构中不可或缺的一部分。通过服务网关统一向外提供RESTful API的过程,除了具有服务路由,负载均衡之外,还有权限控制的功能。Zuul将权限控制这种较重的非业务逻辑迁移到服务路由层面,使得服务集群主体具有更高的可复用性和可测试性。Zuul是Netflix基于JVM的路由器和服务器端负载均衡器。
Netflix使用Zuul进行一下操作:
- 认证
- 洞察
- 压力测试
- 金丝雀测试
- 动态路由
- 服务迁移
- 负载脱落
- 安全
- 静态响应处理
- 主动流量管理
服务网关:路由转发+过滤器
- 路由转发:接收一切外界请求,转发到后端的微服务中
- 过滤器:在服务网关中完成一切的横切功能,例如权限校验,限流以及监控
服务网关的作用(以控制权限为例):
- 将权限校验的逻辑写在网关的过滤器中,后端不需要关注权限校验的代码,所以服务的jar包也不会引入权限校验的逻辑,不会增加jar的大小
- 如果要修改权限校验的逻辑,只需修改网关中的权限过滤器即可,需要要升级所有的微服务
服务网关技术选型
引入服务网关后的微服务架构如上,总体包含三部分:服务网关、open-service和service
总体流程:
- 服务网关、open-service和service启动时注册到注册中心上去
- 用户请求时直接请求网关、网关做智能路由转发(包括服务发现,负载均衡)到open-service,这其中包含权限校验、监控、限流操作
- open-service聚合内部service响应,返回给网关,网关再返回给用户
引入网关的注意点
- 增加了网关,多了一层转发(原本用户请求直接访问open-service即可),性能会下降一些
- 网关的单点问题:在整个网络调用过程中,一定会有一个单间,可能是网关,nginx,dns服务器等。
- 网关要尽量轻
服务网关基本功能
- 智能路由:接受外部一切请求,并转发到后端的对外服务open-service上
- 权限校验:只校验用户向open-service服务的请求,不校验服务内部的请求
- API监控:只监控经过网关的请求,以及网关本身的一些性能指标
- 限流:与监控配合,进行限流操作
- API日志统一手机:类似于一个aspect切面,记录接口的进入和出去时的相关日志
Spring Cloud Zuul
- 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> </dependency>
- 服务注册
添加@EnableZuulProxy开启Zuul服务网关
@EnableZuulProxy @SpringBootApplication public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
- 配置:设置服务名称,端口号,重定向到我的博客
spring: application: name: zuul-service server: port: 9000 zuul: routes: blog: path: /sylvia/** url: https://blog.youkuaiyun.com/Sylvia_baby
- 测试
浏览器访问:http://localhost:9000/sylvia
服务转发
Eureka Service:作为服务注册中心
Eureka Provider:作为服务提供者
- 添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
- 修改配置
eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: name: eureka-service server: port: 8080 zuul: routes: api: path:/** serviceId:eureka-provider
浏览器访问:http://localhost:8080/,Zuul会去Eureka服务中心注册,找到eureka-provider服务以均衡负载的方式访问
测试服务,依次启动项目:service--provider-1/2/3--zuul
启动该工程后,访问服务注册中心,查看服务是否都已注册成功
访问http://localhost:9000/,Zuul会去Eureka服务注册中心,找到eureka-provider服务以均衡负载的方式访问
路由规则
网关的默认路由规则
Spring Cloud Zuul默认情况下,Zuul会带里所有注册到Eureka Server的微服务,并且Zuul的路由规则如下:[http://ZUUL_HOST:ZUUL_PORT/]()微服务在Eureka上的serviceId/**会被转发到serviceId对应的微服务上。
参考:https://www.w3cschool.cn/spring_cloud/spring_cloud-pzs12ixk.html
附上原作者的源码:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-zuul