前言
本篇主要介绍的是SpringCloud中的负载均衡(Ribbon)功能的实现以及使用Feign结合Ribbon实现负载均衡,Ribbon适合RPC的远程调用。
GitHub源码链接位于文章底部。
一、工程
首先需要创建四个工程,包括一个转发请求的客户端,两个接收请求的服务端,以及eureka注册中心。
二、配置
1.导入依赖
springcloud-ribbon-eureka作为eureka注册中心,因此需要添加eureka的服务端依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
其他三个工程需要注册到eureka中,相对于eureka来说是客户端,因此添加以下依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
2.配置
springcloud-ribbon-eureka
server:
port: 8100
spring:
application:
name: eureka-server
#eureka基本配置信息
eureka:
client:
service-url:
#Eureka 客户端与 Eureka 服务端进行交互的地址
defaultZone: http://127.0.0.1:${server.port}/eureka
#是否将自己注册到Eureka服务中,本身就是注册中心所以无需注册
register-with-eureka: false
#是否从Eureka中检索注册信息,本身就是注册中心所以无需检索
fetch-registry: false
server:
# 测试时关闭自我保护机制,保证不可用服务及时踢出
enable-self-preservation: false
##剔除失效服务间隔
eviction-interval-timer-in-ms: 2000
springcloud-ribbon-client
spring:
application:
name: springcloud-ribbon-client
server:
port: 8000
eureka:
client:
service-url:
#Eureka 客户端与 Eureka 服务端进行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
springcloud-ribbon-server1
spring:
application:
name: springcloud-ribbon-server
server:
port: 8001
eureka:
client:
service-url:
#Eureka 客户端与 Eureka 服务端进行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
springcloud-ribbon-server2
spring:
application:
name: springcloud-ribbon-server
server:
port: 8002
eureka:
client:
service-url:
#Eureka 客户端与 Eureka 服务端进行交互的地址
defaultZone: http://127.0.0.1:8100/eureka
3.配置类
在springcloud-ribbon-client中添加ribbon配置类,第一个方法是启动负载均衡,第二个方法是选择负载均衡策略,如果不写,默认为轮询策略。负载均衡策略的种类在文末贴出。
@Configuration
public class RibbonConfiguration {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public IRule ribbonRule() {
//随机负载
return new RandomRule();
}
}
三、测试代码
在server1中添加一个接口接收请求
@RestController
public class RibbonController {
@RequestMapping("/ribbon")
public String index(@RequestParam String name) {
return name+",Hello World! 这里是server1!!";
}
}
在server2中添加一个接口接收请求
@RestController
public class RibbonController {
@RequestMapping("/ribbon")
public String index(@RequestParam String name) {
return name+",Hello World! 这里是server2!!";
}
}
在client中添加一个接口发送请求,远程调用的地址是springcloud-ribbon-server加上接口名,springcloud-ribbon-server是由配置文件中的spring.application.name决定的。
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/ribbon")
public String ribbon(@RequestParam String name) {
//进行远程调用
return restTemplate.getForObject("http://springcloud-ribbon-server/ribbon/?name="+name, String.class);
}
}
依次启动eureka,server,client,访问客户端接口,转发到两个server。输入 localhost:8000/ribbon/?name=lxg 转发到两个server多刷新几次会有变化,轮询机制由配置类决定。
四、第二种方式-整合Feign进行远程调用
在client中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
添加remote的interface
@FeignClient(name = "springcloud-ribbon-server")
public interface RibbonRemote {
@RequestMapping(value = "/ribbon")
public String ribbon(@RequestParam(value = "name") String name);
}
在controller中添加方法
@Autowired
private RibbonRemote ribbonRemote;
@RequestMapping("/ribbon/{name}")
public String ribbonFeign(@PathVariable("name") String name) {
//进行远程调用
return ribbonRemote.ribbon(name);
}
注意:要在启动类上加上Feign启动注解
然后访问localhost:8000/ribbon/lxg 转发到两个server多刷新几次会有变化,轮询机制由配置类决定。
五、负载均衡策略
策略名 | 策略描述 | 实现说明 |
---|---|---|
BestAvailableRule | 选择一个最小的并发请求的server | 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server |
AvailabilityFilteringRule | 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) | 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态 |
WeightedResponseTimeRule | 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 | 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。 |
RetryRule | 对选定的负载均衡策略机上重试机制。 | 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server |
RoundRobinRule | roundRobin方式轮询选择server | 轮询index,选择index对应位置的server |
RandomRule | 随机选择一个server | 在index上随机,选择index对应位置的server |
ZoneAvoidanceRule | 复合判断server所在区域的性能和server的可用性选择server | 用性选择server 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server |
本文GitHub源码:https://github.com/lixianguo5097/springcloud/tree/master/springcloud-ribbon
CSDN:https://blog.csdn.net/qq_27682773
简书:https://www.jianshu.com/u/e99381e6886e
博客园:https://www.cnblogs.com/lixianguo
个人博客:https://www.lxgblog.com