【SpringCloud】Ribbon定制化配置

2023-11-17

使用Ribbon自带负载均衡算法

添加负载均衡算法Configuration

//注意package位置假设启动器为@ComponentScan("com.test.springcloud")
package com.test.config
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MySelfRule
{
    @Bean
    public IRule myRule()
    {
        return new RandomRule();//定义为随机
    }
}

注意:
官方文档明确给出了警告
这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,
否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。

RestTemplate使用上面负载均衡算法

package com.test.springcloud.config
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig
{
    @Bean
    @LoadBalanced //添加负载均衡配置注解,如果自定义的话不需要使用该注解否则报错
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

自定义负载均衡算法

负载均衡算法实现

定义负载均衡算法接口

public interface LoadBalancer
{
    ServiceInstance instances(List<ServiceInstance> serviceInstances);
}

实现负载均衡算法

@Component
public class MyLB implements LoadBalancer
{
	//通过CAS(乐观锁)的方式进行,本质是通过CompareAndSet,先比较后赋值的方式,只有当前值和期望值相同时才可以进行赋值
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    public final int getAndIncrement()
    {
        int current;
        int next;

        do {
            current = this.atomicInteger.get();
            next = current >= 2147483647 ? 0 : current + 1;
        }while(!this.atomicInteger.compareAndSet(current,next));
        System.out.println("*****第几次访问,次数next: "+next);
        return next;
    }

    //负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从1开始。
    @Override
    public ServiceInstance instances(List<ServiceInstance> serviceInstances)
    {
        int index = getAndIncrement() % serviceInstances.size();

        return serviceInstances.get(index);
    }
}

以上实现负载均衡算法的instance可自定义

RestTemplate

package com.test.springcloud.config
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig
{
    @Bean
    //@LoadBalanced //去掉这个注解
    public RestTemplate getRestTemplate()
    {
        return new RestTemplate();
    }
}

在Controller中使用该负载均衡算法

public class Controller{
	@GetMapping(value = "/consumer/payment/lb")
    public String getPaymentLB()
    {
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        if(instances == null || instances.size() <= 0)
        {
            return null;
        }
        // 在下面有解释ServiceInstance
        ServiceInstance serviceInstance = loadBalancer.instances(instances);
        URI uri = serviceInstance.getUri();
        return restTemplate.getForObject(uri+"/payment/lb",String.class);

    }

}

ServiceIInstance解释

ServiceInstance 是 Spring Cloud 提供的一个接口,用于表示服务的实例信息。它提供了获取服务实例的相关信息和元数据的方法。
ServiceInstance 接口定义了以下常用方法:

  • String getServiceId(): 获取服务名称(serviceId)。
  • String getHost(): 获取服务实例的主机名。
  • int getPort(): 获取服务实例的端口号。
  • boolean isSecure(): 返回服务实例是否使用安全协议(如 HTTPS)进行通信。
  • URI getUri(): 获取服务实例的完整 URI。
  • Map<String, String> getMetadata(): 返回服务实例的元数据,这些元数据可以由服务提供方自定义。
  • 通过使用 DiscoveryClient(服务发现客户端)获取到的服务实例列表,可以进一步使用 ServiceInstance 接口来获取每个服务实例的具体信息。
    示例:
@Autowired
private DiscoveryClient discoveryClient;

public void getServiceInstances(String serviceName) {
    List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
    for (ServiceInstance instance : instances) {
        String serviceId = instance.getServiceId();
        String host = instance.getHost();
        int port = instance.getPort();
        boolean isSecure = instance.isSecure();
        URI uri = instance.getUri();
        Map<String, String> metadata = instance.getMetadata();
        
        // 打印服务实例信息
        System.out.println("Service ID: " + serviceId);
        System.out.println("Host: " + host);
        System.out.println("Port: " + port);
        System.out.println("Is Secure: " + isSecure);
        System.out.println("URI: " + uri);
        System.out.println("Metadata: " + metadata);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【SpringCloud】Ribbon定制化配置 的相关文章

随机推荐

  • X509证书结构解析

    X509证书是采用DER编码的ASN1结构数据 Certificate SEQUENCE tbsCertificate TBSCertificate signatureAlgorithm AlgorithmIdentifier signat
  • 【技术干货】数字电路电平标准

    信号的逻辑电平经历了从单端信号到差分信号 从低速信号到高速信号的发展过程 最基本的单端信号逻辑电平为CMOS TTL 在此基础上随着电压摆幅的降低 出现LVCMOS LVTTL等逻辑电平 随着信号速率的提升又出现ECL PECL LVPEC
  • Qt 实现 360 安全卫士

    作者 一去 二三里 QQ 技术交流群 242790253 个人微信 iwaleon 加我微信 邀请入 500 人微信群 微信公众号 高效程序员 回想起来 这也算是一个有故事的代码 虽然时间比较久远 但还是记忆犹新 那就简单说说吧 也不枉费当
  • codevs代码分类总结

    由于要参加华为软件精英挑战赛 所以需要把以前做过的有关图论的问题翻出来复习一遍 但是关于图论也有很多分类 所以干脆就做一个总结 先对图论的相关题目过一遍 以后如果有时间 把其他分类的题目也过一遍 图论 也不是每个章节都做了题目 Floyd
  • Elasticsearch全文搜索与TF/IDF

    转载 https my oschina net stanleysun blog 1594220 一 TF IDF 1 TF TF Term Frequency 即词频 它表示一个词在内容 如某文章 中出现的次数 为了消除文档本身大小的影响
  • vue如何使用ueditor富文本插件

    UEditor 是由百度 FEX前端研发团队 开发的所见即所得富文本web编辑器 具有轻量 可定制 注重用户体验等特点 开源基于MIT协议 允许自由使用和修改代码 话不多说看流程 一 显示效果如下 二 首先 下载 ueditor npm i
  • Mastercam软件安装包分享(附安装教程)

    目录 一 软件简介 二 软件下载 一 软件简介 Mastercam是一款广泛应用于机械加工领域的计算机辅助设计与计算机辅助制造 CAD CAM 软件 它由美国CNC软件公司开发 旨在帮助制造商设计和制造高精度的零部件 以下是Masterca
  • java Fileread用法及注意事项

    关于其创建 还有注意事项 package IOtest test1 import org junit Test import java io File import java io FileReader import java io IOE
  • 对线性代数库Eigen3中eulerAngles函数的理解

    编写程序时有时会遇到在四元数 旋转矩阵 欧拉角之间进行转换的操作 使用eulerAngles函数从旋转矩阵中获得欧拉角 了解其使用方法才能保证转换时不出错 头文件
  • 基于双参数蜜蜂算法解决车辆路径问题(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 群智能起源于自然环境中生物群体经过长期自然
  • ffmpeg 合并转换文件_使用FFmpeg转换媒体文件的快速指南

    ffmpeg 合并转换文件 有许多开源工具可用于编辑 调整和将多媒体准确地转换为您所需的内容 诸如Audacity或Handbrake之类的工具非常出色 但有时您只想快速将文件从一种格式更改为另一种格式 输入FFmpeg FFmpeg是处理
  • 机器学习实战—利用SVD简化数据

    一 SVD的应用 奇异值分解 优点 简化数据 去除噪声 提高算法的结果 缺点 数据转换难以理解 利用SVD能够实现用小得多的数据集来表示原始数据集 这样做 实际上是去除了噪声和冗余信息 当我们视图节省空间时 去除噪声和冗余信息是目标 但是我
  • 正睿OI补题(搜索)

    搜索 目录 P1036 NOIP2002 普及组 选数 P2392 kkksc03考前临时抱佛脚 P1025 NOIP2001 提高组 数的划分 P6201 USACO07OPEN Fliptile S P1460 USACO2 1 健康的
  • linux svn新增用户名密码,Linux环境SVN添加用户账号及密码

    一 检查Svn安装版本 svn version 结果为 root iZm5e9ujl2isnk0qfeeyyhZ svn version svn version 1 7 14 r1542130 compiled Apr 11 2018 02
  • OpenHarmony之轻量系统编译构建流程

    首先我们先来熟悉几个概念 子系统 子系统是一个逻辑概念 它由一个或多个具体的组件组成 OpenHarmony整体遵从分层设计 从下向上依次为 内核层 系统服务层 框架层和应用层 系统功能按照 系统 gt 子系统 gt 组件 逐级展开 在多设
  • sql语句常见问题

    between是否包括两端 与字段类型有关 数据库类型如果是data 则包括两端 如果是datatime 则不包括右边 时间转字符串 DATE FORMAT statistic date Y m d as statistic date SQ
  • obsidian移动端PC段同步

    参考内容 https zhuanlan zhihu com p 431124370 https www bilibili com read cv13339751 文章目录 1 安装坚果云 2 开启坚果云WebDAV 3 在FolderSyn
  • 转载--我与英语技术书籍

    原文 http www cnblogs com KnightsWarrior p EnglishTechBooks html 我与英语技术书籍 2013 09 05 00 01 by 圣殿骑士 17877 阅读 122 评论 收藏 编辑 前
  • 优达学城《DeepLearning》2-1:卷积神经网络

    本次由3部分组成 可视化卷积神经网络 设计和训练一个CNN来对MNIST手写数字分类 设计并训练一个CNN来对CIFAR10数据集中的图像进行分类 本次遇到的深度学习核心概念 SGD优化器 GD就是梯度下降 Gradient Descent
  • 【SpringCloud】Ribbon定制化配置

    文章目录 使用Ribbon自带负载均衡算法 添加负载均衡算法Configuration RestTemplate使用上面负载均衡算法 自定义负载均衡算法 负载均衡算法实现 RestTemplate 在Controller中使用该负载均衡算法