spring cloud之ribbon复习回顾
其实在项目中直接使用ribbon时不多,大多是使用feign的,其实feign底层也是通过ribbon构建的,主要记忆一下计算规则,ribbon的源码还是很不错的,还是值得学习的。
1、添加pom
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2、启动类注解
我没有在启动类添加注解,直接另外一个配置类@Configuration添加
3、添加配置
# 默认是轮训,都有随机、加权响应时间、重试,看具体业务和服务器搭配
#eureka-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
4、参照源码规则,自己编写规则
这里是通过hashcode在hash闭环定义的,当每台服务器hashcode在hash闭环的对应位置后,每次请求直接定位到hash中顺时针寻找最近的服务器
package com.xl.ribbon.consumer.rules;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.condition.RequestConditionHolder;import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;@NoArgsConstructor
public class MyRule extends AbstractLoadBalancerRule implements IRule {@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}@Overridepublic Server choose(Object key) {HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();String uri = request.getServletPath() + "?" + request.getQueryString();return route(uri.hashCode(), getLoadBalancer().getAllServers());}public Server route(int hashId, List<Server> servers) {if (CollectionUtils.isEmpty(servers)) {return null;}TreeMap<Long, Server> serverMap = new TreeMap<>();servers.forEach(server -> {// 虚化若干个服务节点,到环上for (int i = 0; i < 8; i++) {long hash = hash(server.getId() + i);serverMap.put(hash, server);}});long hash = hash(String.valueOf(hashId));SortedMap<Long, Server> last = serverMap.tailMap(hash);// 当request URL的hash值大于任意一个服务器对应的hashKey,// 取serverMap中的第一个节点if (last.isEmpty()) {Server value = serverMap.firstEntry().getValue();last.put(hash, value);}return last.get(last.firstKey());}public long hash(String key) {MessageDigest md5;try {md5 = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}byte[] keyBytes = null;try {keyBytes = key.getBytes("UTF-8");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}md5.update(keyBytes);byte[] digest = md5.digest();long hash = (digest[2] & 0xFF << 16) | (digest[1] & 0xFF) << 8 | (digest[0] & 0xFF);return hash & 0xffffffffL;}
}
5、规则配置
其实直接配置在application.properties也可以,这里我是在一个配置文件
package com.xl.ribbon.consumer;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.xl.ribbon.consumer.rules.MyRule;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Created by lig on 2024/10/12.*/
@Configuration
//@RibbonClient(name = "eureka-client", configuration = com.netflix.loadbalancer.RandomRule.class)
@RibbonClient(name = "eureka-client", configuration = MyRule.class)
public class RibbonConfiguration {
//
// @Bean
// public IRule defaultLBStrategy() {
// return new RandomRule();
// }}
6、接口
package com.xl.ribbon.consumer;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;/*** Created by lig on 2024/10/12.*/
@RestController
public class RibbonController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/sayHi")public String sayHi() {return restTemplate.getForObject("http://eureka-client/sayHi", String.class);}}
总结
其实在实际项目中ribbon编写符合自己业务的规则还是挺复杂的,用途还是挺广的.
相关文章:
spring cloud之ribbon复习回顾
其实在项目中直接使用ribbon时不多,大多是使用feign的,其实feign底层也是通过ribbon构建的,主要记忆一下计算规则,ribbon的源码还是很不错的,还是值得学习的。 1、添加pom <dependency><groupId>org.spr…...
RFT 强化微调
OpenAI在今天发布的新技术,RFT结合了SFT和RL的优化算法,与传统的监督微调不同,强化微调旨在通过任务训练让模型掌握复杂推理能力,而不仅仅是“记住答案”。 什么是强化微调 强化微调是通过高质量任务数据和参考答案优化大语言模型…...
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …...
分布式搜索引擎Elasticsearch
Elasticsearch是一个基于Lucene库的开源分布式搜索引擎,它被设计用于云计算中,能够实现快速、near-real-time的搜索,并且可以进行大规模的分布式索引。 以下是一个简单的Python代码示例,展示如何使用Elasticsearch的Python客户端…...
在Vue.js中生成二维码(将指定的url+参数 生成二维码)
在Vue.js中生成二维码,你可以使用JavaScript库如qrcode或qr.js。以下是一个简单的例子,展示如何在Vue组件中使用qrcode库将指定的URL加上参数生成二维码。 首先,你需要安装qrcode库。如果你使用的是npm或yarn,可以通过命令行安装…...
统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍
文章来源:统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构:X86(海光C86-3G 3350) OS版本信息:1070桌面专业版 软件信息:postgresql-14.2postgis-3.2 …...
数字图像处理(16):RGB与HSV互转
(1)HSV颜色模型:HSV颜色模型,又称为六角锥体模型,以色调(H)、饱和度(S)、亮度(V)为基础,能够更加自然地表现和处理颜色,因…...
web组态可视化编辑器
随着工业智能制造的发展,工业企业对设备可视化、远程运维的需求日趋强烈,传统的单机版组态软件已经不能满足越来越复杂的控制需求,那么实现web组态可视化界面成为了主要的技术路径。 行业痛点 对于软件服务商来说,将单机版软件转…...
数组 - 八皇后 - 困难
************* C topic: 面试题 08.12. 八皇后 - 力扣(LeetCode) ************* Good morning, gays, Fridary angin and try the hard to celebrate. Inspect the topic: This topic I can understand it in a second. And I do rethink a movie, …...
【分布式】Redis分布式缓存
一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中,多台服务器共同对外提供服务,为了提高系统的性能和可扩展性,通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...
Ubuntu——extrepo添加部分外部软件源
extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具,它的主要作用是简化和管理外部软件源(repositories)的添加和更新。通过使用 extrepo,用户可以方便地添加、删除和管理第三方软件源,而不需要手动编辑源列表…...
评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能
摘要 论文地址:https://arxiv.org/pdf/2403.05075 近年来,机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率,以期实现人工通用智能(AGI)。其中,大规模语言模型&a…...
如何查看电脑刷新率
Windows 系统 通过显示设置查看: 右键点击桌面空白处,选择 “显示设置”。在打开的窗口中,找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中,选择 “监视器” 选项卡,即可看到当前的屏幕刷新率。使用 …...
mysql集群MHA方式部署
1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-8.0.28192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …...
第十七章 使用 MariaDB 数据库管理系统
1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代,互联网上每天都会生成海量的数据信息,数据库技术也从最初只能存储简单的表格数据的单一集中存储模式,发展到了现如今存储海量…...
rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)
1.插件版本 插件地址:Community Plugins | RabbitMQ rabbitmq插件需要对应的版本,根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是: 所以我选择插件版本是: 下载 .ez文…...
Unity性能优化---动态网格组合(一)
网格组合是将 Unity 中的多个对象组合为一个对象的技术。因此,在多物体的场景中,使用网格组合,会有效的减少小网格的数量,最终将得到一个包含许多小网格的大网格游戏对象,这将提高游戏或模拟器的性能。在Unity 的 “St…...
Appium:安装uiautomator2失败
目录 1、通过nmp安装uiautomator2:失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2:失败 我先是通过npm安装的uiautomator2,也显示已经安装成功了: npm install -g …...
电子信息工程自动化 单片机彩灯控制
摘要 随着社会经济和科学技术的不断进步,人们在保持发展的同时,环境带给人类的影响已经不足以让我们忽视,所以城市的美化问题慢慢的进入了人们的眼帘,PLC的产生给带电子产品带来了巨大变革,彩灯的使用在城市的美化中变…...
word poi-tl 表格功能增强,实现表格功能垂直合并
目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加(插件实现)MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中,word文档需要垂直合并表格&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
在 Kubernetes 集群中,如何在保障应用高可用的同时有效地管理资源,一直是运维人员和开发者关注的重点。随着微服务架构的普及,集群内各个服务的负载波动日趋明显,传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...
