【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)
微服务技术一
- 技术栈图
- 一、注册中心Eureka
- 概念:
- 搭建EurekaServer
- 服务注册
- 服务发现(消费者对提供者的远程调用)
- 二、Ribbon负载均衡
- 负载均衡的原理:@LoadBalanced
- 负载均衡的策略:IRule
- 懒加载
- 三、Nacos注册中心
- Nacos的安装
- 服务注册到Nacos
- Nacos服务分级存储模型
- 1、配置服务集群属性
- 2、根据集群负载均衡(NacosRule)
- 3、根据权重负载均衡
- Nacos环境隔离 - namespace
- 修改一个服务所处的空间
- 临时实例与非临时实例
- 四、Nacos配置管理
- 统一配置管理
- 配置热更新
- 配置共享
- 搭建Nacos集群
技术栈图
微服务完整的技术栈如图:
技术栈学习:

一、注册中心Eureka
概念:
在Eureka架构中,微服务角色有两类EurekaServer:
- 服务端,注册中心
- 记录服务信息
- 心跳监控
- EurekaClient:客户端
- Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer;每隔30秒向EurekaServer发送心跳
- consumer:服务消费者,例如案例中的 order-service
根据服务名称从EurekaServer拉取服务列表;基于服务列表做负载均衡,选中一个微服务后发起远程调用
什么是消费者提供者?
- 消费者:调用其他服务
- 提供者:被调
A调B,B调C,B是什么角色?
- B的角色要看相对于谁而言
一个服务既可以是消费者又可以是提供者

搭建EurekaServer
- 1、创建项目,引入
spring-cloud-starter-netflix-eureka-server的依赖(版本依赖父工程的版本,所以没写)
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 2、编写启动类,添加
@EnableEurekaServer注解

- 3、添加application.yml文件,编写配置
server:port: 1111 # 自定义端口号
spring:application:name: eurekaserver # eureka的服务名称
eureka:client:service-url: # eureka的地址信息defaultZone: http://localhost:1111/eureka
服务注册
- 1、在需要注册的项目中引入
spring-cloud-starter-netflix-eureka-client的依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 2、在application.yml文件,编写配置
spring:application:name: xxxservice # 服务的名称
eureka: client:service-url:defaultZone: http://localhost:1111/eureka
下图是注册了两个服务,可以看到两个客户端的服务和eureka的服务都存在。

一个服务注册两个实例:

服务发现(消费者对提供者的远程调用)
【服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡】
- 1、修改服务的代码,修改访问的路径,用服务名代替ip、端口。下图是之前的路径写法。

修改为:String url = "http://xxxservice/user/" + …… ; - 2、在yyy-service项目组的启动类中的RestTemplate添加负载均衡的注解
@Bean
@LoadBalanced //负载均衡的注解,因为上面我们对xxxservice服务创建了两个实例
public RestTemplate restTemplate() {return new RestTemplate();
}
二、Ribbon负载均衡

负载均衡的原理:@LoadBalanced
@LoadBalanced源码分析取到的负载地址:
- LoadBalancerInterceptor.java
- 继续
loadBalancer.execute,进入RibbonLoadBalancerClient.java
- 在其内部方法中,会有
IRule规则接口,有轮询,随机等负载规则
总结如图:
负载均衡的策略:IRule
上面提到IRule接口,这里做一个简单介绍,理解一下负载规则的继承关系


可以通过定义IRule实现修改负载均衡规则,有两种方式:
-
1、代码方式:在消费者的启动类中,定义一个戏得IRule:
@Bean public IRule randomRule() {return new RandomRule(); } -
2、配置文件方式:在消费者的application.yml文件中,添加新的配置也可以修改规则:
xxxservice: # 先指定提供者服务名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
注意:
两种方法的作用范围是不一样的,第一种消费者所调的全体服务都是这种规则;第二种指定了提供者的服务名,是有所指的。
懒加载
Ribbon默认是采用懒加载,及第一次访问时才会五去创建LoadBalanceClient ,请求时间过长。
而饥饿加载则会在项目启动时创建,降低第一次访问的耗时。
配置开启饥饿加载:
ribbon:eager-load:enabled: true # 开启饥饿加载clients: xxxservice # 指定对xxxservice 这一个服务饥饿加载
ribbon:eager-load:enabled: true # 开启饥饿加载clients: # 多个服务- xxxservice- zzzservice
三、Nacos注册中心
Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相比Eureka功能更加丰富。
Nacos的安装
安装包:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
windows的安装与启动很简单,可以参考自己搜索资料进行
就说一下启动的两种方式:
- 1
文件解压后有bin目录,中的startup.cmd双击就可以启动- 2
bin目录下打开cmd,输入启动命令startup.cmd -m standalone。
启动成功,会有带nacos的banner与网址和completed的显示信息。

http://192.168.150.1:8848/nacos/index.html 会有浏览器窗口,默认账号密码都是nacos 。
服务注册到Nacos
- 1、在父工程中添加
spring-cloud-alibaba的管理依赖:
<dependeny><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependeny>
- 2、提醒:eureka的依赖配置要删掉
- 3、添加nacos的客户端依赖:
<dependeny><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependeny>
- 4、修改消费者与提供者服务中application.yml文件,添加nacos地址:
spring:cloud:nacos:server-addr: localhost:8848 # nacos的服务地址(默认就是8848)
- 5、打开nacos的服务管理列表可以看到服务已经注册到nacos中。点开 “详情” 可以看到该服务的一些信息

Nacos服务分级存储模型
一级是服务,例如userservice
二级是集群,例如杭州或上海
三级是实例,例如杭州机房的某台部署了xxxservice的服务器
1、配置服务集群属性
- 1、修改application.yml,添加配置内容:
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ # 配置集群名称,即机房位置,例如:HZ,杭州
这是将提供者配置了集群属性(消费者配置同上),当消费者调用时,由于负载均衡的影响,会进行轮询的规则,找到与自己同集群服务优先使用,就要进行负载均衡的修改:
2、根据集群负载均衡(NacosRule)
- 1、修改yyyservice(消费者)中的application.yml,设置集群位HZ
spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZ
- 2、然后在yyy-service中设置负载均衡的IRule为NacosRule,这个规则优先会寻找与自己同集群的服务:
yyyservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
- 3、注意将xxx-service的权重都设置为1 (在Nacos的控制台可以设置实例的权重值)
NacosRule负载均衡策略:
1、优先选择同集群服务实例
2、本地集群找不到提供者,才去其它集群寻找,并且会报警告
3、确定了可用实例列表后,在采用随机负载均衡挑选实例
3、根据权重负载均衡
- 1、在Nacos控制台可以设置实例的权重值,首先选中实例后面的编辑按钮
- 2、将权重设置,会发现小于1的权重被访问到的频率大大降低

实例的权重控制:
1、Nacos控制台可以设置实例的权重值,在0~1之间
2、同集群内的多个实例,权重越高被访问的频率越高
3、权重设置为0则完全不会被访问
Nacos环境隔离 - namespace
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
nacos默认有一个“public (保留空间)”。
新建命名空间的时候,命名空间ID可以不填,会随机生成。
不同namespace下的服务是不可见的
修改一个服务所处的空间
在服务的application.yml,添加namespace:
spring: cloud:nacos:server-addr: localhost:8848discovery:cluster-name: SH # 上海namespace: xxxxxxxxxxxxxxxx # 命名空间ID
临时实例与非临时实例
服务注册到Nacos时,可以选择注册为临时实例或非临时实例:
spring:cloud:nacos:discovery:ephemeral: false # 设置非临时实例,默认是true临时

【主动检测对服务的压力比较大,所以一般推荐临时实例】
四、Nacos配置管理
统一配置管理
- 1、在Nacos中添加配置文件

- Data-ID:相当于配置文件名,一般不要定义为application.yml,可以使用 “服务名-环境.yaml” 。
- Group:分组不动就可
- 描述:就是描述
- 配置格式:选择 YAML
- 配置内容:做热更新的配置

- 2、在某个服务的pom中引入Nacos的配置管理客户依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 3、在服务中的resource目录添加一个
bootstrap.yml文件,这个文件是引导文件优先级高于application.yml:
配置nacos地址、当前环境、服务名称、文件后缀名,决定了程序启动时去nacos读取哪个文件。
spring:application:name: xxxservice # 服务名称profiles:active: dev # 开发环境,此处是devcloud:nacos:server-addr: localhost:8848 # nacos地址config: file-extension: yaml # 文件名后缀
- 注意:在原本的application.yml中关于服务名称和nacos服务的配置删掉
配置热更新
热更新:服务的配置修改,且修改后不需要重启服务,配置就能生效。
- 方式一:在@Value注入的变量所在类上(Controller) 添加注解
@RefreshScope

- 方式二:使用
@ConfigurationProperties注解,自动刷新

【前缀名与变量名两者拼接与配置文件一致,就能完成属性的自动配置】
配置共享
微服务启动时会从nacos读取多个配置文件:
- [spring.application.name]-[spring-profiles.active].yaml,例如:xxxservice-dev.yml
- [spring-application.name].yaml,例如userservice.yml
无论profile如何变化,[spring-application.name].yaml文件一定会加载,因此多环境贡献配置可以写入这个文件。
【详细建议主攻一下这个环境共享】

搭建Nacos集群

搭建集群的基本步骤:
- 搭建数据库,初始化数据表结构
- 下载nacos安装包
- 配置nacos
- 启动nacos集群
- nginx反向代理
配置集群nacos:
- 进入nacos的conf目录,修改配置文件cluster.conf.example,重命名为cluster.conf
- 配IP
- 修改application.properties文件,添加数据库配置
- 配置完成后复制三份模拟,将三个nacos的端口改为不一样的
- 启动nacos,在bin目录下的命令是
startup
nginx的反向代理:
- 修改conf/nginx.conf文件,配置
- 此时访问nacos的路径为:
localhost/nacos即可进入nacos的网址,虽然只有一个网址,由于nginx的存在nacos做了负载均衡
相关文章:
【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)
微服务技术一 技术栈图一、注册中心Eureka概念:搭建EurekaServer服务注册服务发现(消费者对提供者的远程调用) 二、Ribbon负载均衡负载均衡的原理:LoadBalanced负载均衡的策略:IRule懒加载 三、Nacos注册中心Nacos的安…...
【Linux】可重入函数 volatile关键字 以及SIGCHLD信号
可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数: 假设我们现在要对…...
【动态规划】回文串问题
文章目录 动态规划(回文串问题)1. 回文子串2. 最长回文子串3. 回文串分割 IV4. 分割回文串 ||5. 最长回文子序列6. 让字符串成为回文串的最小插入次数 动态规划(回文串问题) 1. 回文子串 题目链接 状态表示 f[i][j]表示 i 到 j …...
Laravel Swift Mail发送带附件的邮件报错 “Swift_IoException The path cannot be empty“处理
先说下情况,就是我要做一个发送附件的邮件发送功能,结果,报错:The path cannot be empty。给我整的有点迷糊,网上也没有类似的问题。后来,我检查了一下代码,发现有个地方,是需要给附…...
Linux下常见的代理服务器软件介绍
在Linux系统中,代理服务器是我们搭建网络环境和处理网络请求的常用工具。但是,你知道Linux下常见的代理服务器软件有哪些吗?本文将为你带来对几款常见的Linux代理服务器软件的介绍,帮助你选择适合的代理服务器。 一、Squid&#…...
SCSS的基本用法
1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法,右半部分是编译后的css。(整篇文章皆是如此) 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…...
alertmanager创建nginx-ingress basic auth鉴权
步骤 生成密码 printf "admin:$(openssl passwd -crypt xxxxxx)\n" >> auth 创建新的 Kubernetes 密钥 kubectl create secret generic basic-auth --from-file auth -n victoria-metrics 修改 ingress 以使用 secret 中的凭证来实现基本身份验证 编辑 P…...
系列六、Redis中的五大数据类型及相关操作
一、五大数据类型 String类型、List类型、Set类型、ZSet类型、hash类型。 二、String类型 2.1、内存储存模型 2.2、常用操作命令 三、List类型 3.1、概述 list列表,相当于Java中的list集合。特点:元素有序 且 可以重复。 3.2、内存存储模型 3.3、常用…...
四大运营商的大流量卡测评,看完您会选哪个运营商?
很多朋友都说网上的流量卡资费是真的便宜,但是小编认为资费便宜归便宜,但是运营商的小心思也有不少。 今天小编就带大家看一看三大运营商推出的正规流量卡都有哪些小心思? 首先,移动推出的线上大流量卡数量是最少的ÿ…...
Apache-Maven
安装Maven 解压apache-maven到目录下 Maven目录如下 bin:目录中存放的是可执行文件,JAVA项目中的编译执行打包都要使用bin. conf:存放的是Maven的配置文件,本地配置、私服配置都需要在conf下的settings.xml进行配置。 lib下存放的是Maven所…...
什么是原子交换?
安全地在各个区块链网络之间传输资产对于释放被困流动性并吸引更多用户进入这一领域至关重要,同时也保持 Web3 的信任最小化核心价值。原子交换是一种让两个人在不依赖于中介来促成交易的情况下,在不同的区块链网络之间交换通证资产的方式。这为 DeFi 用…...
java springboot word文档转pdf
java springboot word文档转pdf 1、环境2、依赖3、代码 1、环境 1、java、springboot 2、maven或者gradle 3、办公软件(自己电脑上的wps或者office等,如果部署到服务器上也要安装,linux、Mac 都有,自己安装) 可能会遇…...
【Leetcode Sheet】Weekly Practice 2
Leetcode Test 1281 整数的各位积和之差(8.9) 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 提示: 1 < n < 10^5 【原始代码】: int subtractProductAndSum(int n){//1 < n < 10^5//…...
【BERTopic应用 03/3】:微调参数
一、说明 一般来说,BERTopic 在开箱即用的模型中工作得很好。但是,当您有数百万个数据要处理时,使用基本模型处理数据可能需要一些时间。在这篇文章中,我将向您展示如何微调BERTopic中的一些参数并比较它们的结果。让我们潜入。 二…...
2023年上半年数学建模竞赛题目汇总与难度分析
2023年上半年数学建模竞赛题目汇总与难度分析 由于近年来国赛ABC题出题方式漂浮不定,没有太大的定性,目前总体的命题方向为,由之前的单一模型问题变为数据分析评价优化或者预测类题目是B、C题的主要命题方向。为了更好地把握今年命题的主方…...
Linux下搭建java环境
文章目录 一,xshell链接linux二,linux安装jdk环境 一,xshell链接linux 这里用到的工具,VMware搭配CentOS7 64位Xshell5 操作之前确保,传输Xshell连接了虚拟机 打开Xshell,文件->新建 主机ip—>进入虚拟机,右键打开终端,输入命令:ifco…...
String、StringBuffer、StringBuilder三者的异同?
String字符串 不可变的字符序列在 jdk1.8,我们底层用 char [ ] 存储在 jdk 17,我们底层用 byte [ ] 存储 StringBuffer字符串缓冲区类 可变的字符序列,线程安全的(synchronized),效率低在 jdk1.8…...
htmlCSS-----弹性布局案例展示
目录 前言 效果展示 编辑 代码 思路分析 前言 上一期我们学习了弹性布局,那么这一期我们用弹性布局来写一个小案例,下面看代码(上一期链接html&CSS-----弹性布局_灰勒塔德的博客-CSDN博客) 效果展示 代码 html代码&am…...
Fiddler模拟请求发送和修改响应数据
fiddler模拟伪造请求 方法一:打断点模拟HTTP请求 1、浏览器页面填好内容后(不要操作提交),打开fiddler,设置请求前断点,点击菜单fiddler,”Rules”\”Automatic Breakpoints”\”Before Requests” 2、在…...
RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入
配置DID 一、Developer中创建SWC1.1 创建Application Component Type1.2 实例化Component二、在SWC中创建接口以及Runnable2.1 创建DID的Service Ports2.2 创建DID的Service Runnable三、在Configurator连接接口以及生成代码3.1 连接DCM与SWC3.2 生成RTE3.3 生成SWC的DID的模板…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...







