失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > day3_Ribbon负载均衡_Hystrix熔断_Fein远程调用(restTemplate)_Zuul网关

day3_Ribbon负载均衡_Hystrix熔断_Fein远程调用(restTemplate)_Zuul网关

时间:2023-02-19 05:09:05

相关推荐

day3_Ribbon负载均衡_Hystrix熔断_Fein远程调用(restTemplate)_Zuul网关

乐优商城笔记

1. Ribbon负载均衡

在user-service-consumer中通过DiscoveryClient获取user-service-provider的列表,获取服务实例信息,然后获取ip和端口来访问。

但是实际环境中,我们往往会开启很多个user-service的集群。载均衡算法,在多个实例列表中进行选择。

Eureka中已经帮我们集成了负载均衡组件:Ribbon,简单修改代码即可使用。

使用Ribbon实现负载均衡:

1.1 启动两个服务实例

修改端口,启动:

1.2 开启负载均衡

a.引入依赖

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。直接修改代码:

b.修改默认配置 默认即可,不用再application.ymal中修改

c.引导类上启用,这里比较特殊,在RestTemplate上启用

在RestTemplate的配置方法上添加@LoadBalanced注解:

@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate(new OkHttp3ClientHttpRequestFactory());}

修改调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:

服务名称:

@Componentpublic class UserDao {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;public User queryUserById(Long id) {// String url = "http://localhost:8081/user/" + id;// return this.restTemplate.getForObject(url, User.class);// 根据服务名称,获取服务实例//List<ServiceInstance> instances = discoveryClient// .getInstances("user-service-provider");// 因为只有一个UserService,因此我们直接get(0)获取// ServiceInstance instance = instances.get(0);// 获取ip和端口信息 不用硬编码// String baseUrl = "http://"+instance.getHost() + ":" +//instance.getPort()+"/user/";String baseUrl = "http://user-service-provider/user/";return this.restTemplate.getForObject(baseUrl + id, User.class);}}

1.3 源码跟踪

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。

显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor

1.debug启动:

2.断点:

3.刷新

4.F7进入方法

5.我们关心的是url的解析,鼠标指向execute,键盘按住ctrl,进入execute方法

6.鼠标指向doExecute,键盘按住ctrl,进入doExecute方法

7.

继续跟入execute方法:发现获取了8082端口的服务

再跟下一次,发现获取的是8081:

1.4 负载均衡策略

Ribbon默认的负载均衡策略是简单的轮询,我们可以测试一下:

编写测试类,在刚才的源码中我们看到拦截中是使用RibbonLoadBalanceClient来进行负载均衡的,其中有一个choose方法,是这样介绍的:

现在这个就是负载均衡获取实例的方法。

我们对注入这个类的对象,然后对其测试:

@RunWith(SpringRunner.class)@SpringBootTest(classes = UserConsumerDemoApplication.class)public class LoadBalanceTest {@AutowiredRibbonLoadBalancerClient client;@Testpublic void test(){for (int i = 0; i < 100; i++) {ServiceInstance instance = this.client.choose("user-service");System.out.println(instance.getHost() + ":" + instance.getPort());}}}

结果:

符合了我们的预期推测,确实是轮询方式。

我们是否可以修改负载均衡的策略呢?

继续跟踪源码,发现这么一段代码:

我们看看这个rule是谁:

这里的rule默认值是一个RoundRobinRule,看类的介绍:

这不就是轮询的意思嘛。

我们注意到,这个类其实是实现了接口IRule的,查看一下:

定义负载均衡的规则接口。

它有以下实现:

SpringBoot也帮我们提供了修改负载均衡规则的配置入口:

user-service:ribbon:

如果觉得《day3_Ribbon负载均衡_Hystrix熔断_Fein远程调用(restTemplate)_Zuul网关》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。