Ribbon
ribbon是Spring Cloud基于Netflix Ribbon实现的客户端的负载均衡
1. 负载均衡策略
负载均衡接口:com.netflix.loadbalancer.IRule
- 随机策略:RandomRule
- 先获取所有服务列表,服务总数范围产生一个随机数,使用个随机数从列表选择服务调用
- 轮询策略:RoundRobinRule
- 每次线性加一,与服务总数求余得到下标,根据下标选择服务
2. ribbon使用
-
创建服务
-
创建两个服务:ribbon-provide-1,ribbon-provide-2
-
端口分别改为:8082,8083
-
将UserServiceImpl实现改为
-
@Service public class UserServiceImpl implements UserService { @Value("${server.port}") private String port; public User getUserById(Integer id) { return new User(id, "王二狗,port:"+port, (id*13+id/3*20)%100); } }
-
-
向外提供controller访问
-
@RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable("id") Integer id) { return userService.getUserById(id); } }
-
-
-
创建消费端
-
无需引入jar包
-
设置负载均衡策略
-
@Configuration public class BeanConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } @Bean public IRule iRule(){ return new RoundRobinRule(); } }
-
-
设置controller
-
@RestController @RequestMapping("/user") public class UserController { @Resource private RestTemplate restTemplate; @GetMapping("/getUserById/{id}") public User getUserById(@PathVariable("id") Integer id) { //ribbon根据ribbon-provide获取服务列表,根据负载均衡策略决定替换为某服务的ip和port //问题:接口调用依旧是硬编码,耦合高,传参麻烦 String url = "http://"+"ribbon-provide"+"/user/getUserById/"+id; return restTemplate.getForObject(url, User.class); } }
-
-
端口改为81
-
-
测试
-
分别启动两服务端和消费端
-
访问链接:localhost:81/user/getUserById/276
-
多次访问发现服务端口交替轮询
-
将消费端轮询策略改为随机,即BeanConfig
-
@Bean public IRule iRule(){ return new RandomRule(); }
-
-
再次访问
-
多次访问发现服务端口果然是随机的
-