SpringCloud之Ribbon使用示例解析

 更新时间:2023年06月22日 10:06:19   作者:天还下着毛毛雨  
这篇文章主要为大家介绍了SpringCloud之Ribbon使用示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

Ribbon 是一个独立的组件,是用来进行远程接口调用的,代码如下

通过 getForObject 方法可以掉到用 micro-order 服务的,order/list 接口。

然后在调用期间会存在负载均衡,micro-order 服务对应有几个服务实例就会根据负载均衡算法选择某一个去调用。

1. 测试代码

1.1. 启动两个订单服务

端口号分别为9011,9012

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);
    }
}

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

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包就可以

以上就是SpringCloud之Ribbon使用示例解析的详细内容,更多关于SpringCloud Ribbon使用的资料请关注脚本之家其它相关文章!

相关文章

  • Spring框架AOP基础之代理模式详解

    Spring框架AOP基础之代理模式详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-11-11
  • Java Spring动态生成Mysql存储过程详解

    Java Spring动态生成Mysql存储过程详解

    这篇文章主要介绍了Java Spring动态生成Mysql存储过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Spring AOP入门Demo分享

    Spring AOP入门Demo分享

    这篇文章主要介绍了Spring AOP入门Demo分享,涉及创建maven项目,编写切面类,通过bean配置关联等相关内容,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Java案例之HashMap集合存储学生对象并遍历

    Java案例之HashMap集合存储学生对象并遍历

    这篇文章主要介绍了Java案例之HashMap集合存储学生对象并遍历,创建一个HashMap集合,键是学号(String),值是学生对象(Student),存储三个键值对元素并遍历,下文具体操作需要的朋友可以参考一下
    2022-04-04
  • Java easyExcel实现导入多sheet的Excel

    Java easyExcel实现导入多sheet的Excel

    这篇文章主要为大家详细介绍了如何使用Java easyExcel实现导入多sheet的Excel,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2025-06-06
  • java如何通过IP解析地理位置

    java如何通过IP解析地理位置

    这篇文章主要介绍了java如何通过IP解析地理位置的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • java实现的n*n矩阵求值及求逆矩阵算法示例

    java实现的n*n矩阵求值及求逆矩阵算法示例

    这篇文章主要介绍了java实现的n*n矩阵求值及求逆矩阵算法,结合具体实例形式分析了java基于数组的矩阵定义、遍历、运算等相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • JavaAPI中BigInteger、BigDecimal的使用方法及应用

    JavaAPI中BigInteger、BigDecimal的使用方法及应用

    这篇文章主要给大家介绍了关于JavaAPI中BigInteger、BigDecimal的使用方法及应用,BigInteger是Java中用于表示任意大小整数的类,它提供了加、减、乘、除等多种运算方法,适用于大整数处理和高精度计算场景,需要的朋友可以参考下
    2024-11-11
  • springboot多文件或者文件夹压缩成zip的方法

    springboot多文件或者文件夹压缩成zip的方法

    最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类,下面通过本文给大家分享springboot多文件或者文件夹压缩成zip的方法,感兴趣的朋友一起看看吧
    2024-07-07
  • Java中ASCII到十六进制的转换指南

    Java中ASCII到十六进制的转换指南

    在软件开发、网络通信与底层系统交互中,ASCII 字符与十六进制表示之间的转换是一项基础且高频的操作,本文将从计算机编码的底层逻辑出发,结合 Java 平台的特性,系统探讨 ASCII 转十六进制的核心机制、应用场景、设计考量与最佳实践,需要的朋友可以参考下
    2026-05-05

最新评论