负载均衡本质就是把流量进行均衡,防止某个服务被请求过多,过载,而同样业务的其他服务几乎没有压力。
负载均衡算法,其实这个也是找工作的热点问题之一
有轮询,随机,加权轮询,加权随机,最少连接数,ip Hash法等。这里不再展开。
SpringCloud中的Netflix使用的Ribbon
项目地址
https://github.com/mingweihua/ming-cloud
前期基础可以看以前的文章
2-1.SpringCloud前期基础(微服务概念、服务调用方式、Http客户端工具、RestTemplate)
2-2.SpringCloud——Eureka注册中心
主要在服务消费方/调用方进行配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
消费方使用的RestTemplate,因此在上面添加注解
@Configuration
public class OthersConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
//负载均衡方式
@LoadBalanced
public RestTemplate restTemplate2() {
return new RestTemplate();
}
}
@LoadBalanced表示的开启负载均很,并且轮询算法,可以通过打断点,查看源码。
这里直接说了,主要看BaseLoadBalancer.java这个类
默认的规则是轮询,当然也通过配置文件进行更改。
常用配置是
ribbon:
ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)
ReadTimeout: 3000 #服务请求处理超时时间(毫秒)
OkToRetryOnAllOperations: true #对超时请求启用重试机制
MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数
MaxAutoRetries: 1 # 切换实例后重试最大次数
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法
注意!!
为什么config类配置两个restTemplate,由于我有些别的方法测试时不希望使用负载均衡,添加注解@LoadBalanced,若使用到该restTemplate,拦截请求,然后进行负载均衡,详细通过打断点,发现走到LoadBalancerInterceptor.java,,这个类是继承ClientHttpRequestInterceptor,拦截请求
Controller类
@RequestMapping("/test3")
public List<ZK_collect> test3() {
log.info("使用负载均衡动态从Eureka服务器获取服务");
String url = "http://service-ming/service/getAllZKData";
log.info("此时IP和端口换成服务名/服务id");
List<ZK_collect> zk_collects = restTemplate2.getForObject(url, List.class);
return zk_collects;
}
注意,有坑
服务调用方地址的host不能是ip地址,也不能是域名,必须是Eureka Server上的application name,也就是服务名。
因为在LoadBalancerInterceptor.java会执行intercept方法,获取url中的Host,作为serviceName进行传参
执行loadBalancer的execurt方法,具体实现类是BlockingLoadBalancerClient
也就是根据serverName进行选择相应的服务实例,若改成ip等之类的就会报错,显示No instances available for ****
以上就是配置Ribbon的简单介绍。
虽然比较简单,但是抽空写博客给大家参考不容易,欢迎大家点个赞,评论之类的。你们的赞扬和肯定是博主们坚持的动力,谢谢!