当前位置: 首页 > news >正文

【SpringCloud】Ribbon定制化配置

文章目录

    • 使用Ribbon自带负载均衡算法
      • 添加负载均衡算法Configuration
      • RestTemplate使用上面负载均衡算法
    • 自定义负载均衡算法
      • 负载均衡算法实现
      • RestTemplate
      • 在Controller中使用该负载均衡算法
      • ServiceIInstance解释

使用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
{@Beanpublic 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开始。@Overridepublic 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;}// 在下面有解释ServiceInstanceServiceInstance 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);}
}
http://www.lryc.cn/news/128661.html

相关文章:

  • Mac terminal 每次打开都要重新配置文件
  • el-button实现按钮,鼠标移入显示,移出隐藏
  • uniapp+uview封装小程序请求
  • idea常见错误大全之:解决全局搜索失效+搜索条件失效(条件为空)+F8失灵
  • 【论文阅读】基于深度学习的时序预测——LTSF-Linear
  • 02.FFMPEG的安装和添加硬件加速自编译
  • elementUI 的上传组件<el-upload>,自定义上传按钮样式
  • 【卷积神经网络】卷积,池化,全连接
  • 【SA8295P 源码分析】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总
  • 以太网(一):PoE供电
  • 骨传导耳机游泳能戴吗?骨传导游泳耳机哪个牌子好?
  • 18万字应急管理局智慧矿山煤矿数字化矿山技术解决方案WORD
  • 【mysql】MySQL CUP过高如何排查?
  • lua实现http的异步回调
  • 云服务 Ubuntu 20.04 版本 使用 Nginx 配置SSL证书和nginx从HTTP跳转到HTTPS
  • 隧道代理技术解析:为批量数据采集提供强大支持
  • 小程序制作教程:从零开始搭建企业小程序
  • Redis-秒杀
  • 2022年下半年信息安全工程师下午真题及答案解析
  • 【前端|Javascript第5篇】全网最详细的JS的内置对象文章!
  • Python pycparser(c文件解析)模块使用教程
  • 解决IDEA tomcat控制台只有server日志
  • Java版本+企业电子招投标系统源代码+支持二开+Spring cloud tbms
  • FinalShell SSH工具安装教程及编辑窗口修改背景颜色,自定义背景图片,修改字体,修改快捷键(详细图文教程)
  • uni-app中监听网络状态,并在嵌入webView页面的组件中添加网络监测
  • TP5前后端分离RBAC权限管理API
  • p-级数的上界(Upper bound of p-series)
  • QT如何打包
  • 【c语言】通讯录(动态版+文件+背景音乐)含源码
  • c#后端获实体类多列最大值