在上一篇的案例中,我们启动了一个user-service,然后后通过DiscoveryCilent来获取服务实例信息,让后获取ip和端口来访问。
但是在实际环境中,我们一般会开启很多user-service的形成集群。此时我们获取的服务列表中就会员多个服务,一般这种情况下我们就需要编写负载均衡算法,在多个实例列表中选择。
不过Eureka中已经帮我们继承了负载均衡组件:Ribbon,简单修改即可使用。
1:什么是Ribbon
接下来,我们就来使用Ribbon实现负载均衡。
2:代码编写
实现我们启动两个user-service实例,一个8081,一个8082。
在Eurake的控制面板上可以看到:
开启负载均衡
应为Eureka中已经集成了ribbon,所以我们无需映入行的依赖。直接修改代码:
在RestTemplate的配置方法上添加@LoadBalanced
(翻译过来就是负载均衡的意思) 注解:
(写在启动类的下面)
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:
public class UserService{
@AutoWired
private RestTemplate restTemplate;
public User queryUser(int id){
String url = "http://user-service/user/selectOne/"+id;
return restTemplate.getForObject(url,User.class);
}
}
3 源码跟踪
可以看到我们只输入了Service 名称就可以访问了,之前还要服务的ip和端口
显然有人帮我们根基service名称,获取到了服务实例的ip和端口,他就是
LoadBealancerInterceptor
(翻译过来就是负载均衡拦截器)
我们源码跟踪
在拦截器中获取我们输入的url地址,后解析出我们写的服务名称,然后后拉取得到Eureka中服务的ip和端口,在经过负载均衡算法,得到真正的访问地址。
4 负载均衡策略
Ribbon默认的负载均衡策略是简单的轮询。
编写测试类,在刚在的源码中我们看到拦截器中时使用RibbonLoadBalanceClient(负载均衡客户端)来进行负载均衡的。其中有一个choose方法,是这样简绍的。
(现在这个就是负载均衡获取实例的方法。)
我们对注入这个类的对象,然后对其测试:
@RunWith(StringRunner.class)
@SprngBootTest(classes = UserConsumerDemoApplication.class)
public class LoadBalancetest{
@Autowired
RibbonLoadBalncerCilent client;
@Test
public void test(){
for (int i = 0; i < 10; i++) {
ServiceInstance instance = this.client.choose("user-service");
System.out.println(instance.getHost() + ":" + instance.getPort());
}
}
}
结果:
符合我们的预期推测, 确实是轮询的方式。
我们是否可以修改负载均衡的策略呢?
SpringBoot也帮我们提供了修改负载均衡规则的配置入口:
user-service.ribbon.NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
这样设置是将策略修改为随机。
以上就是负载均衡ribbon的基本使用,获取更多内容请查看我的个人主页。请大家支持一下兄弟, 点个赞,不要白嫖了。。。