六:对微服务路由发现体系的理解
微服务专栏地址
目录
简介
路由发现是微服务体系中一块重要组成,从以下几个方面理解微服务路由:
1.什么是路由
2. 为什么需要路由
3. 从路由的角度看微服务的体系架构是什么样的
4. 路由、服务发现、负载均衡有什么关系
5. 补充:负载均衡算法有哪些
1. 什么是微服务路由
直白理解:“路由”是指根据请求URL,将请求分配到对应的处理程序。
如SpringMVC的DispatchServlet,统一接收所有需要SpringMVC处理的请求,再根据指定饿匹配规则,将请求映射到最终的Controller中的某个方法。这里不再扩展,有兴趣的可以直接查看相关资料。
2. 微服务为什么需要路由
微服务需要一套完善的请求分发机制来保证一个请求到来能正确的找到对应的服务实例
微服务一般是由几十、上百个服务组成,无论是外部调用GW,或者内部服务之间的调用,对于一个URL请求,最终会确认一个服务实例进行处理。对每个服务实例手动指定一个唯一访问地址,然后根据URL去手动实现请求匹配是不可取的,尤其是基于云环境的微服务体系。
反向路由是微服务的网关的功能之一,可以为我们处理每个请求到服务实例的绑定,结合网关特点,可以做许多额外的横切面的工作,让更多的精力聚焦于业务。对于为什么需要API网关,请查看《五:对微服务API服务网关的理解》
3. 从路由的角度看微服务的体系架构是什么样的
理解阶段,只能先了解整体流程,后续实际代码阶段以及原理、源码分析阶段会深入了解。
3.1 内部服务如何调用
- 基础服务之间的调用:结合服务注册中心以及专属的具有负载均衡功能的客户端,如Eureka+(restTemplate+Ribbon)或者Eureka+Feign
- 聚合服务调用:结合服务注册中心以及专属的具有负载均衡功能的客户端,如Eureka+(restTemplate+Ribbon)或者Eureka+Feign
3.2 外部路由如何实现
基于Netflix的zuul,做了简单了解,SpringCloud与zuul集成的方式。这里先对核心流程做个简单了解,后续会有深入的应用、分析。
- Spring Cloud很好的集成了zuul,并且可以通过注解的形式来进行请求的反向路由以及API网关功能
- Spring Cloud集成zuul,对与url映射的处理方式与SpringMVC对url的请求方式类似,都是通过RequestMapping来进行请求绑定的。核心类:
ZuulHandlerMapping
- zuul的核心是
ZuulServlet
,一个请求核心流程:HttpServletRequest
–>ZuulHandlerMapping
–>ZuulController
–>ZuulServlet
–>ZuulFilter
–>HttpServletResponse
,详细流程请查看《五:对微服务API服务网关的理解》
4. 路由、API网关、服务发现、负载均衡有什么关系
4.1 关系
都是组成微服务的不可或缺的一部分
- 路由是API网关的一个功能点
- API网关需要定期或实时同步服务注册中心的服务列表,服务发现是将服务实例与服务注册中心进行实时关联
- 微服务架构中的负载均衡一般采用进程内负载均衡或者独立主机负载均衡形式,要求客户端同样需要定时或实时同步服务注册中心维护的服务列表
4.2 从服务发现工作流程理解一次请求过程
请求到来之前肯定需要服务提供者正常工作
- 服务提供者启动时,将提供的服务名称、服务器地址注册到服务配置中心
- 服务消费者通过服务配置中心来获取需要调度的服务机器列表
- 一次请求到来,经过路由分发定位到一组服务,再通过负载均衡算法之后,选取一台服务器调用
- 当服务器宕机或下线,相应的机器动态从服务配置中心移除,并通知相应的服务消费者
- 服务消费者一次访问服务配置中心之后,会将查询到的信息缓存到本地,后面调用先查缓存,从而降低服务配置中心压力
5. 补充:负载均衡算法有哪些
- 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
- 随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
- 加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
- 最小连接法:最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
- 源地址哈希法:源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。