spring cloud学习笔记二 ribbon负载均衡
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。展示了Ribbon与Eureka配合使用时的架构。
一、什么是负载均衡
当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。
负载均衡一般分为两种:硬件负载均衡(如F5)和软件负载均衡(Nginx),一般我们在项目中使用更多的是Nginx,硬件的负载均衡虽然强大,但是成本过高,不太适用于我们平常开发的项目。
二、Nginx与ribbon的区别
我们在项目中,一般是用Nginx实现负载均衡,但是在spring cloud为我们提供了一个负载均衡的组件ribbon,我们就来看看这二者的区别:
nginx:
nginx是作为一个中间服务器,将所有的请求统一进行处理,通过负载均衡算法转发收到的请求到各个服务端,可以说nginx是服务端的负载均衡。
nginx是服务端的负载均衡
Ribbon:
Ribbon是从eureka注册中心服务器端上获取已经注册的服务,如果有注册的服务中带有二个或者多个地址,那么就可以通过负载均衡算法实现负载均衡。
Ribbon是客户端的负载均衡
三、ribbon负载均衡的配置
ribbon负载均衡实现需要开启四个微服务:
1.注册中心服务(不在叙述)
2.两个服务提供者的微服务(80端口与81端口)
a.服务提供者的配置与spring cloud eureka客户端的配置相同,主要是两个微服务的配置文件中,服务的名称要一致:
###服务启动端口号
server:
port: 80
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka
---------------------------------------------------------------------------------
###服务启动端口号
server:
port: 81
###服务名称(服务注册到eureka名称)
spring:
application:
name: producter
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka
b.在80和81项目中分别创建两个controller层访问
80端口的controller层
@RestController public class ServiceController { @GetMapping("/producteri") public String sayHi(){ return "这是80端口的服务"; } }
81端口的controller层
@RestController public class ServiceController { @GetMapping("/producteri") public String sayHi(){ return "这是81端口的服务"; } }
3.服务消费者
a.导入maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
b.消费端的yml文件
###服务启动端口号
server:
port: 8080
###服务名称(服务注册到eureka名称)
spring:
application:
name: consumer
###服务注册到eureka地址
eureka:
client:
service-url:
##当前会员注册到eureka服务 地址+端口号
defaultZone: http://127.0.0.1:8100/eureka
c.添加一个配置RibbonConfig类
RibbonConfig类是微服务中消费者自动注入Ioc容器中的类。我们知道在服务调用端中,本身是没有任何业务逻辑的,只有通过RestTemplate的实例来获取微服务,如果我们之所以没有直接注入到controller层,就是因为我们添加了@LoadBalanced注解,实现一个负载均衡的成员属性。
@Configuration public class RibbonConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
c.定义个服务端请求,调用微服务
@RestController public class ClientController{ @Autowired private RestTemplate restTemplate; @GetMapping("/consumer") public String sayHi(){ return restTemplate.getForObject("http://producter",String.class); } }
最后访问http://127.0.0.1:8080/consumer,可以看见测试结果
四、ribbon自带的负载均衡算法
ribbon为我们封装了7种负载均衡算法:
1.BestAvailableRule:选择一个最小的并发请求的server
2.AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)
3.WeightedResponseTimeRule:根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。
4.RetryRule:对选定的负载均衡策略机上重试机制。(RoundRobinRule的加强版,在轮训时发现某些服务无法连接,如果这些服务超过了设定的连接数,之后就会跳过这些服务进行轮训)
5.RoundRobinRule:轮训(ribbon默认的算法)
6.RandomRule:随机选中一个server
7.ZoneAvoidanceRule:复合判断server所在区域的性能和server的可用性选择server
如何选择ribbon自带的算法:
我们只需要指定IRule实现就可以,实现的类就是上面介绍7种算法的名字。
在服务调用端中,RibbonConfig类文件下我们添加IRule的实现代码
@Bean public IRule ribbonRule() { return new RetryRule();//RetryRule就是我们上面介绍的7种算法,默认的实现是RoundRobinRule算法 }