当前位置: 首页 > news >正文

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

文章目录

  • 一、Eureka
    • 1、服务提供者与消费者
    • 2、Eureka原理分析
    • 3、搭建Eureka
    • 4、服务注册
    • 5、模拟多服务实例启动
    • 6、服务的发现
  • 二、Ribbon
    • 1、负载均衡的原理
    • 2、源码分析
    • 3、负载均衡策略
    • 4、饥饿加载

一、Eureka

1、服务提供者与消费者

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

在这里插入图片描述

很明显,这是一个相对的概念。

2、Eureka原理分析

上一篇中,远程调用时,url参数是写死在代码中的,而不同的测试、生产、开发环境IP不同,有集群时,端口也不能固定。

在这里插入图片描述

很明显,硬编码肯定行不通。Eureka就是来解决这个问题的。

在这里插入图片描述

  • 每个服务启动的时候,将自己的信息注册到eureka中
  • 某个服务需要调用其他服务时,向eureka拉取对应的服务信息
  • 负载均衡到其中一台(如图中的localhost:8081)
  • 进行远程调用
  • 服务实例向eureka心跳续约,每30秒一次,eureka监控到某个服务实例不再心跳时,就从其注册信息中剔除这条信息。服务消费者拉取时当然也就拉取不到这个宕掉的服务实例
  • 新启动一个服务,服务信息注册到了eureka中…以此类推

在这里插入图片描述
接下来开始搭建Eureka,并进行服务注册和服务发现

在这里插入图片描述

3、搭建Eureka

  • 在父工程下新建eureka模块,选择Maven,点击Finish

在这里插入图片描述

  • 给该模块引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--版本在父工程中统一管理,这里不用写-->
  • 编写启动类,添加@EnableEurekaServer注解(自动装配的开关)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}
  • 添加application.yaml文件
server:port: 10086 # 服务端口
spring:application:name: eurekaserver # eureka的服务名称,eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
eureka:client:service-url:  # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka# eureka自身也是个微服务,也要注册自己的信息到eureka注册中心
# 王思聪住万达酒店也得身份证登记一下,虽然那就是他家的产业
  • 启动eureka模块

在这里插入图片描述
在这里插入图片描述

  • 注册成功

在这里插入图片描述

4、服务注册

接下来将user和order服务注册到eureka中:

  • 在user模块的pom文件中引入eureka客户端依赖
<!--eureka客户端依赖-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在application.yaml文件中增加注册中心地址的配置
server:port: 8081
spring:application: name: userservice
eyreka:client:service-url:  # eureka的地址信息defaultZone: http://127.0.0.1:10086/eureka
  • 重启user模块(order模块操作步骤相同),注册成功

在这里插入图片描述

5、模拟多服务实例启动

上面完成的注册都是单服务实例的,接下来在IDEA中模拟启动多个服务实例:

  • 右键选择拷贝

在这里插入图片描述

  • -Dserver.port覆盖yaml文件中的端口,从而换个新端口

在这里插入图片描述

  • 启动这个新服务实例,注册成功

在这里插入图片描述

6、服务的发现

接下来实现:在order服务中完成服务信息的拉取,然后通过负载均衡挑选一个user服务,实现远程调用

服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡

  • 修改order代码,将服务IP和端口改为服务名
String url ="http://userservice/user/" + order.getUserId();
  • 在order启动类OrderApplication中的RestTemplate添加负载均衡注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {return new RestTemplate();
}
  • 分别调用order接口两次,传参101和102,看它远程调用了哪个user服务实例

在这里插入图片描述

  • 可以看到两个服务实例均有对应的日志,成功!

在这里插入图片描述

二、Ribbon

1、负载均衡的原理

分析:

我在浏览器中直接访问http://userservice/user/,访问失败,这是因为userservice既不是可用域名,也不是IP。那order调用到user服务的过程中经历了什么呢?

在这里插入图片描述

  • order发起请求
  • Ribbon拦截请求,拿到服务名,向eureka拉取信息
  • eureka返回服务列表信息给Ribbon
  • Ribbon将请求轮询到相应的服务地址上去

具体信息,在源码中打断点来调试看看。

2、源码分析

@LoadBalanced注解,就标识了调用方当前这个restTemplate这个对象发起的请求,要被Ribbon拦截

在这里插入图片描述
LoadBalancerInterceptor实现了ClientHttpRequestInterceptor接口:

在这里插入图片描述

在LoadBalancerInterceptor接口重写的intercent方法上打断点,调用order接口(中途会对user服务发起远程调用),断点进入到了这里:

在这里插入图片描述

继续往下,看到了Ribbon对象

在这里插入图片描述

继续往下:成功从eureka拿到服务列表信息

在这里插入图片描述
继续往下调试,看到了IRule这个接口,决定了负载均衡的策略

在这里插入图片描述

以上,调用接口http://localhost:8080/order/102后发生的事情如图:
- 接口中途通过restTemple远程调用http://userservice/user/1
- 被负载均衡拦截器拦截
- 获取url中的服务id,即userservice
- 动态服务列表均衡器向eureka拉取userservice的信息
- eureka返回服务列表给DynamicServiceListLoadBalancer
- 通过IRule挑选出某个服务,返回给RibbonLoadBalancerClient
- 请求被转发到了某个一具体的实例上

在这里插入图片描述

3、负载均衡策略

Ribbon的负载均衡策略是由IRule接口来定义的,它的每一个子接口就是一种策略。

在这里插入图片描述

具体的含义为:

在这里插入图片描述
以上策略中,Ribbon默认的是ZoneAvoidanceRule。想修改负载均衡策略有这两种方法:

代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

@Bean
public IRule randomRule(){return new RandomRule();  //改为随机
}

配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则

userservice: ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule  #负载均衡规则

此时,多次调用order接口(代码中途远程调用user):

http://localhost:8080/order/102

可以看到转发到user实例上的请求不再有明显规律。

4、饥饿加载

重启order服务,然后两次访问order接口,发现耗时相差巨大:

在这里插入图片描述
在这里插入图片描述

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,因此请求时间会很长。

饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下配置开启饥饿加载:

ribbon:eager-load: enabled: true #开启饥饿加载clients: userservice  # 指定对userservice这个服务饥饿加载# clients为list,可添加多个

在这里插入图片描述

相关文章:

【SpringCloud】二、服务注册发现Eureka与负载均衡Ribbon

文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略4、饥饿加载 一、Eureka 1、服务提供者与消费者 服务提供者&#xff1a;一次业务中&#xf…...

图形学实验(完整文件见上传)

CRect rect; this->GetClientRect(rect); pDC->Ellipse(rect); // DDALineView.cpp : implementation of the CDDALineView class // #include “stdafx.h” #include “DDALine.h” #include “DDALineDoc.h” #include “DDALineView.h” #ifdef _DEBUG #define new…...

Spark大数据处理学习笔记(3.2.1)掌握RDD算子

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/FArNP】 文章目录 一、准备工作1.1 准备文件1. 准备本地系统文件2. 把文件上传到 1.2 启动Spark Shell1. 启动HDFS服务2. 启动Spark服务3. 启动Spark Shell 二、掌握转换算子2.1 映射算子 - map()…...

lammps初级:石墨烯、金属材料、纳米流体、热传导、多成分体系、金属、半导体材料的辐照、自建分子力场、MOFS、H2/CO2混合气体等模拟

1 LAMMPS的基础入门——初识LAMMPS是什么&#xff1f;能干什么&#xff1f;怎么用&#xff1f; 1.1 LAMMPS在win10和ubuntu系统的安装及使用 1.2 in文件结构格式 1.3 in文件基本语法&#xff1a;结合实例&#xff0c;讲解in文件常用命令 1.4 data文件格式 1.5 LAMMPS常见错误解…...

【MarkerDown】CSDN Markdown之时序图sequenceDiagram详解

CSDN Markdown之时序图sequenceDiagram详解 序列图 sequenceDiagram参与者与组参与者 participant拟人符号 actor别名 as组 box 消息(连线)激活/失活 activate/deactivate备注 Note循环 loop备选 Alt并行 par临界区 critical中断 break背景高亮 rect注释 %%转义字符的实体代码序…...

ReentrantLock实现原理-公平锁

在ReentrantLock实现原理(1)一节中&#xff0c;我们了解了ReentrantLock非公平锁的获取流程&#xff0c;在本节中我们来看下ReentrantLock公平锁的创建以及锁管理流程 创建ReentrantLock公平锁 创建公平锁代码如下&#xff1a; ReentrantLock reentrantLock new ReentrantL…...

掌握Scala数据结构(2)MAP、TUPLE、SET

一、映射 (Map) &#xff08;一&#xff09;不可变映射 1、创建不可变映射 创建不可变映射mp&#xff0c;用键->值的形式 创建不可变映射mp&#xff0c;用(键, 值)的形式 注意&#xff1a;Map是特质&#xff08;Scala里的trait&#xff0c;相当于Java里的interface&#…...

flutter:文件系统目录、文件读写

参考 参考&#xff1a;老孟 文件存储和网络请求 数据存储 Dart的 IO 库包含了文件读写的相关类&#xff0c;它属于 Dart 语法标准的一部分&#xff0c;所以通过 Dart IO 库&#xff0c;无论是 Dart VM 下的脚本还是 Flutter&#xff0c;都是通过 Dart IO 库来操作文件的。但…...

计算机提示“找不到vcruntime140.dll,无法继续执行代码可”以这样子修复

首先&#xff0c;对于那些不熟悉的人来说&#xff0c;vcruntime140.dll是一个关键文件&#xff0c;用于在Windows操作系统上运行使用C语言编写的大型应用程序。如果你正在运行或安装这样的应用程序&#xff0c;但找不到vcruntime140.dll文件&#xff0c;那么你的应用程序可能无…...

深度学习pytorch实战五:基于ResNet34迁移学习的方法图像分类篇自建花数据集图像分类(5类)超详细代码

1.数据集简介 2.模型相关知识 3.split_data.py——训练集与测试集划分 4.model.py——定义ResNet34网络模型 5.train.py——加载数据集并训练&#xff0c;训练集计算损失值loss&#xff0c;测试集计算accuracy&#xff0c;保存训练好的网络参数 6.predict.py——利用训练好的网…...

Rust in Action笔记 第五章 深入理解数据

如果希望看到f32类型的数转换成整型数字u32类型&#xff0c;需要在unsafe包裹下调用std::mem::transmute(data)&#xff0c;因为在安全的Rust语法中没有把整型数据按照bit转换成浮点数据的实现&#xff0c;如果想要看到浮点数的二进制输出&#xff08;通过{:b}&#xff09;&…...

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码 最近在学习Cocos Creator&#xff0c;作为新手&#xff0c;刚刚开始学习Cocos Creator&#xff0c;刚刚入门&#xff0c;这里记录一下飞机大战小游戏实现。 https://wxaurl.cn/VEgRy2eTMyi 一 安装CocosDashBo…...

2.4 逻辑代数的基本定理

学习目标&#xff1a; 如果我要学习逻辑代数的基本定理&#xff0c;我会采取以下步骤&#xff1a; 1. 学习基本概念&#xff1a;首先&#xff0c;我会花时间了解逻辑代数的基本概念&#xff0c;如逻辑运算符&#xff08;合取、析取、否定等&#xff09;、真值表、逻辑等价性等…...

适用于 Linux 的 Windows 子系统wsl文档

参考链接&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/ 鸟哥的Linux私房菜&#xff1a;http://cn.linux.vbird.org/ http://cn.linux.vbird.org/linux_basic/linux_basic.php http://cn.linux.vbird.org/linux_server/ 目录 安装列出可用的 Linux 发行版列出已…...

C++特殊类的设计与类型转换

特殊类的设计与类型转换 特殊类的设计请设计一个类&#xff0c;只能在堆上创建对象请设计一个类&#xff0c;只能在栈上创建对象请设计一个类&#xff0c;只能创建一个对象(单例模式) C的类型转换 特殊类的设计 请设计一个类&#xff0c;只能在堆上创建对象 通过new创建的类就…...

如何通过关键词搜索API接口

如果你是一位电商运营者或者是想要进行1688平台产品调研的人员&#xff0c;你可能需要借助API接口来获取你所需要的信息。在这篇文章中&#xff0c;我们将会讨论如何通过关键词搜索API接口获取1688的商品详情。 第一步&#xff1a;获取API接口的授权信息 在使用API接口前&…...

智驾域控新战争打响,谁在抢跑?

智能驾驶域控制器赛道&#xff0c;已经成为了时下最为火热的市场焦点之一。 最近&#xff0c;头部Tier1均胜电子公布了全球首批基于高通Snapdragon Ride第二代芯片平台的智能驾驶域控制器产品nDriveH&#xff0c;在这一赛道中显得格外引人注意。 就在不久之前&#xff0c;均胜…...

Android 13无源码应用去掉无资源ID的按钮

Android Wifionly项目,客户要求去掉谷歌联系人里的 手机联系人按钮 需求分析 无应用源码,只能通过系统侧去修改 首先通过 Android Studio 工具 uiautomatorviewer 获取父控件资源ID chip_group ,然后通过遍历获取子控件去掉目标按钮 --- a/frameworks/base/core/java/andr…...

【SCI征稿】中科院2区(TOP),正刊,SCIEEI双检,进化计算、模糊集和人工神经网络在数据不平衡中应用

【期刊简介】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院2区&#xff08;TOP&#xff09; 【检索情况】SCIE&EI 双检&#xff0c;正刊 【数据库收录年份】2004年 【国人占比】22.78%&#xff08;期刊国际化程度高&#xff09; 【征稿领域】进化计算、模…...

Android Audio开发——AAudio基础(十五)

AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。 一、AAudio概述 AAudio 在应用程序和 Android 设备上的音频输入输出之…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...