在Spring Cloud中使用Ribbon完成一个简单的负载均衡demo

news2024/11/16 11:43:42

Spring Cloud系列断更了有一段时间了,这段时间最近都在忙着项目上的事,天天修复bug以及调整需求,反正各种操劳,了解业务需求,然后开发相关功能,很久都没碰Spring Cloud系列的相关文章了,最近回头看看,发现Spring Cloud的Ribbon还没举例进行介绍,就光生成了一个注册中心服务罢了,今天就将这个坑填充一下。

说到Ribbon,我们应该了解到关于他的:

  • 负载均衡:Ribbon是一个客户端负载均衡器,它可以将客户端请求分发到多个服务实例上。一个常见的案例是在微服务架构中使用Ribbon来实现服务间的负载均衡。通过配置Ribbon的负载均衡策略,可以根据不同的需求选择合适的负载均衡算法。

  • 服务发现:Ribbon可以与服务注册中心(如Eureka)集成,实现服务的自动发现和注册。通过与Eureka等服务注册中心配合使用,Ribbon可以动态地获取可用的服务实例列表,并根据负载均衡策略进行请求分发。

  • 自定义负载均衡策略:Ribbon提供了多种负载均衡策略,如轮询、随机、权重等。除了使用内置的负载均衡策略外,你还可以根据自己的需求实现自定义的负载均衡策略。例如,你可以根据服务实例的性能指标或其他因素来动态调整请求的分发策略。

  • 故障转移和容错:Ribbon还提供了故障转移和容错的功能。当某个服务实例不可用时,Ribbon可以自动将请求转发到其他可用的实例上,以提高系统的可用性和容错能力。

那么我们根据写一个案例:
还是利用我们的Spring Cloud系列之前搭建的框架
在这里插入图片描述
application.yml文件

server:
  port: 2381
spring:
  application:
    name: ribbon-demo

# eureka客户端注册到Eureka注册中心,切记需要启动eureka服务
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1000/eureka

# ribbon
ribbon-demo:
  ribbon:
    listOfServers: https://ribbon-demo, https://feign-demo, http://ribbon-demo3

PS:注意,ribbon-demo是指的我们具体启动的相关服务,且这个服务需要注册到注册中心去,下边的https://ribbon-demo, https://feign-demo, http://ribbon-demo3分别代表不同的服务实例的URL地址。每个URL地址对应一个具体的服务实例,只是我这边简化了,全用Ribbon-demo代替了。

格式如下:

my-service:
  ribbon:
    listOfServers: http://service1, http://service2, http://service3

"my-service"是一个代表服务名称的占位符。实际上,"my-service"可以是微服务架构中的任何一个具体的服务名称。

在微服务架构中,通常会有多个独立的服务组成一个完整的应用。每个服务都有自己的功能和职责。为了实现服务间的通信和调用,每个服务都会注册一个唯一的服务名称。

"http://service1"、"http://service2"和"http://service3"是代表服务实例的URL地址。每个URL地址对应一个具体的服务实例。

在微服务架构中,一个服务通常会有多个实例运行在不同的主机或容器中,以提高系统的可用性和性能。这些服务实例可以是相同的代码部署在不同的服务器上,也可以是不同的服务副本。

为了实现负载均衡和容错,Ribbon需要知道可用的服务实例列表。这些URL地址可以是服务注册中心(如Eureka)中注册的服务实例的URL,也可以是手动配置的服务实例的URL。


接下来我们创建一个RibbonConfig作为我们的配置类:

@Configuration
public class RibbonConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

作为Ribbon客户端:在应用中创建Ribbon的客户端。可以使用@LoadBalanced注解来标记RestTemplateFeignClient,以启用Ribbon的负载均衡功能。


之后我们在控制类中发起请求

发起请求:使用Ribbon客户端发起请求。在代码中使用RestTemplate或FeignClient来发起HTTP请求,Ribbon会根据配置的负载均衡策略选择合适的服务实例。例如,使用RestTemplate的示例:

@RestController
public class MyController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/my-service")
    public String callMyService() {
        return restTemplate.getForObject("http://ribbon-demo/my-service", String.class);
    }
}

本案例仅仅作为展示,所以我就在这里调用自己了,实际情况这边会使用负载均衡,调用别的服务里边的方法,别学我,最好启动其他服务并配置好相关控制层,方便调用


启动类:

@SpringBootApplication
@EnableEurekaClient
public class RibbonApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonApplication.class);
    }
}

直接启动就可以了。因为Ribbon是作为Spring Cloud Netflix的一部分,它会与Spring Boot应用程序一起自动启动。

在这里插入图片描述

前端访问:
localhost:2381/my-service
控制台输出日志如下:

2023-12-27 14:58:05.914  INFO 30188 --- [nio-2381-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-12-27 14:58:05.914  INFO 30188 --- [nio-2381-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-12-27 14:58:05.917  INFO 30188 --- [nio-2381-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 3 ms
2023-12-27 14:58:06.011  INFO 30188 --- [nio-2381-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-12-27 14:58:06.026  INFO 30188 --- [nio-2381-exec-1] c.n.u.concurrent.ShutdownEnabledTimer    : Shutdown hook installed for: NFLoadBalancer-PingTimer-ribbon-demo
2023-12-27 14:58:06.027  INFO 30188 --- [nio-2381-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: ribbon-demo instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ribbon-demo,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2023-12-27 14:58:06.030  INFO 30188 --- [nio-2381-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2023-12-27 14:58:06.043  INFO 30188 --- [nio-2381-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-12-27 14:58:06.044  INFO 30188 --- [nio-2381-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client ribbon-demo initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ribbon-demo,current list of Servers=[本机名称:2381],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:本机名称:2381;	Zone:defaultZone;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@6cbc0c75
2023-12-27 14:58:07.041  INFO 30188 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: ribbon-demo.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-12-27 15:00:25.390  INFO 30188 --- [trap-executor-0] c.n.d.s.r.aws.ConfigClusterResolver      : Resolving eureka endpoints via configuration

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

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

相关文章

数据结构第0章 初识

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 0、思维导图1、数据结构1)数据结构是什么&am…

如何取消ChatGPT Plus 订阅服务,不取消订阅有什么影响?取消了又如何再次订阅

一、前言 很多小伙伴给我反馈说自己不会取消chatgpt的plus订阅,今天就来给大家分享一下如何取消ChatGPTPlus订阅 ChatGPTplus快速订阅升级方法 二、不取消订阅有什么影响? 1、账号被风控(有些可以使用3.5但是不能在升级4.0) …

【Java】云HIS云计算医院信息平台源码

云HIS系统可实现“云部署”,即可实现在云计算下的多种部署模式。系统采用SaaS服务模式的新驱动,功能设计充分合理,界面布局合理美观,每个用户可具有个性化工作台。 一、系统特色 使用简易化 即开即用,快速复制&#…

前端实现websocket类封装

随着Web应用程序的发展,越来越多的人开始利用Websocket技术来构建实时应用程序。Websocket是一种在客户端和服务器之间建立持久连接的协议。这种协议可以在一个单独的连接上实现双向通信。与HTTP请求-响应模型不同,Websocket允许服务器自主地向客户端发送…

Flutter配置Android和IOS允许http访问

默认情况下,Android和IOS只支持对https的访问,如果需要访问不安全的连接,也就是http,需要做以下配置。 Android 在res目录下的xml目录中(如果不存在,先创建xml目录),创建一个xml文件network_security_con…

八股文打卡day12——计算机网络(12)

面试题:HTTPS的工作原理?HTTPS是怎么建立连接的? 我的回答: 1.客户端向服务器发起请求,请求建立连接。 2.服务器收到请求之后,向客户端发送其SSL证书,这个证书包含服务器的公钥和一些其他信息…

Codeforces Round 917 (Div. 2)更新中...

A.Least Product(思维) 题意: 给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​,你可以进行若干次以下操作: 选择数组中的一个元素 a i a_i ai​,将这个数字修改为 0 ∼ a i 0 \sim a_i 0∼ai​之…

《Spring Cloud学习笔记:微服务保护Sentinel》

Review 解决了服务拆分之后的服务治理问题:Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互,基于网关的过滤器解决了登录校验的问题 流量控制:避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

XIAO ESP32S3之物体检测加入视频流

一、前言 由于XIAO ESP32S3开发套件没有显示屏配件,因此加入http视频流功能,可通过浏览器请求ESP32S3上的视频流。 二、思路 1、XIAO ESP32S3启动后通过wifi连接到AP; 2、启动http服务器,注册get_mjpeg处理函数; 3…

判断电话号码是否重复-excel

有时候重复的数据不需要或者很烦人,就需要采取措施,希望以下的方法能帮到你。 1.判断是否重复 方法一: 1)针对第一个单元格输入等号,以及公式countif(查找记录数的范围,需要查找的单元格) 2…

Linux:不同计算机使用NFS共享资源

一,安装NFS文件系统 NFS即网络文件系统(network file system),它允许网络中的计算机之间通过网络共享资源。目前,NFS只用于在Linux和UNIX主机间共享文件系统。 #使用mount命令可以将远程主机的文件系统 安装到 本地: #将远程主机…

2.3_3 进程互斥的硬件实现办法

2.3_3 进程互斥的硬件实现办法 1.中断屏蔽方法 利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况) 优点:简单、高效…

浏览器Post请求出现413 Request Entity Too Large (Nginx)

环境 操作系统 window server 2016 前端项目 Vue2 Nginx-1.25.3 一、错误信息 前端是vue项目,打包后部署在Nginx上,前端post请求出现Request Entity Too Large错误信息。 ​这种问题一般是请求实体太大(包含参数,文件等&#xf…

是德科技E9304A功率传感器

是德科技E9304A二极管功率传感器测量频率范围为9 kHz至6 GHz的平均功率,功率范围为-60至20 dBm。该传感器非常适合甚低频(VLF)功率测量。E系列E9304A功率传感器有两个独立的测量路径,设计用于EPM系列功率计。功率计自动选择合适的功率电平路径。为了避免…

HTML制作暴雨特效

🎀效果展示 🎀代码展示 <body> <!-- partial:index.partial.html --> <canvas id="canvas-club">

c语言结构体(初阶)

1. 结构体的声明 1.1 结构体的基础知识 结构是一些值的集合&#xff0c;这些值被称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag {member - list; }variable-list; 例&#xff1a;描述一个人的信息&#xff1a;名字电话性别身高 //声明的…

如何利用ChatGPT处理文本、论文写作、AI绘图、文献查阅、PPT编辑、编程等

无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的支持。它可以为您提供论文结构指导、段落重组建议…

LabVIEW快速入门

参考&#xff1a; 知乎labview快捷键 https://www.zhihu.com/question/287709225github 上 LabVIEW教程 https://lv.qizhen.xyz/LabVIEW 参考书籍 链接&#xff1a;https://pan.baidu.com/s/1irc0iftM0Gg3GCN2cBHCKw?pwdy1mz 提取码&#xff1a;y1mz --来自百度网盘超级会员V…

.NET 使用Camunda快速入门

一.工作流介绍 1. 什么是工作流 工作流&#xff08;Workflow&#xff09;&#xff0c;是对工作流程及其各操作步骤之间业务规则的抽象、概括描述。 工作流将一套大的业务逻辑分解成业务逻辑段&#xff0c; 并统一控制这些业务逻辑段的执行条件&#xff0c;执行顺序以及相互通…

【双系统】Windows10+Ubuntu22.04安装全过程以及安装后的配置

文章目录 0 背景0.1 电脑配置0.2 电脑磁盘的初始情况 1 准备空闲的磁盘1.1 文件整理1.2 压缩卷和扩展卷的操作 2 准备系统启动盘3 设置电脑的模式&#xff08;未验证&#xff09;并进入Ubuntu安装4 安装Ubuntu5 Ubuntu的配置6 其他 0 背景 之前一直在虚拟机上使用Ubuntu系统&am…