springcloud netflix ribbon 使用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
网络型负载均衡 NLB,每月750个小时 15LCU
简介: springcloud netflix ribbon 使用
<!--添加ribbon的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

再要使用的 studyuser 工程下 添加配置类 ,引入 @LoadBalanced

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {
@Autowired
private RestTemplate restTemplate;
 @GetMapping("/findOrderByUserId/{id}")
public R findOrderByUserId(@PathVariable("id")Integer id){
    // 添加@LoadBalanced
    String url = "http://order-server/order/findOrderByUserId/" + id;
    R result = restTemplate.getForObject(url, R.class);
    return result
 }
}

返回数据是该用户的订单信息

Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。



ribbon  其他配置


修改默认负载均衡策略

ribbon 负载均衡策略配置

在 studyuser  项目添加如下配置

package com.jiuge.user.config;
import com.alibaba.cloud.nacos.ribbon.NacosRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RibbonConfig {
    /**
     * 全局配置
     * 指定负载均衡策略
     * @return
     */
    @Bean
    public NacosRule IRule(){
        // 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机权重)
        return new NacosRule();
    }
}

在 yml 里面加上

order-server:
  ribbon:
    # 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

启动服务测试下

会出现如下输出

2021-08-04 10:32:03.002  INFO 12764 --- [nio-8010-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: order-server instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2021-08-04 10:32:03.012  INFO 12764 --- [nio-8010-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2021-08-04 10:32:03.054  INFO 12764 --- [nio-8010-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client order-server initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[192.168.2.73:8020],Load balancer stats=Zone stats: {unknown=[Zone:unknown;  Instance count:1;  Active connections count: 0;  Circuit breaker tripped count: 0;  Active connections per server: 0.0;]
},Server stats: [[Server:192.168.2.73:8020;  Zone:UNKNOWN;  Total Requests:0;  Successive connection failure:0;  Total blackout seconds:0;  Last connection made:Thu Jan 01 08:00:00 CST 1970;  First connection made: Thu Jan 01 08:00:00 CST 1970;  Active Connections:0;  total failure count in last (1000) msecs:0;  average resp time:0.0;  90 percentile resp time:0.0;  95 percentile resp time:0.0;  min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@1cd5336d

说明配置生效。

自定义负载均衡

在 studyuser 项目中 添加自定义类 NacosRandomWithWeightRule 继承  AbstractLoadBalancerRule

package com.jiuge.user.rule;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.ribbon.NacosServer;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
/**
 * @author jiuge
 * @version 1.0
 * @date 2021/8/4 10:34
 */
@Slf4j
public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule {
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {
    }
    @Override
    public Server choose(Object o) {
        DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer();
        String serviceName = loadBalancer.getName();
        log.info("serviceName == {}", serviceName);
        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();
        try {
            // nacos 基于权重的算法
            Instance instance = namingService.selectOneHealthyInstance(serviceName);
            return new NacosServer(instance);
        } catch (NacosException e) {
            log.error("获取服务实例异常:{}", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }
}

修改rule config配置bean

@Bean
public IRule ribbonRule(){
     return new NacosRandomWithWeightRule();
}

修改yml 中定义的负载均衡类

order-server:
  ribbon:
    # 指定使用Nacos提供的负载均衡策略(优先调用同一集群的实例,基于随机&权重)
    # NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule
    NFLoadBalancerRuleClassName: com.jiuge.user.rule.NacosRandomWithWeightRule

输出的结果为

2021-08-04 10:52:13.886  INFO 8036 --- [nio-8010-exec-1] c.jiuge.user.controller.UserController   : 根据userId:1查询订单信息
2021-08-04 10:52:14.236  INFO 8036 --- [nio-8010-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: order-server instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2021-08-04 10:52:14.246  INFO 8036 --- [nio-8010-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2021-08-04 10:52:14.283  INFO 8036 --- [nio-8010-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client order-server initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=order-server,current list of Servers=[192.168.2.73:8020],Load balancer stats=Zone stats: {unknown=[Zone:unknown;  Instance count:1;  Active connections count: 0;  Circuit breaker tripped count: 0;  Active connections per server: 0.0;]
},Server stats: [[Server:192.168.2.73:8020;  Zone:UNKNOWN;  Total Requests:0;  Successive connection failure:0;  Total blackout seconds:0;  Last connection made:Thu Jan 01 08:00:00 CST 1970;  First connection made: Thu Jan 01 08:00:00 CST 1970;  Active Connections:0;  total failure count in last (1000) msecs:0;  average resp time:0.0;  90 percentile resp time:0.0;  95 percentile resp time:0.0;  min resp time:0.0;  max resp time:0.0;  stddev resp time:0.0]
]}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@6bf1a891
2021-08-04 10:52:14.311  INFO 8036 --- [nio-8010-exec-1] c.j.user.rule.NacosRandomWithWeightRule  : serviceName == order-server

说明配置生效

饥饿加载

在进行服务调用的时候,如果网络情况不好,第一次调用会超时。

Ribbon默认懒加载,意味着只有在发起调用的时候才会创建客户端。

微服务上开启饥饿加载

ribbon:
  eager-load:
    # 配置order-server使用ribbon饥饿加载,多个使用逗号分隔
    clients: order-server
    # 开启ribbon饥饿加载
    enabled: true

测试接口, 第一次是稍微反应快点了

2021-08-04 11:04:09.032  INFO 2944 --- [n(1)-13.13.0.80] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-08-04 11:04:09.033  INFO 2944 --- [n(1)-13.13.0.80] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-08-04 11:04:09.055  INFO 2944 --- [n(1)-13.13.0.80] o.s.web.servlet.DispatcherServlet        : Completed initialization in 22 ms
2021-08-04 11:04:40.622  INFO 2944 --- [nio-8010-exec-1] c.jiuge.user.controller.UserController   : 根据userId:2查询订单信息
2021-08-04 11:04:40.663  INFO 2944 --- [nio-8010-exec-1] c.j.user.rule.NacosRandomWithWeightRule  : serviceName == order-server
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
2月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
展望未来,随着5G、边缘计算等新技术的兴起,微服务架构的设计理念将会更加深入人心,Spring Cloud和Netflix OSS也将继续引领技术潮流,为企业带来更为高效、灵活且强大的解决方案。无论是对于初创公司还是大型企业而言,掌握这些前沿技术都将是在激烈市场竞争中脱颖而出的关键所在。
63 0
|
2月前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
56 0
|
13天前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
39 15
|
13天前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
33 5
|
1月前
|
Cloud Native Java 对象存储
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
面向未来的架构设计:Spring Cloud和Netflix OSS在云原生环境下的发展趋势
46 1
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
44 1
|
2月前
|
Java 开发工具 对象存储
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
简化配置管理:Spring Cloud Config与Netflix OSS中的动态配置解决方案
46 2
|
2月前
|
消息中间件 Java 对象存储
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
52 2
|
2月前
|
Java 对象存储 开发者
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
故障隔离与容错处理:Hystrix在Spring Cloud和Netflix OSS中的应用
53 3
|
2月前
|
负载均衡 Java 对象存储
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
负载均衡策略:Spring Cloud与Netflix OSS的最佳实践
50 2