负载均衡即是将用户的请求平摊的分配到多个服务上,从而达到高可用的目的。
一般的负载均衡应用采取的是收集全部请求进行集中式的分配,而ribbon是从服务中心获取地址,为消费者挑选合适的对象,属于进程式的负载均衡是相对于消费者,从消费者出发的。
1.ribbon使用
ribbon作为一个软负载均衡,大部分情况都是和其他应用进行组合,本次采用eureka配置。
ribbon本身集成在Netflix中,所以有Netflix的jar时候不需要导入额外的ribbon依赖,避免造成依赖版本冲突。
2.template
一般ribbon是和template配合使用,首先在配置类中添加loadbalance注解。
@Configuration public class AppConfig { /** * 注入restTemplate,请用请求rest接口 * @return */ @Bean // 标注此注解后,RestTemplate就具有了客户端负载均衡能力 // 负载均衡技术依赖于的是Ribbon组件~ // RestTemplate都塞入一个loadBalancerInterceptor 让其具备有负载均衡的能力 @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
在controller中进行测试,用restTemplate测试。
@RestController @Slf4j public class OrderController { public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE"; @Resource private RestTemplate restTemplate; @GetMapping("/consumer/payment/get/{id}") public CommonResult<PayMent> getPayment(@PathVariable("id") Long id){ return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class); } }
多次请求此页面的时候,会交替的选择两个集群,这个涉及到负载均衡的规则下面介绍,
3.负载均衡。
ribbon涉及到的负载均衡策略有:
默认情况下是用的轮询模式,即每访问一次更换一个服务提供者,轮询着采用。
同时自己也可以进行自定义模式,但自己创建的配置类需要注意文件的位置不能和启动类平级或在其子包下。可以采用如下放置。
附上改变策略模式的配置类,这里换成了随机策略,即每次选择都是随机的服务提供者。
@Configuration public class MySelfRule { @Bean public IRule myrule(){ return new RandomRule(); } }
当然配置类也需要分配给容器管理,最后也是需要在启动类中进行说明。
@EnableEurekaClient @SpringBootApplication @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class,args); } }
轮询算法等都是有源码可分析的,有兴趣可自行搜索源码分析。
本篇所有代码均在GitHub: