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=18091

eureka.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-schema

swagger-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=18090

eureka.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
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

Controller测试类

@RestController
@RequestMapping("/api/load")
public class LoadBalanceController {

    @Autowired
    private 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 {
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}
/*自定义ribbon的IPing负载规则
 *DummyPing不检查活动性或者可用性,将流量发送到所有实例
 *PingUrl通过HTTP访问获取与其响应并检查结果
 *NIWSDiscoveryPing,Eureka发现服务的自动配置检测
*/
@Configuration
public class RibbonTimeConfig {
    @Bean
    public PingUrl ribbonPing(){
        PingUrl pingUrl = new PingUrl();
        pingUrl.setExpectedContent("true");//这个内容需要与服务器接口返回的内容一致才认为服务是正常的
        return pingUrl;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; func largestRectangleArea(heights []int) int {n : len(heights)left, right : make([]int, n), make([]int, n)for i : 0; i < n; i {right[i] n}mono_stack : []int{}for i : 0; i < n; i {for len(mono_stack) > 0 &&am…

PMOS和NMOS

一. MOS管简介 MOS管是场效应管的一种&#xff0c;主要有两种结构形式&#xff1a;N沟道和P沟道&#xff0c;又根据场效应原理的不同&#xff0c;分为耗尽型&#xff08;当栅压为零时有较大漏极电流&#xff09;和增强型&#xff08;当栅压为零&#xff0c;漏极电流也为零&…

通过物联网管理多台MQTT设备-基于米尔T527开发板

本篇测评由电子工程世界的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-LT527开发板的网关方案测试。 一、系统概述 基于米尔-全志 T527设计一个简易的物联网网关&#xff0c;该网关能够管理多台MQTT设备&#xff0c;通过MQTT协议对设备进行读写操作&#xff0c;…

CMakeLists.txt语法规则:改变行为的变量说明一

一. 简介 前面一篇文章学习了 CMakeLists.txt语法中的 部分常量变量&#xff0c;具体学习提供信息的变量&#xff0c;文章如下&#xff1a; CMakeLists.txt语法规则&#xff1a;提供信息的变量说明一-CSDN博客 CMakeLists.txt语法规则&#xff1a;提供信息的变量说明二-CSD…

【JavaEE网络】HTTPS详解:从对称与非对称加密到证书认证

目录 HTTPSHTTPS 是什么“加密” 是什么HTTTPS 的工作过程引入对称加密引入非对称加密引入证书完整流程总结 HTTPS HTTPS 是什么 HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现…

大数据Scala教程从入门到精通第八篇:Scala在IDEA中编写Hello World

一&#xff1a;Scala在IDEA中编写Hello World object HelloWorld {def main(args: Array[String]): Unit {println("hello world")}}这个对象也单例的。 特殊的Java类库需要import

利用一下Chat-GPT写两段处理字符串的简单样例ABAP程序。这样可以大大提高工作效率。Chat-GPT的能力真是让人震撼。

我让Caht-GPT写两段ABAP 程序&#xff0c;第一段程序要求如下&#xff1a; 判读字符串里面是否含有特殊字符&#xff0c;这里说的特殊字符不包括键盘上能够输入的字符&#xff0c;如果有这样的特殊字符则输出来。 DATA: lv_string TYPE string VALUE 你的字符串,lv_result TYP…

08.2.grafana插件安装

grafana插件安装 官方网站下载地址(可自定义选择版本)&#xff1a; https://grafana.com/grafana/download/6.3.0?pgget&plcmtselfmanaged-box1-cta1 清华源下载grafana的rpm包 https://mirror.tuna.tsinghua.edu.cn/grafana/yum/el7/ 直接命令行安装,或者包下载下来本地…

docker runc升级1.1.12

上传runc-1.1.12制品至中控机 874e970eaa932a97de9888344ae08f24 runc.arm64 将所有节点的runc文件备份 所有节点(包括master+node) vim host [all] 10.1.0.183 ansible_password=Bigdata@Ksyun123 ansible_user=root ansible_port=22 10.1.0.249 ansible_password=Bigdata…

AcwingWeb应用课学习笔记

y总Web课链接&#xff1a; VSCode自动格式化 选中Format On Save不起作用 在设置中搜索default formatter&#xff0c;修改成Prettier-Code formatter 标签 文本标签虽然很多&#xff0c;但大部分可看成是预定好样式的<div>和<span>。&#xff08;div也是由sp…

电脑nvidia驱动和合适版本的duda--自用 回忆版

参考文献&#xff1a;http://t.csdnimg.cn/ecDuG 内容很多抄的这个&#xff0c;主要害怕链接失效 一、Ubuntu 18.04 安装NVIDIA显卡驱动 1、查看本机显卡能够配置的驱动信息 ubuntu-drivers devices所以可以看出&#xff0c;推荐 nvidia-driver-530 - distro non-free 2、安…

使用SPI驱动串行LCD的驱动实现(STM32F4)

目录 概述 1. 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 2 功能实现 2.1 使用STM32Cube配置Project 2.2 STM32Cube生成工程 3 代码实现 3.1 SPI接口实现 3.2 LCD驱动程序实现 3.3 测试程序实现 4 测试 源代码下载地址&#xff1a; https://gitee.com/mf…

2024年最新趋势跨境电商平台开发需了解的新技术

随着数字化技术的不断演进和全球市场的日益融合&#xff0c;跨境电商平台开发将面临前所未有的挑战和机遇。为了更好地适应并引领这一发展&#xff0c;开发者需要密切关注2024年最新的技术趋势&#xff0c;以确保他们的平台能够在竞争激烈的市场中脱颖而出。本文将对跨境电商平…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1&#xff1a;H264语法结构回顾 2&#xff1a;H264编码补充介绍 3&#xff1a;MP4模式转Annex B模式输出到文件示例 1&#xff1a;H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2&#xff1a;H264编码补充介绍 H…

镓未来助力联想笔记本GaN适配器标配化,赋能高效用户体验

镓未来赋能笔记本电脑GaN适配器标配化 据悉&#xff0c;Lenovo 2024年推出搭配的多款新型笔记本原装适配器电源ADL100UDGC3A&#xff0c;采用了镓未来集成型Cascode技术氮化镓功率器件G1N65R150PB。新款方案相较上一代工艺&#xff0c;体积减小23%&#xff0c;重量降低18%&…

JavaScript之数据类型(3)——object进阶

前言&#xff1a; 利用基础知识来构建对象会发现十分复杂&#xff0c;我们可以结合其他的知识点来为我们object的构建进行优化。 <1>工厂法&#xff1a; 基本格式&#xff1a; function creatObject(属性值1,属性值2,属性值3,...,属性值n) {var 对象名 new Object();对…

parallels desktop19最新免费Mac电脑虚拟机软件

Parallels Desktop是一款运行在Mac电脑上的虚拟机软件&#xff0c;它允许用户在Mac系统上同时运行多个操作系统&#xff0c;比如Windows、Linux等。通过这款软件&#xff0c;Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序&#xff0c;而无需额外的硬件设备…

https免费证书获取

获取免费证书的网址&#xff1a; Certbot 1. 进入你的linux系统&#xff0c;先安装snapd&#xff0c; yum install snapd 2. 启动snapd service snapd start 3.安装 Certbot snap install --classic certbot 注意如下出现此错误时&#xff0c;需要先建立snap 软连接后&am…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.5讲 GPIO中断实验-通用中断驱动编写

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

MYSQL中的DQL

语法&#xff1a; select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段 limit 分页参数 条件查询 语法&#xff1a; 查询多个字段&#xff1a;select 字段1&#xff0c;字段2 from表名 查询所有字段&#xff1a…