微服务负载均衡技术
引⾃:简介
在微服务架构中,负载均衡是必须使⽤的技术,通过它来实现系统的⾼可⽤、集群扩容等功能。负载均衡可以分为两种:服务端负载均衡和客户端负载均衡。通常所说的负载均衡指服务器负载均衡,可通过硬件设备或软件来实现,硬件⽐如:F5、Array等,软件⽐如:LVS、Nginx等,类似的架构图如下: 图⽚来⾃个⼈微信公众号
通过硬件或软件实现负载均衡均会维护⼀个服务端清单,利⽤⼼跳检测等⼿段进⾏清单维护,保证清单中都是可以正常访问的服务节点。当⽤户发送请求时,会先到达负载均衡器(也相当于⼀个服务),负载均衡器根据负载均衡算法(轮训、随机、加权轮训)从可⽤的服务端列表中取出⼀台服务端的地址,接着进⾏转发,降低系统的压⼒。
⽽对于客户端负载均衡来说,与服务端负载均衡的主要区分点在于服务清单的存放位置。在客户端负载均衡中,客户端⾃⼰会存储⼀份服务端清单,它是通过从注册中⼼(Eureka服务注册中⼼)进⾏抓取得到的,同时也需要对此进⾏维护。客户端负载均衡(Ribbon)
SpringCloud Ribbon是基于客户端的负载均衡⼯具,它可以将⾯向服务的 REST 模板请求⾃动转换成客户端负载均衡的服务调⽤。
Ribbon 维护了⼀个服务列表,如果服务实例注销或死掉,Ribbon 能够⾃⾏将其剔除。Ribbon 提供了客户端负载均衡的功能,Ribbon利⽤从 Eureka Server中读取到的服务信息列表(存储在本地即客户端中),在调⽤服务实例时,合理地进⾏负载,直接请求到具体的微服务,如下图是Ribbon负载均衡的流程图:
图⽚来⾃个⼈微信公众号
配置步骤1. 在Eureka客户端开启服务发现(增加EnableDiscoveryClient注解),作⽤是让客户端可以从服务注册中⼼获取服务端清单。同时,在定义的RestTemplate对象上使⽤负载均衡(增加LoadBalanced注解),作⽤是通过内部机制使之具有负载均衡能⼒。同时也可设置负载均衡算法等。
图⽚来⾃个⼈微信公众号
2. 使⽤RestTemplate调⽤微服务,此时通过服务名进⾏调⽤。
图⽚来⾃个⼈微信公众号
其它配置
可以直接通过配置Ribbon客户端的⽅式来⾃定义各个服务客户端调⽤的参数。全局配置
使⽤ribbon.=的⽅式设置ribbon的默认参数,如下:#ribbon请求连接的超时时间ribbon.ConnectTimeout=250#请求处理的超时时间ribbon.ReadTimeout=1000#对所有操作请求都进⾏重试
ribbon.OkToRetryOnAllOperations=true#对当前实例的重试次数ribbon.MaxAutoRetries=1#对下个实例的重试次数
ribbon.MaxAutoRetriesNextServer=1
指定服务配置
使⽤.ribbon.=的⽅式进⾏设置,client表⽰各个服务客户端,如下:ly-microservice-clgl.ribbon.ConnectTimeout=500ly-microservice-clgl.ribbon.ReadTimeout=1000
ly-microservice-clgl.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule