负载均衡
LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA。
常见的负载均衡有软件Nginx,LVS,硬件 F5等。
相应的在中间件,例如:dubbo和SpringCloud中均给我们提供了负载均衡。
负载均衡的主要实现方式可以分为:
- 集中式,就是在服务提供者和消费者之间提供负载均衡服务,如nginx,硬件等
- 进程内,集成于消费者进程内,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就是一个消费方的负载均衡。
初步配置过程
修改消费者模块的配置信息
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
追加服务注册地址
eureka:
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
对使用的restTemplate进行负载均衡设置
@Configuration
public class ConfigBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
消费者端开启eureka设置
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
修改restTemplate调用方法的方式,将原来的http路径前缀替换为服务名
private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT";
ribbon会通过eureka查找对应的服务,并在多个服务实例之间进行负载均衡。
Ribbon和Eureka整合后Consumer可以直接调用服务而不用再关心地址和端口号
多服务提供者配置
配置过程和上面的相似,只是重复多次,每个服务提供者的服务端口不同,关联的数据库不同,其他的都相同
Ribbon其实就是一个软负载均衡的客户端组件,可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
默认的负载均衡是轮询算法
自定义负载均衡在只要自定义IRule实现类即可
自定义的IRule实现类,不能放在@componentScan所在的包及其子包下,这个实现类注意用@configuration形式加入容器
@Configuration
public class MyRibbon {
@Bean
public IRule getRule(){
return new RandomRule();//随机
}
}