Ribbon

Ribbon

ribbon是Spring Cloud基于Netflix Ribbon实现的客户端的负载均衡

1. 负载均衡策略

负载均衡接口:com.netflix.loadbalancer.IRule

  1. 随机策略:RandomRule
    • 先获取所有服务列表,服务总数范围产生一个随机数,使用个随机数从列表选择服务调用
  2. 轮询策略:RoundRobinRule
    • 每次线性加一,与服务总数求余得到下标,根据下标选择服务

2. ribbon使用

  1. 创建服务

    1. 创建两个服务:ribbon-provide-1,ribbon-provide-2

    2. 端口分别改为:8082,8083

    3. 将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);
            }
        }
        
    4. 向外提供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);
            }
        }
        
  2. 创建消费端

    1. 无需引入jar包

    2. 设置负载均衡策略

      • @Configuration
        public class BeanConfig {
        
            @Bean
            @LoadBalanced
            public RestTemplate restTemplate(){
                return new RestTemplate();
            }
        
            @Bean
            public IRule iRule(){
                return new RoundRobinRule();
            }
        
        }
        
    3. 设置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);
            }
        
        }
        
    4. 端口改为81

  3. 测试

    1. 分别启动两服务端和消费端

    2. 访问链接:localhost:81/user/getUserById/276

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nKY94Wf4-1665555228600)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221011161915924.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bbOrISh-1665555228602)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221011161930021.png)]

    3. 多次访问发现服务端口交替轮询

    4. 将消费端轮询策略改为随机,即BeanConfig

      • @Bean
        public IRule iRule(){
            return new RandomRule();
        }
        
    5. 再次访问

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkEIv91o-1665555228603)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221011162415360.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3Upex48-1665555228603)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221011162434943.png)]

      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5QZjzpv-1665555228604)(C:\Users\wangp\AppData\Roaming\Typora\typora-user-images\image-20221011162539918.png)]

    6. 多次访问发现服务端口果然是随机的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值