这是本人学习的总结,主要学习资料如下
- 马士兵教育
- 1、Ribbon简介
- 1.1、架构图
- 1.2、简单实现负载均衡
- 2、配置负载均衡策略
- 2.1、IRule
- 2.2、使用IRule简单示例
- 2.2.1、Overview
- 2.2.1、注入```IRule```
- 2.2.2、关联```IRule```和服务
1、Ribbon简介
我们都知道Ribbon
是用于负载均衡的。提供同一种服务的Client
可能有多个,比如有多个User Client
提供查询用户信息的服务,使用Ribbon
就能简单地达到负载均衡的效果。
1.1、架构图
想要使用Ribbon
,无论是服务提供者还是调用服务者都必须作为Client
注册到Server
中。
1.2、简单实现负载均衡
如果是使用RestTemplate
请求服务,那么可以在RestTemplate
的bean
配置上加上@LoadBalanced
注解即可。之后使用RestTemplate
调用服务就会自动实现负载均衡。这样的方式是循环轮询的调用服务。
@Configuration
public class RestConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
现在我们有两个UserClient
提供服务,user-client1
和user-client2
。用order-client
去调用11次,因为是循环轮询调用,会发现会交替调用user-client1
和user-client2
。
这是user-client1
和user-client2
的application.yml
,大部分配置都一样,只有port
不相同。spg.application.name
必须一样,不然Ribbon
会认为他们不提供同一种服务。
这里他们两都是user-client
。
spring:
application:
name: user-client
这是order-client
调用的代码。只需要指定spring.application.name
,路径和参数即可。
private int i = 0;
@Override
public String getUserInfo(String userId) {
return restTemplate.getForObject("http://user-client/getUserInfo?userId=" + i++, String.class);
}
可以看到两个user-client
循环提供服务。
2、配置负载均衡策略
2.1、IRule
IRule
是代表规则的接口,它的实现类有RoundRobinRule
,即默认调用服务的规则,循环调用。还有RondamRule
,随机选取服务调用。
还有其他的策略这里就不一一介绍了。总之IRule
及其实现类给我们提供了一些常见的选择策略。大部分情况我们可以选择其中一种直接用,不用再自己写。
2.2、使用IRule简单示例
2.2.1、Overview
- 配置
IRule
的bean,将其中一个实现类注入到Spring中。这里我将选取RandomRule
注入。 - 将注入的
IRule
与具体的服务客户端关联起来,让Ribbon
知道什么服务器用什么规则。在这里服务者是user-client
,我们需要把这个和刚才注入的IRule
绑定起来。
通过以上两步就可以自定义负载均衡策略。
2.2.1、注入IRule
@Configuration
public class OrderRibbonRule {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
2.2.2、关联IRule
和服务
在这里我有两台机器提供服务,他们都是spring.application.name=user-client
,我们需要将刚才的注入的IRule
和user-client
关联起来。
@Configuration
@RibbonClient(name = "user-client", configuration = OrderRibbonRule.class)
public class UserRibbonConfiguration {
}
之后通过http://localhost:9002/createOrder
访问多次,可以看到Ribbon
随机选取机器提供服务。