SpringCloud之Ribbon使用示例解析
作者:天还下着毛毛雨
这篇文章主要为大家介绍了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使用的资料请关注脚本之家其它相关文章!