一、前期准备
先创建一个注册中心,一个消费者服务,一个生产者服务,由于之前写过,这里不多写了,请参考前面的博文。
使用springCloud构建微服务实战:https://blog.csdn.net/jiankang66/article/details/90084845
二、本篇主题
在生产环境中,各个微服务都会部署多个实例,服务消费者需要将请求分摊到多个服务提供者上,在微服务中,当Ribbon与Eureka配合使用时,Ribbon可基于某种算法,自动地帮助消费者去请求,因为feginClient已经默认使用了Ribbon,只需要引入fegin的依赖就可以了。
1、在上篇的基础上,我们新建一个与上一个provider生产者一样的服务,只是端口号不一样,应用名与上一个一致。这时候,我们有了以下的服务:
(1)一个注册中心
(2)两个生产者
(3)一个消费者
2、在两个生产者中写同样的Controller,但是打印的日志不一样。
(1)provider1中的Controller方法为:
@RestController public class TestController { //打印日志的属性 private static final Logger LOGGER= LoggerFactory.getLogger(TestController.class); @RequestMapping(value = "/count",method = RequestMethod.GET) public String count(@RequestParam ("count") int count){ LOGGER.debug("provider1第{}次访问",count); return "1111111111111111111"; } }
(2)provider2中Controller的方法与provider1一样,这是打印的日志不一样。
@RequestMapping(value = "/count",method = RequestMethod.GET) public String count(@RequestParam("count") int count){ LOGGER.info("provider2第{}次访问",count); return "222"; }
3、对消费者进行操作
(1)在Controller中添加一个测试的方法,该方法循环调用十次生产者的方法。
@RequestMapping("/mcount") public String count(){ for(int i=1;i<11;i++){ schedualServiceHi.count(i); } return "负载均衡完成!"; }
(2)在SchedualServiceHi接口中添加调用生产者的方法。
@FeignClient(name= "myprovider",fallback = TestFeignImpl.class) public interface SchedualServiceHi { @RequestMapping(value = "/count",method = RequestMethod.GET) public String count(@RequestParam("count") int count); }
三、效果展示
1、将所有项目运行,打开浏览器请求消费者中mcount的方法。
查看两个provider的打印日志,如下:
(1)provider1的打印日志:
(2)provider2的打印日志:
从中可以看出这十次是轮询访问所有生产者的,实现了负载均衡。
四、对负载均衡策略实现自定义
1、引入springCloud的ribbon依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
2、在配置类中设置策略方法
Ribbon的核心组件是IRule,是所有负载均衡算法的父接口,他的每一个子类都是一种负载均衡算法。例如:
(1)RoundRobinRule 轮询
(2)RandomRule 随机
上一步结果是默认的策略轮询。
3、修改策略时,配置类代码如下:设置为随机策略.
@Configuration public class ConfigBeans { @Bean public IRule myRule(){ return new RandomRule(); } }
4、结果展示
(1)provider1的日志:
(2)provider2的日志:
可以很容易看出,结果是随机访问生产者的。
五、总结
通过以上操作,我们实现了微服务负载均衡的功能,