Springboot集成Netflix-ribbon、Enreka实现负载均衡-12

Netflix Ribbon简介

Netflix Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。

具体来说,Ribbon是一个客户端负载均衡器,可以在配置文件中列出所有的服务提供方机器,然后Ribbon会自动基于某种规则(如简单轮询、随机连接等)去连接这些机器。同时,Ribbon也提供了一系列完善的配置项,如连接超时、重试等。此外,还可以很容易地使用Ribbon实现自定义的负载均衡算法。

Ribbon属于进程内负载均衡,它只是一个类库,集成于服务消费方进程,消费方通过它来获取到服务提供方的地址。在Netflix的架构中,Ribbon通常与Eureka一起使用,Eureka是一个服务治理组件,用于服务的注册与发现,而Ribbon则负责在多个服务实例之间进行负载均衡。

涉及的模块

  • springcloud-eureka-server :18082 ,注册中心
  • springcloud-ribbon-server:18091, 18092, provider服务提供者
  • springcloud-ribbon-client:18090, consumer服务消费者
    在这里插入图片描述

springcloud-eureka-server 注册中心

可参考 Springboot集成Eureka实现服务注册中心一节的实现

springcloud-ribbon-server Provider模块

provider没有太多需要注意的事项,只需要注册到任意一个注册中心即可。
在这里插入图片描述

pom.xml

依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

application.properties配置

spring.profiles.active = dev
spring.application.name=springbootEurekaRibbonServer
server.port=18091eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone = http://127.0.0.1:18082/eureka

application-server2.properties配置

再添加另一个配置,名为application-server2.properties,主要就是个性一下端口号,配置如下:

#springboot Server
spring.application.name=springbootEurekaRibbonServer
spring.aop.auto=true
spring.aop.proxy-target-class=true# log4j
logging.config=classpath:log4j2.xml
logging.level.root=INFO
logging.level.org.springframework.web=ERROR#restful Server
server.port=18092
server.compression.enabled=true
server.compression.mime-types=application/json,application/octet-stream#swagger
springdoc.api-docs.enabled=true
springdoc.api-docs.path=/api-schemaswagger-config.group = default-group
swagger-config.description= The following is a restful-api list of {} application, and you can browse or test them to determine if they are working as you expect.
swagger-config.version=V1.0
swagger-config.urlPattern=/**
swagger-config.base-package=com.korgs
swagger-config.authorization-key-name=token
swagger-config.wiki = https://korgs.blog.csdn.net/eureka.client.register-with-eureka=true
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone = http://127.0.0.1:18082/eureka

SpringbootApplication启动类

注意@GetMapping("/helloworld")为供测试的服务接口。同时别忘记了@EnableDiscoveryClient注解,用来注册到Enreka。

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class SpringbootEurekaServerRibbonApplication {@Value("${server.port}")private String serverPort;public static void main(String[] args) {SpringApplication.run(SpringbootEurekaServerRibbonApplication.class, args);}@GetMapping("/helloworld")public BaseResponse<String> helloWorld(String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle this request."+ " serverPort=" + serverPort;log.info( str );return BaseResponse.success(str);}
}

springcloud-ribbon-client Consumer模块

除了注册到注册中心外,负载均衡一般是在consumer端实现的
在这里插入图片描述

pom.xml

在springboot3中引入的是spring-cloud-starter-loadbalancer包来负责负载均衡。依赖版本可参考 springbootSeries 模块中pom.xml文件中的版本定义

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>

application.properties配置

service-url.ribbon-service = http://springbootEurekaRibbonServer,:

  • service-url.ribbon-service是一个自定义的key值;
  • http://springbootEurekaRibbonServer为springcloud-ribbon-server模块向注册中心注册的服务名,一般为spring.application.name的值,相当于http://localhost:18091。
spring.profiles.active = dev
spring.application.name=springbootEurekaWithRibbonClient
server.port=18090eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone = http://127.0.0.1:18082/eureka#自定义配置服务端
service-url.ribbon-service = http://springbootEurekaRibbonServer

SpringbootApplication启动类

添加@EnableDiscoveryClient注解,用来注册到Enreka。

@Slf4j
@SpringBootApplication(scanBasePackages = {"com.korgs",  "cn.hutool.extra.spring"})
@Configuration
@EnableConfigurationProperties
@ServletComponentScan
@RestController
@EnableDiscoveryClient
public class SpringbootEurekaClientRibbonApplication {public static void main(String[] args) {SpringApplication.run(SpringbootEurekaClientRibbonApplication.class, args);}@GetMapping("/helloworld/{uuid}")public BaseResponse<String> helloWorld(String uuid){String str = LogGenerator.trackLog()+ " uuid=" + uuid + " I am busy to handle this request.";log.info( str );return BaseResponse.success(str);}
}

实现Ribbon-RestTemplate Bean

主要就是添加一个@LoadBalanced注解

@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

Controller测试类

@RestController
@RequestMapping("/api/load")
public class LoadBalanceController {@Autowiredprivate RestTemplate restTemplate;@Value("${service-url.ribbon-service}")private String ribbonServiceUrl;@GetMapping("/v1/hello-content")public BaseResponse<String> loadHelloContent(String uuid){String result =  restTemplate.getForObject(ribbonServiceUrl + "/helloworld?uuid={1}", String.class, uuid);return BaseResponse.success(result);}
}

源码下载

涉及模块:

  • springcloud-eureka-server :18082 ,注册中心
  • springcloud-ribbon-server:18091,18092 provider服务提供者
  • springcloud-ribbon-client:18090, consumer服务消费者

源码下载:

  • 基础框架源码下载
  • Springboot集成Netflix-ribbon、Enreka实现负载均衡

源码运行方法:

  • 模块详细功能说明和运行测试方法

按上述方法启动后,可以在-

  • 注册中心中看到如下界面
    在这里插入图片描述
  • 打开 http://localhost:18090/swagger-ui
    在这里插入图片描述
    依次调用 springcloud-ribbon-client模块的http://localhost:18090/api/load/v1/hello-content?uuid=2222,观察返回结果中端口号的变化。
    在这里插入图片描述

Ribbon插件功能详解

全局负载均衡配置

ribbon:ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)ReadTimeout: 3000 #服务请求处理超时时间(毫秒)OkToRetryOnAllOperations: true #对超时请求启用重试机制MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数MaxAutoRetries: 1 # 切换实例后重试最大次数NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法

单个服务负载均衡配置

springbootEurekaRibbonServer:ribbon:ConnectTimeout: 1000 #服务请求连接超时时间(毫秒)ReadTimeout: 3000 #服务请求处理超时时间(毫秒)OkToRetryOnAllOperations: true #对超时请求启用重试机制MaxAutoRetriesNextServer: 1 #切换重试实例的最大个数MaxAutoRetries: 1 # 切换实例后重试最大次数NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #修改负载均衡算法

如果不需要注册中心,可以这样来写

springbootEurekaRibbonServer.ribbon.eureka.enabled=false
springbootEurekaRibbonServer.ribbon.listOfServers=http://springbootEurekaRibbonServer:18091,http://springbootEurekaRibbonServer:18092

Ribbon的负载均衡策略

  • com.netflix.loadbalancer.RandomRule:从提供服务的实例中以随机的方式;
  • com.netflix.loadbalancer.RoundRobinRule:以线性轮询的方式,就是维护一个计数器,从提供服务的实例中按顺序选取,第一次选第一个,第二次选第二个,以此类推,到最后一个以后再从头来过;
  • com.netflix.loadbalancer.RetryRule:在RoundRobinRule的基础上添加重试机制,即在指定的重试时间内,反复使用线性轮询策略来选择可用实例;
  • com.netflix.loadbalancer.WeightedResponseTimeRule:对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择;
  • com.netflix.loadbalancer.BestAvailableRule:选择并发较小的实例;
  • com.netflix.loadbalancer.AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例;
  • com.netflix.loadbalancer.ZoneAwareLoadBalancer:采用双重过滤,同时过滤不是同一区域的实例和故障实例,选择并发较小的实例。

注解实现负载均衡策略配置

//配置启动类注解
@RestController
@RibbonClient(name = "springbootEurekaRibbonServer")
public class LoadBalanceController {@GetMapping("/v1/hello-content")public BaseResponse<String> loadHelloContent(String uuid){String result =  restTemplate.getForObject(ribbonServiceUrl + "http://springbootEurekaRibbonServer/helloworld/{1}", String.class, uuid);return BaseResponse.success(result);}
}

编程实现负载均衡策略配置

/*自定义ribbon的IRule负载规则* ResponseTimeWeightedRule根据每个节点的相应时间负载* RandomRule随机负载* ZoneAvoidanceRule以根据AWS区域和可用性发送流量* */
@Configuration
public class RibbonTimeConfig {@Beanpublic IRule ribbonRule(){return new RandomRule();}
}
/*自定义ribbon的IPing负载规则*DummyPing不检查活动性或者可用性,将流量发送到所有实例*PingUrl通过HTTP访问获取与其响应并检查结果*NIWSDiscoveryPing,Eureka发现服务的自动配置检测
*/
@Configuration
public class RibbonTimeConfig {@Beanpublic PingUrl ribbonPing(){PingUrl pingUrl = new PingUrl();pingUrl.setExpectedContent("true");//这个内容需要与服务器接口返回的内容一致才认为服务是正常的return pingUrl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORACLE数据库一主多备DG环境(一对多)主备切换

本文主要分享一对多(一主多备)的DG环境主备切换的案例,我们的一套生产环境,一主四备,其中3个备库承载着查询业务,还有一个DG没有任务业务,由于主库的存储性能不给力,公司采购了新的存储,这个DG就是为了切换到新存储而搭建的,数据量1.5TB。 本文是在测试环境操作,之前…

【信息系统项目管理师】复习~第十五章

15.项目风险管理 每个项目都存在两个层面上的风险&#xff1a;①每个项目都有会影响项目达成目标的单个风险&#xff1b;②由单个风险和不确定性的其他来源联合导致的整体项目风险。项目风险会对项目目标产生负面或正面的影响&#xff0c;也就是风险与机会。项目风险管理旨在利…

PostgreSQL的学习心得和知识总结(一百四十三)|深入理解PostgreSQL数据库之Support event trigger for logoff

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

VirtualBox7安装ubantu server 22.04通过NAT+Only-Host双网卡实现宿主机与虚拟机互通

目录 背景环境安装虚拟机配置网卡修改ssh端口遇到的坑参考文章 背景 时间长没用docker了&#xff0c;有些命令都快忘了&#xff0c;心血来潮想着搞个docker玩一玩&#xff0c;所以需要先搞一个虚拟机&#xff0c;因为之前CentOS用的比较多&#xff0c;所以这次想试一试ubantu。…

『大模型笔记』AI教母李飞飞谈人工智能的前景与危险!

AI教母李飞飞谈人工智能的前景与危险! 文章目录 一. AI教母李飞飞谈人工智能的前景与危险!1. 总结2. 全文内容二. 参考文献油管原视频:https://www.youtube.com/watch?v=FW5CypL1XOY一. AI教母李飞飞谈人工智能的前景与危险! 1. 总结 以下是整理后的中文内容: 李飞飞博…

openlayers实现绘制图标,并实现图标的聚合功能

点聚合说明 点聚合功能是指将地图上密集的点数据聚合成一个更大的点或者其他形状&#xff0c;以改善地图的可视化效果和性能。点聚合功能通常用于在地图上显示大量的点标记&#xff0c;例如地图上的POI&#xff08;兴趣点&#xff09;、传感器数据等。通过点聚合功能&#xff…

Vue3 - 修改浏览器标题 htmlWebpackPlugin.options.title 的值

在 Vue CLI 4.x 中&#xff0c;htmlWebpackPlugin.options.title 是 HtmlWebpackPlugin 的一个选项&#xff0c;用于设置生成的 HTML 文件的标题。 你可以通过修改 vue.config.js 文件来修改这个选项。 以下是一个示例&#xff1a; module.exports {chainWebpack: config &…

[单机]成吉思汗3_GM工具_VM虚拟机

稀有端游成吉思汗1,2,3单机版虚拟机一键端完整版 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人亲自搭建成功的&#xff0c;绝对是完整可运行的&#x…

[算法][数组][leetcode]2391. 收集垃圾的最少总时间

题目地址: https://leetcode.cn/problems/minimum-amount-of-time-to-collect-garbage/description/ 题解&#xff1a; class Solution {public int garbageCollection(String[] garbage, int[] travel) {int ans 0;//先计算收所有的垃圾需要多少时间for(String s :garbage){…

D - Another Sigma Problem(ABC)

思路&#xff1a;我们可以处理一个后缀来记录当前数a[i]需要乘上多少&#xff08;类似于1110这样的&#xff09;&#xff0c;然后对于当前位来说&#xff0c;对答案的贡献还要加上(i - 1) * a[i]&#xff0c;因为a[i]还要做前(i - 1)个数的后缀。 代码&#xff1a; #include &…

目标检测YOLO实战应用案例100讲-无监督领域自适应目标检测方法研究与应用(五)

目录 多源无监督领域自适应目标检测方法 4.1研究现状及问题形成 4.2相关工作详述

在Chisel中,`+%`运算符 模运算加法的妙用

在Chisel中&#xff0c;%是一个特殊的运算符&#xff0c;用于执行加法操作并且处理可能的溢出。这个运算符在硬件设计中很有用&#xff0c;因为它允许开发者明确控制当数值超出其表示范围时的行为。 加法和模运算加法 普通加法&#xff1a;在大多数编程语言和硬件描述语言中&…

【详细介绍下Visual Studio】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

vue3文件上传

样式&#xff1a; 可随意&#xff0c;通过获取组件toWake()方法即可 实现功能&#xff1a; 限制上传文件类型 限制上传文件大小 组件名称&#xff1a; autoUpload 实现代码: <!-- 通用文件上传按钮&#xff0c;解决原生样式无法修改问题 --> <!-- 参数介绍(可拓展…

Ubuntu24安装搜狗输入法,修复闪屏问题

下载deb安装包&#xff1a;搜狗输入法linux-首页 安装&#xff1a;sudo dpkg -i 1.deb 搜狗输入法linux-安装指导 重启&#xff0c;但是完成后闪烁。按以下步骤更改桌面配置。 sudo gedit /etc/gdm3/custom.conf 取消WaylandEnable的注释即可

Mysql中表的创建以及数据类型

DDL 在表结构的操作 表的创建 creat table 表名&#xff08; 字段1 字段类型 [约束] &#xff0c; 字段2 字段类型 [约束] &#xff09;[comment 标注释]; create table tb_user(id int comment ID,一行字段的唯一标识,username varchar(20) comment 用户名,name varchar(…

618洗地机推荐,市面上各式各样的洗地机怎么选?这里有答案

洗地机的出现极大地改变了清洁方式&#xff0c;通过结合扫地、拖地、吸尘等多种功能&#xff0c;实现了一机多用的便捷清洁体验。而且洗地机不需要弯腰&#xff0c;每次也不用清洁很长时间&#xff0c;节省出来的时间可以更好的休息&#xff0c;但是市面上各式各样的洗地机怎么…

iOS 提交项目到github(本地没有该项目)

流程简介 申请github账号&#xff08;如果有请跳过&#xff09; add repository创建项目开心的提交就好 具体过程 1. 申请账号&#xff08;本部分不做介绍&#xff0c;请自行研究&#xff09; 2. 如果有账号&#xff0c;按照下面图片依次操作就好 点击该图中的New reposito…

2024数维杯数学建模竞赛C题思路代码和论文分析

2024数维杯数学建模C题完整代码和成品论文已更新&#xff0c;获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/bgic2nbxs2h41pvt?singleDoc# 2024数维杯数学建模C题思路分析如下&#xff1a; 问题分析 整体题目分析: 这是一个关于评价天然气水合物资源量的建模问题…

【吴恩达机器学习-week2】多个变量的特征缩放和学习率问题

特征缩放和学习率&#xff08;多变量&#xff09; 目标 利用上一个实验中开发的多变量例程在具有多个特征的数据集上运行梯度下降探索学习率对梯度下降的影响通过 Z 分数归一化进行特征缩放&#xff0c;提高梯度下降的性能 import numpy as np np.set_printoptions(precisio…