代码编织梦想

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

Ribbon负载均衡和RestTemplate使用:https://blog.csdn.net/qq_42402854/article/details/111088360

一、Nacos使用Ribbon

1、引入依赖

由于 nacos-discovery依赖了 Ribbon,所以我们不需要再引入 Ribbon依赖。

        <!-- nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 不需要再引入 Ribbon的依赖-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring‐cloud‐starter‐netflix‐ribbon</artifactId>-->
<!--        </dependency>-->

在这里插入图片描述

2、开启负载均衡

开启 @LoadBalanced 与 Ribbon 的集成。

RestTemplate 添加 @LoadBalanced注解,让RestTemplate在请求时拥有客户端负载均衡的能力。使用 RestTemplate进行服务调用。

@Configuration
public class RestTemplateConfig {
    
    // @Bean
    // @LoadBalanced
    // public RestTemplate restTemplate() {
    //     return new RestTemplate();
    // }
 
	// 推荐builder模式创建 RestTemplate
	@Bean
	@LoadBalanced  // Nacos注册中心,默认使用 Ribbon 负载均衡
	public RestTemplate restTemplate(RestTemplateBuilder builder){
		RestTemplate restTemplate = builder.build();
		return restTemplate;
	}

}

3、使用 RestTemplate进行服务调用

    @Autowired
    private RestTemplate restTemplate; //默认是轮询

	@RequestMapping(value = "/findOrderByUserId/{id}")
	public R findOrderByUserId(@PathVariable("id") Integer id) {
		log.info("根据userId=" + id + "查询订单信息");

		// restTemplate调用, url写死
		//String url = "http://localhost:18082/order/findOrderByUserId/" + id;

		/**
		 * Nacos注册中心,默认使用 Ribbon 负载均衡,restTemplate需要添加@LoadBalanced注解。
		 * 使用微服务名:ip:port替换为app-order
		 */
		String url = "http://app-order/order/findOrderByUserId/" + id;

		R result = restTemplate.getForObject(url, R.class);
		return result;
	}

浏览器访问测试ok:http://localhost:18081/app-user/user/findOrderByUserId/1,返回数据:

在这里插入图片描述

二、Ribbon负载均衡策略

1、修改默认负载均衡策略

修改application.yml。指定微服务调用时,使用对应的负载均衡算法。比如指定 Nacos提供的负载均衡策略。

# 被调用的微服务名
app-order:
  ribbon:
    # 指定使用Nacos提供的负载均衡策略(基于随机&权重)
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

2、自定义负载均衡策略

通过实现 IRule 接口或者继承 AbstractLoadBalancerRule类可以自定义负载策略,主要的选择服务逻辑在 choose 方法中。

2.1 创建自定义负载策略类

@Slf4j
public class MyCustomRandomRule extends AbstractLoadBalancerRule {

	@Override
	public Server choose(Object key) {
		ILoadBalancer loadBalancer = this.getLoadBalancer();

		// 获得当前请求的服务的实例
		List<Server> reachableServers = loadBalancer.getReachableServers();

		// 随机
		int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
		Server server = reachableServers.get(random);
		log.info("随机获取服务实例:server.port={}", server.getPort());

		return server;
	}

	@Override
	public void initWithNiwsConfig(IClientConfig iClientConfig) {

	}
}

2.2 配置自定义的策略

修改application.yml。

# 被调用的微服务名
app-order:
  ribbon:
    # 自定义的负载均衡策略(基于随机)
    NFLoadBalancerRuleClassName: com.charge.xxx.MyCustomRandomRule

在这里插入图片描述

3、开启饥饿加载

Ribbon默认懒加载,表示只有在发起服务调用时才会加载客户端。如果网络情况不好,在第一次进行服务调用会超时。

在这里插入图片描述

我们可以开启 Ribbon饥饿加载,即服务启动时就加载客户端,解决第一次调用慢的问题。

ribbon:
  eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置那个微服务名使用ribbon饥饿加载,多个使用逗号分隔
    clients: app-order 

在这里插入图片描述

– 求知若饥,虚心若愚。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42402854/article/details/127171970

springcloud使用alibaba的nacos注册中心,以及自定义ribbon使用-爱代码爱编程

文章里将会讲到,如何部署nacos server服务,springcloud中如果使用,以及服务的负载均衡,自定义负载均衡规则等等。 现部署nacos server 这里我就直接部署单机的了,并连接mysql数据库作为数据源 这个是官方教程,以及nacos包下载地址,sql语句下载地址 https://nacos.io/zh-cn/docs/cluste

Nacos 集成 Ribbon 客户端负载均衡源码分析-爱代码爱编程

Spring Cloud Nacos & Ribbon Nacos 为了适应 Spring Cloud 技术栈和在 Spring Cloud Alibaba 之前的 Spring Cloud Netflix 技术栈保持兼容,所以 Nacos 需要实现和 Spring Cloud Netfilx Ribbon 的集成,用在服务发现,以及服务

SpringCloud-Nacos+Ribbon-爱代码爱编程

SpringCloud-Nacos+Ribbon Nacos概述配置中心负载均衡流程负载策略类型配置策略 Nacos概述 服务治理和配置中心,支持动态配置刷新 @RefreshScope 使用配置类来创建bean时,若要实现注入bean的刷新,需要在配置类和Bean创建方法上均加上@RefreshScope注解。在对应配置被修改后,所有开启

SpringCloud-Nacos+Ribbon+Gateway-爱代码爱编程

SpringCloud-Gateway 概述统一接入流量监控安全防护整合NacosGateway配置项路由Predicates网关鉴权 概述 系统唯一对外的入口,介于客户端和服务端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。 统一接入 智能路由AB测试、灰度测试负责均衡,容灾处理日志埋点流量监控 限流处理服

Nacos下 Ribbon 原理分析-爱代码爱编程

Ribbon 原理解析 1 初始化 Ribbon 配置信息 在 nacos 作为注册中心的项目中,需要引入服务发现的依赖<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-al

SpringCloud第05讲:服务发现Nacos+Ribbon实现负载均衡-爱代码爱编程

一、SpringCloudAlibaba微服务全景架构 一、Nacos介绍及下载安装 Nacos介绍请参考:https://nacos.io/zh-cn/docs/what-is-nacos.html 下载:https://github.com/alibaba/nacos/releases?page=3 安装方法:https://nac

ribbon+nacos集成问题-爱代码爱编程

由于项目问题,只能使用zuul做网关,所以还是使用的Netflix 这一套,但是要接入nacos做服务注册,这里就会导致一个问题 provider注册到nacos,还得让网关能从nacos拉取serverList,通过ribbon实现负载均衡的话,ribbon的serverList默认就是eureka实现的,想用nacos就得把ribbon的serv

微服务入门:Ribbon与Nacos-爱代码爱编程

文章目录 微服务入门:Ribbon与Nacos一、Ribbon概论二、Ribbon实现原理三、常用的Ribbon负载均衡策略四、饥饿加载五、Nacos注册中心1、Nacos简介2、将服务注册到nacos3、服务分级存储模型(1)、配置集群(2)、配置集群的负载均衡策略4、环境隔离(1)、创建namespace(2)、配置namespace六、Nac

ribbon负载均衡(四)springcloud ribbon负载均衡之nacos实现_jzjie007的博客-爱代码爱编程

SpringCloud Ribbon 负载均衡实现-Nacos安装 文章目录 SpringCloud Ribbon 负载均衡实现-Nacos安装1.下载Nacos1.1 安装Nacos, 创建Nacos数据库1.2 导入 nacos-mysql.sql 执行1.3 配置 RestTemplate访问Order订单服务1.4 配置 conf/app

spring cloud nacos 集成ribbon_喜欢小苹果的码农的博客-爱代码爱编程

1、注册 @Configuration(proxyBeanMethods = false) @ConditionalOnRibbonNacos public class NacosRibbonClientConfiguration { @Autowired private PropertiesFactory propertiesFactor

使用nacos和ribbon实现负载均衡_stars228的博客-爱代码爱编程

一、Ribbon Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将Http请求(Feign)自动转换成客户端负载均衡的服务调用。微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,也就是说, Sp

nacos中使用ribbon_nacos ribbon-爱代码爱编程

我们引入了nacos-discovery的依赖 <!--nacos的服务注册与发现依赖--> <dependency> <groupId>com.alibaba.cloud<

nacos集成ribbon_nacos整合ribbon-爱代码爱编程

# 1.集成Ribbon ,使用loadBalancerClient,添加访问服务(本文才用的是nacos 作为注册中心),刚开始一直报找不到spring-cloud-producer服务,查找资料显示用loadBalancerClient public String sayHelloService(String name) {