美文网首页一些收藏springcloud
3. SpringCloud之Ribbon使用

3. SpringCloud之Ribbon使用

作者: 天还下着毛毛雨 | 来源:发表于2022-04-02 22:52 被阅读0次
    image.png

    Ribbon 是一个独立的组件,是用来进行远程接口调用的,代码如下
    通过 getForObject 方法可以掉到用 micro-order 服务的,order/list 接口。然后在调用期间会存在负载均衡,micro-order 服务对应有几个服务实例就会根据负载均衡算法选择某一个去调用。

    1. 测试代码

    1.1. 启动两个订单服务

    端口号分别为9011,9012

    image.png

    1.2. 改造获取订单接口

    返回当前服务实例的占用的端口号,用来判断当前服务是哪个实例

    @RequestMapping("/order")
    @RestController
    public class OrderController {
    
        @Value("${server.port}")
        String port;
    
        @GetMapping("/list")
        public String getOrderList(String username) {
            return "该服务端口号:" + port + ",这是用户 :" + username + " 所有的订单信息";
        }
    
    }
    

    1.3. 调用用户服务的获取订单接口,

    @RequestMapping("/user")
    @RestController
    public class UserController {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    
        @GetMapping("/orderList")
        public String getOrderList(String username) {
            return restTemplate.getForObject("http://" + "micro-order" + "/order/list?username=" + username, String.class);
        }
    
    }
    

    会发现,对订单服务的调用会存在负载均衡,在两个订单服务之间 切来切去。

    image.png

    2. Ribbon 配置

    2.1. Application.properties 配置

    # 关闭 ribbon 访问注册中心 Eureka Server 发现服务,但是服务依旧会注册。
    #true 使用 eureka false 不使用。如果是false,那么表示要调用的服务列表从下面这个参数中获取,不然就从eureka-server中获取,这样扩容服务提供方的话,需要改配置文件与动态扩容的理念相悖,不建议大家使用
    ribbon.eureka.enabled=true
    spring.cloud.loadbalancer.retry.enabled=true
    ###指定调用的节点
    ###ribbon.eureka.enabled=false
    ##micro-order.ribbon.listOfServers=localhost:8001
    
    
    ##单位 ms ,请求连接超时时间
    #micro-order.ribbon.ConnectTimeout=1000
    ##单位 ms ,请求处理的超时时间
    #micro-order.ribbon.ReadTimeout=2000
    #micro-order.ribbon.OkToRetryOnAllOperations=true
    ##切换实例的重试次数
    #micro-order.ribbon.MaxAutoRetriesNextServer=2
    ##对当前实例的重试次数 当 Eureka 中可以找到服务,但是服务连不上时将会重试
    #micro-order.ribbon.MaxAutoRetries=2
    ##配置负载均衡
    #micro.order.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    #micro-order.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
    

    2.2 代码配置

    2.2.1. 使用@RibbonClients 加载针对某一个服务的ribbon配置

    这个配置类只针对 micro-order 服务,微服务系统里面有很多服务,这就可以区别化配置。

    /*
    * 这个是针对 micro-order服务的 ribbon配置
    * */
    @Configuration
    @RibbonClients(value = {
            @RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class)
    })
    // 也可以这样,只加载一个针对某个服务的ribbon配置
    //@RibbonClient(name = "micro-order",configuration = RibbonLoadBalanceMicroOrderConfig.class
    public class LoadBalanceConfig {
    
    }
    

    2.2.2. 配置 configuration

    配置类的时候,一定要注意,配置类不能陪@ComponentScan 注解扫描到,如果被扫描到了则该配置类就是所有服务共用的配置了。

    /*
    * 这个类最好不要出现在启动类的@ComponentScan扫描范围
    * 如果出现在@ComponentScan扫描访问,那么这个配置类就是每个服务共用的配置了
    * */
    @Configuration
    public class RibbonLoadBalanceMicroOrderConfig {
    
    //    @RibbonClientName
        private String name = "micro-order";
    
        @Bean
        @ConditionalOnClass
        public IClientConfig defaultClientConfigImpl() {
            DefaultClientConfigImpl config = new DefaultClientConfigImpl();
            config.loadProperties(name);
            config.set(CommonClientConfigKey.MaxAutoRetries,2);
            config.set(CommonClientConfigKey.MaxAutoRetriesNextServer,2);
            config.set(CommonClientConfigKey.ConnectTimeout,2000);
            config.set(CommonClientConfigKey.ReadTimeout,4000);
            config.set(CommonClientConfigKey.OkToRetryOnAllOperations,true);
            return config;
        }
        /*
        * 判断服务是否存活
        * 不建议使用
        * */
    //    @Bean
    //    public IPing iPing() {
    //        //这个实现类会去调用服务来判断服务是否存活
    //        return new PingUrl();
    //    }
     
        // 配置负载均衡,默认是轮训
        @Bean
        public IRule ribbonRule() {
            //线性轮训
            new RoundRobinRule();
            //可以重试的轮训
            new RetryRule();
            //根据运行情况来计算权重
            new WeightedResponseTimeRule();
            //过滤掉故障实例,选择请求数最小的实例
            new BestAvailableRule();
            return new RandomRule();
        }
    }
    
    

    3.Ribbon 单独使用

    Ribbon 是一个独立组件,可以脱离 springcloud 使用的.

    有这两个jar包就可以

    image.png

    相关文章

      网友评论

        本文标题:3. SpringCloud之Ribbon使用

        本文链接:https://www.haomeiwen.com/subject/owpxsrtx.html