Ribbon是一个是一个基于HTTP和TCP的客户端负载均衡工具。
它也是我们springcloud经常使用的负载均衡。
负载均衡就是通过一系列手段(如心跳访问)等将访问合理的分配给有足够处理能力的服务段。
具体实现这里不细讲,细讲我也不会。
我只展示下springcloud怎么实现的
在展示之前说下需要的:
服务端:2个以上,我们可以用2个简单的springboot jpa项目代替(数据库有没有内容无所谓,只要能打开页面就OK,如下图)
Eureka的server端(可要可不要,不使用Eureka也是可以负载均衡,而且操作不变,但实际这2个一般是一起出现的)
如果你没有以上的,可以使用我的,也可以自己做个,几分钟的事情吗。
https://github.com/lihang212010/Ribbon
然后讲解的是搭载Ribbon的项目(Eureka中包含Ribbon,因此Eureka也可以)
在本项目中,我们需要一个和服务端数据库相同的POJO,但是这一步并不重要,因此这一步代码放在最后面。
首先我们添加依赖(Eureka的依赖如果存在,则不需要在添加了,因为Eureka里有这个)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
如果你的版本过新或者程序出现okhttp3报错,则需要在添加okhttp3依赖,老版本自带这个。
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.6.0</version>
</dependency>
完整的pop.xml我发github上了,这都不是重点。
重点是下面这个,首先我们创建个bean
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率,所以很多客户端比如 Android或者第三方服务商都是使用 RestTemplate 请求 restful 服务
@LoadBalanced是Ribbon的注解,只需要添加次注解,便自动开启负载均衡了
然后我们在控制器添加这些
@RestController
public class MoviesController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public Users findById(@PathVariable Long id) {
return this.restTemplate.getForObject("http://demo-cloud-user/"+id, Users.class);
}
}
demo-cloud-user是服务端的名字
getForObject() 发送一个HTTP GET请求,返回的请求体将映射为一个对象
然后我们可以开启2个以上服务端(修改端口即可),如果Eureka项目则开启后在开启这个项目,没有直接开启刚刚我们写的这个项目
访问 http://localhost:8010/user/1 ,多访问几次,我们会发现控制台中的服务端会显示多次访问记录,这些访问会按照某种规则平衡的分配给每个服务器。
这时我们的负载均衡便搭建好了。
Ribbon的分配规则是可以更改的,在springcloud中有3种方式更改,我只贴出最常用的一种。
配置更改在yml文件中添加
demo-cloud-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
demo-cloud-user是服务端名字
如果不是yml文件
demo-cloud-user.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
总共7种访问策略,字太多,懒得打。大家自己查。