提起负载均衡,我们在服务端肯定听说过nginx负载均衡,但是nginx是针对于服务端的,什么意思呢?就是服务端的请求按照往常一样发送,将请求发送给nginx,由nginx参考自己项目的特点,选择一些算法决定当前的客户端请求到底由谁处理比较合适,服务端是什么都不知道的。
但是在Spring Cloud负载均衡中,正好相反,也就是说将调度的任务放在请求发起端,即Rebbon,首先它会从注册中心里面拿到所有的注册信息,然后客户端请求出来之后,会看看到底有几个服务能为这个请求服务,然后再根据一些调度算法进行调用。
一、基础准备
- eureka注册中心
- 服务提供者
- 服务消费者
二、添加依赖
其实不用添加依赖,只要在consumer上有eureka依赖即可
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
三、搭建一个简单的集群
将provider项目赋值一份即可,赋值的时候refactory项目名,在pom中修改artifactId即可,更重要的是修改端口号。
然后在provider1中写一些标识:
@RestController
public class UserService {
private Logger logger = LoggerFactory.getLogger(UserService.class);
@PostMapping("/login")
boolean login(@RequestBody UserLoginInfo userLoginInfo){
logger.info("正在为客户端提供服务:provider:8071");
return "amdin".equals(userLoginInfo.getUsername()) && "123456".equals(userLoginInfo.getPassword());
}
}
在provider2中的标识:
logger.info("正在为客户端提供服务:provider2:8081");
四、测试
在consumer中调用五次login服务,可以看到在provide1r中调用了三次,在provider2中调用了两次,可以大题看到rebbon默认选择的是轮询的方式去进行调度的。
五、调度规则
在netflix的loadbalancer中我们可以看到各种的负载均衡调用的rule,他们其实都是事先了IRule接口
六、使用其他的轮询规则
如果我们想要使用randomRule而不用轮询,我们可以在consumer项目中的ylm添加:
#更换负载均衡策略
dm-user-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其中,dm-user-provider是我们provider的注册名,不同的服务注册的名称都不相同,(即provider1和provider2的注册名都是一样的,只是端口不一样罢了)。然后指定想要的遵循的调度算法即可。