【SpringCloud】Eurake注册中心与Ribbon负载均衡原理

news2024/12/28 20:00:40

目录

一、服务提供者与服务消费者

二、远程调用存在的问题

三、Eureka原理

四、Eureka架构

五、搭建Eureka服务

六、Eureka服务注册

七、Eureka服务发现

八、Ribbon负载均衡流程

九、Ribbon负载均衡源码

十、Ribbon负载均衡策略

十一、Ribbon饥饿加载


一、服务提供者与服务消费者

在分布式系统一次业务中提供服务的叫做提供者,它提供接口给其他微服务,而调用提供者接口i的叫做服务消费者。但是提供者与消费者并不是一成不变的,他们是相对而言的

二、远程调用存在的问题

传统的远程调用,采用的是通过RestTemplate向其他微服务接口发起HTTP请求去获取数据,而发起HTTP请求时的url采用硬编码的方式即指定了IP与端口(http://IP:port/),如果提供者的服务在多台服务器部署,那么硬编码的方式就存在弊端。此时注册中心的出现解决了这一问题,所有的服务先去注册中心注册,调用时再从注册中心拉去调用信息

三、Eureka原理

服务提供者在启动时向eureka注册中心注册自己的信息,eureka保存这些注册的信息,消费者根据服务的名称向eureka拉去提供者信息,如果存在多个提供者,服务消费者在调用时会利用负载均衡算法,从服务器列表中进行挑选。消费者如何感知提供者的健康状态呢?服务提供者每隔30秒向eurekaServer发送心跳包,报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除,消费者就可以拉取到最新的信息

四、Eureka架构

在Eureka中,微服务角色有两类

EurekaServer服务端,注册中心:它记录服务信息以及进行心跳监控

EurekaClient客户端,服务提供者会将自己的信息注册到EurekaServer,每隔30s向EurekaServer发送心跳包。服务消费者会根据服务名从EurekaServer拉去服务列表,基于服务列表做负载均衡,选择其中一个发起远程调用

五、搭建Eureka服务

首先我们需要创建一个注册中心的SpringBoot项目,在pom.xml中引入以下依赖

        <dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
			<version>2.2.3.RELEASE</version>
		</dependency>

然后在启动类上加注解

@EnableEurekaServer

最后在配置文件填写注册中心信息


server:
  port: 10086
spring:
  application:
    name: eurekaserver
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka/

六、Eureka服务注册

在服务的项目里引入依赖

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

然后在配置文件里添加配信息进行注册

spring:
  application:
    name: userservice # 服务名后续获取服务时需要用
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka/

七、Eureka服务发现

服务消费者进行调用时,首先需要创建配置类将RestTemplate注入到Spring容器里,注入时添加负载均衡的注解

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

 其次在需要调用处装配该对象进行调用

String url="http://userservice/user?id=1"; // 此处IP与端口填写服务注册时的name即可
User user = restTemplate.getForObject(url,User.class);

八、Ribbon负载均衡流程

消费者发起请求请求提供者的服务,Ribbon拦截请求,此时取EurekaServer拉取提供者信息列表,拉取到之后Ribbon采用负载均衡策略进行选择后发起请求

九、Ribbon负载均衡源码

之前注入RestTemplate时加了注解LoadBalanced,加该注解后由RestTemplate发起的请求都会被Ribbon拦截,LoadBalancedInterceptor负载均衡拦截器将请求拦截后RibbonLoadBalancerCliennt获取请求url中的访问ID也就是访问注册时的name,此时DynamicServerListLoadBalancer就会取服务器拉取相关服务列表,之后服务负载均衡后选择某一个之后将原来url中的服务ID与负载均衡后选择的服务地址信息进行替换后访问

十、Ribbon负载均衡策略

内置负载均衡规则类描述

RoundRobinRule

简单的轮询服务列表,他是Ribbon默认的负载均衡规则
WeightedResponseTimeRule为每一个服务器赋予一个权重值,服务器响应时间越长,权重越小。这个规则会随机选择服务器,这个权重会影响服务器的选择
ZoneAvoidanceRule以区域可以的服务器为基础进行服务器选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房,一个机架等,然后再对Zone中的服务轮询,可以理解为先选择机房,再从机房中轮询选择服务器
BestAvailableRule忽略短路的服务器,选择并发低的服务器
RandomRule随机选择一个可用的服务器
RetryRule重试机制的选择逻辑

我们可以通过两种方式修改负载均衡策略

1.创建配置类注入对应的负载均衡类

@Bean
public IRule randomRule(){
    return new randomRule();
}

2.在配置文件中声明

userserver: #服务名
    ribbon:
        NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule # 负载均衡规则类

十一、Ribbon饥饿加载

Ribbon模式是采用懒加载,这就使得第一次访问服务会变的慢,他需要先去创建LoadBalaceClient,请求时间会很长。我们可以通过让它变为饥饿加载来减少第一次访问的时间,

饥饿加载是在项目启动时就创建,我们需要在配置中添加以下信息

ribbon:
    eager-load:
        enable: true # 开启饥饿加载
        clients:
            - userservice
            - orderservice # 针对哪些服务进行饥饿加载

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

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

相关文章

【Linux】进程间通信 —— 管道

文章目录 &#x1f4d5; 进程间通信介绍&#x1f4d5; 匿名管道原理使用读写规则特点 &#x1f4d5; 命名管道原理使用匿名管道和命名管道的区别 &#x1f4d5; 进程间通信介绍 进程间通信&#xff0c;顾名思义&#xff0c;就是两个进程之间的 “交流” &#xff0c;我们知道&…

Alibaba开发十年,写出这本“MQ技术手册”,看完我愣住了

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。虽然说&#xff0c;目前状况是Kafka更为火热&#xff0c;但更为广泛的应该还属老牌的RabbtiMQ和Alibaba自主…

Android WebRtc+SRS/ZLM视频通话(2):安装SRS

Android WebRtcSRS/ZLM视频通话&#xff08;2&#xff09;&#xff1a;安装SRS 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来安装开源流媒体系统&#xff08;SRS&#xff09;&#xff0c;可以按官方教程或者直接问ChatGPT安装教程&#xff0c;又或者百度一下照着大…

别开玩笑了!特种兵式旅游,胆小勿进!

【大学生特种兵旅游】是什么梗&#xff1f; 最近在多御浏览器上看新闻的时候看到一个热梗【大学生特种兵旅游】这又是什么梗&#xff01;&#xff01;&#xff01;老阿姨震惊了&#xff01; 我随即搜索了一下&#xff0c;看到了下面这段介绍&#xff1a; 近日&#xff0c;“特种…

【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

文章目录 一、需求环境/版本 二、须知2.1、什么是RPC&#xff1f;2.2、什么是Dubbo&#xff1f;2.3、什么是Nacos&#xff1f; 三、普通的SpringBoot项目集成微服务组件方案&#xff08;笔者给出两种&#xff09;方案一&#xff08;推荐&#xff09;1、导入maven依赖&#xff0…

rocketmq4.9.4 docker安装

rocketmq4.9.4 给对应的路径赋权 chmod -R 777 文件名 不然启动可能报错后者看不到容器日志 systemctl status firewalld 查看防火墙状态 https://www.jianshu.com/p/0c1c3c679ef8 Docker部署RocketMQ&#xff08;4.9.4&#xff09;官方镜像和控制台windows、mac、linux全平…

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT 2023/5/8 16:27 在WIN10下请参考本文&#xff0c;在Ubuntu22.04下需要不通的插件&#xff01; https://blog.csdn.net/weixin_46255747/article/details/129961988 python实现批量docx转txt docx文档放到input目录中。…

Origin如何绘制二维图形?

文章目录 0.引言1.函数绘图2.线图3.符号图4.点线符号图5.柱状/条形/饼图6.多面板/多轴图7.面积图8.专业图9.主题绘图 0.引言 因科研等多场景需要绘制专业的图表&#xff0c;笔者对Origin进行了学习&#xff0c;本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资…

stable diffusion模型讲解

AI模型最新展现出的图像生成能力远远超出人们的预期&#xff0c;直接根据文字描述就能创造出具有惊人视觉效果的图像&#xff0c;其背后的运行机制显得十分神秘与神奇&#xff0c;但确实影响了人类创造艺术的方式。 AI模型最新展现出的图像生成能力远远超出人们的预期&#xf…

PyCharm使用 Anaconda安装TensorFlow

1.安装python全家桶Anaconda 1.1 官网 https://www.anaconda.com/ 进入官网后如下图所示&#xff0c;点击Download即可开始下载&#xff08;若无法下载&#xff0c;请转至清华源下载&#xff09; 1.2 清华 https://repo.anaconda.com/archive/ 2.Anaconda安装 点击Next -…

libssh2交叉编译和测试

目录 官方地址&#xff1a;https://www.libssh2.org/ 1.源码下载 2.交叉编译 3.测试代码 官方地址&#xff1a;https://www.libssh2.org/ 正常来说&#xff0c;看官网说明和例子都能正常编译和使用&#xff0c;想偷个懒的就参考以下步骤。 1.源码下载 我当前看到的版本是li…

【二分查找】求解单调方程的解 C++实现

目录 1 问题2 想法3 二分查找4 实现4-1 伪代码说明4-2 C11 1 问题 有函数 f ( x ) a x ( a > 1 ) f(x)a^x(a>1) f(x)ax(a>1) ,单调递增&#xff0c;现在给一个正整数 N N N&#xff0c;求使得 f ( x ) N f(x)N f(x)N的正整数解 x x x。    2 想法 x l o g a N xl…

Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud 46

一、前言 在前面我们通过以下章节对ShardingSphere的AutoTable 有了基础的了解&#xff1a; Spring Boot集成ShardingSphere分片利器 AutoTable &#xff08;一&#xff09;—— 简单体验 | Spring Cloud 45 书接上回&#xff0c;本章进行对AutoTable 支持的自动分片算法进行…

【JAVAEE】使用wait()方法和notify()方法解决线程不安全中的有序性问题

目录 1.wait()方法 2.notify()方法 3.notifyAll()方法 4.wait()和sleep()方法的区别 由于线程之间是抢占式执行的&#xff0c;因此线程之间执行的先后顺序难以预知。但是在实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序。 完成这个协调工作&#xff0c;主…

QML之HTML5画布移植(Porting from HTML5 Canvas)

移植一个HTML5画布图像到QML画布非常简单。在成百上千的例子中&#xff0c;我们选择了一个来移植。 螺旋图形&#xff08;Spiro Graph&#xff09; 我们使用一个来自Mozila项目的螺旋图形例子来作为我们的基础示例。原始的HTML5代码被作为画布教程发布。 下面是我们需要修改…

OpenGL(十)——基础光照

目录 一、前言 二、环境光照 三、漫反射光照 3.1 法向量 3.2顶点着色器 3.3 VAO属性解释 3.4 片段着色器 四、镜面光照 4.1 片段着色器 一、前言 现实世界光照十分复杂&#xff0c;冯氏光照模型是对现实世界光照的抽象&#xff0c;主要由3部分组成&#xff0c;环境amb…

【JAVAEE】使用synchronized关键字和volatile关键字解决线程安全问题中的原子性,内存可见性和有序性问题

目录 1.synchronized关键字---监视器锁monitor lock 1.1synchronized的特性 互斥 刷新内存 可重入 1.3synchronized使用注意事项 2.volatile关键字 2.1volatile保证内存可见性问题 MESI缓存一致性协议 内存屏障 2.2volatile解决有序性问题 3.总结synchronized和vola…

ELK -- kibana 用nginx代理后无法访问

背景&#xff1a; 本地搭建好elk后&#xff0c;一切正常&#xff0c;后面改成用nginx代理kibana的5601端口&#xff0c;发现代理后无法正常访问&#xff08;未代理的地址可正常访问&#xff09;&#xff0c;花了很多时间去查问题&#xff0c;报错基本都是http://ip:port/spaces…

Leetcode刷题之复制带随机指针的链表

生命不是安排&#xff0c;而是追求&#xff0c;人生的意义也许永远没有答案&#xff0c;但也要尽情感受这种没有答案的人生。 --弗吉尼亚. 伍尔芙 目录 前言&#xff1a; &#x1f338;一.复制带随机指针的链表 &#x1f305;1.复制结点链接到原本链表每一个结点的…