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

Java分布式微服务1——注册中心(Eureka/Nacos)

文章目录

  • 基础知识
  • 注册中心
    • Eureka注册中心与Ribbon负载均衡
      • 1、Eureka注册中心
      • 2、Eureka的搭建
      • 3、Eureka服务注册
      • 4、复制服务实例
      • 5、拉取服务
      • 6、Ribbon负载均衡的流程及Eureka规则调整:
      • 7、Ribbon负载均衡饥饿加载
    • Nacos注册中心
      • 1、服务端Nacos安装与启动
      • 2、客户端Nacos注册
      • 3、Nacos分级存储模型
      • 4、修改NacosRule负载均衡规则
      • 5、Nacos环境隔离
      • 6、Nacos注册中心与Eureka注册中心的区别
      • 7、Nacos统一配置管理与热更新
        • 配置管理
        • 配置热更新
      • 8、多环境配置共享
      • 9、Nacos集群

基础知识

远程调用
向其他服务器请求信息(远程调用)
先在application或者configuration中注册一个Bean方便之后使用(可忽略)

@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}

使用restTemplate方法发送请求
getForObject/postForObject/…

User user = restTemplate.getForObject("http://localhost:8081/user/"+order.getUserId(), User.class);

注册中心

Eureka注册中心与Ribbon负载均衡

1、Eureka注册中心

上面的url是硬编码写死的,很不方便切换,所以使用Eurake注册中心来管理服务提供者的地址
Eureka相当于一个中介所,所有其他微服务都是它的客户(eureka-client)

  • 每个微服务启动的时候都会给Eureka注册自己的信息
  • 其他微服务从Eureka用名称就能找到对应微服务提供者,并远程调用。
  • 每个微服务提供者会以30s为间隔和Eureka通报自己的状态,即“心跳”,以确保它可用
  • 使用负载均衡(Ribbon),从几个实例中挑一个(一个微服务在实际工作中可以有多个实例的)

2、Eureka的搭建

1、引入服务端依赖

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

2、使用@EnableEurekaServer自动装配

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {public static void main(String[] args) throws Exception {SpringApplication.run(EurekaApplication.class, args);}
}

3、配置文件(注册Eureka自己,方便之后的Eureka集群)

server:port: 10086
spring:application:name: eurekaserver # 服务名称
eureka:client:service-url: # eureka地址信息defaultZone: http://127.0.0.1:10086/eureka

3、Eureka服务注册

1、引入客户端依赖

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

2、配置文件添加服务名字和Eureka服务的地址
记得给服务添加名字,不然没办法去找到这个服务

spring:application:name: userservice # 服务名称eureka:client: service-url: # eureka 的地址defaultZone: http://127.0.0.1:10086/eureka

4、复制服务实例

右键复制
在这里插入图片描述
在弹出窗口中VM option输入-Dserver.port=11111来选择一个端口,就会产生一个新的服务

5、拉取服务

1、给RestTemplate添加负载均衡注解

@Bean
@LoadBalanced // eureka负载均衡
public RestTemplate restTemplate(){return new RestTemplate();
}

2、使用RestTemplate对象,将地址直接换成服务名称,(有问题可以保留端口号试一下)

// 对比  restTemplate.getForObject("http://localhost:8081/user/"+order.getUserId(), User.class);
User user = restTemplate.getForObject("http://userservice/user/"+order.getUserId(), User.class);

这样就可以从eureka直接通过名字拉取服务,而不是写死服务地址

6、Ribbon负载均衡的流程及Eureka规则调整:

Ribbon是被Spring Boot Cloud内置的,它可以帮助开发人员更轻松地实现客户端负载均衡。
Eureka和Nacos都使用了Ribbon来做负载均衡操作

在这里插入图片描述其中IRule是一个代表查询规则的接口,它有很多实现类(默认ZoneAvoidanceRule):
在这里插入图片描述
调整规则的方法(在消费者处修改):

  1. 在Application或者Configuration中定义IRule的Bean,等于把容器中系统默认放进去的对象替换了
@Bean
public IRule randomRule(){return new RandomRule();
}
  1. 局部地调整负载均衡规则,在配置文件.yml中添加配置(下面的例子是对userservice服务请求时使用随机选取规则)
userservice:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

7、Ribbon负载均衡饥饿加载

Ribbon是个懒加载,第一次访问的时候才创建RibbonLoadBalancerClient,第一次请求时间长
饥饿加载会在项目启动时创建,第一次访问快,下面是一个对userservice、orderservice执行饥饿加载的示例
多个服务需要用“- name”

ribbon:eager-load:enabled: true # 开启饥饿加载clients: - userservice - orderservice

Nacos注册中心

alibaba提供的注册中心

1、服务端Nacos安装与启动

Nacos是要装在服务器端的,学习的时候就装在本机
Nacos下载,下载压缩包,解压到非中文路径中
控制台cmd在当前目录startup -m standalone以单节点模式启动(默认是集群模式,会报IO错误)
上面有一个地址是控制台,账号密码默认nacos

2、客户端Nacos注册

  1. 在父工程中添加spring-cloud-alibaba的管理依赖(从springboot官网找)
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>{project-version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
  1. 删掉Eureka的依赖,会产生冲突,也记得删掉eureka的@LoadBalanced注释等东西
  2. 添加nacos客户端依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 修改配置,注释eureka地址,加入nacos的地址和端口(默认8848)
spring:cloud:nacos:server-addr: http://127.0.0.1:8848 # nacos 服务端地址

启动客户端微服务,这个时候在你的nacos控制台服务列表就能看到了
和eureka一样,nacos也要在application上定义一个RestTemplate的Bean并且加上@LoadBalanced,使用时也是直接用服务名代替地址

3、Nacos分级存储模型

把服务的多个实例分到多个集群中,每个集群一般不在一个地理位置
形成 服务-集群-实例 多级架构
一般尽可能使用本地集群(快),有故障的时候才使用异地的
在这里插入图片描述在客户端修改application.yml添加配置集群名称即可

spring:cloud:nacos:server-addr: http://127.0.0.1:8848 # nacos 服务端地址discovery:cluster-name: ChengDu # 配置集群名称,一般是机房位置

先启动两个实例,再把集群名字改了启动另一个实例,就可以模拟两个集群的情况了
我在这个时候需要重新启动nacos,可能是突然多了一个集群它有点呆,连不上控制台了

4、修改NacosRule负载均衡规则

Nacos也是用了Spring cloud的Ribbon负载均衡
修改规则就是给Ribbon不同的规则实现类

  1. 优先寻找与自己同集群的服务,本地集群中的实例随机选择
userservice:ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
  1. 根据权重控制访问频率
    在服务详情中编辑实例权重,值越大权重越高,权重变成0就不会被调用(这个时候就可以更新升级这个实例)
    在这里插入图片描述

5、Nacos环境隔离

Nacos的服务存储和数据存储的最外层都是一个namespace,用来做最外层隔离,不同namespace的不能互相访问
Nacos控制台命名空间选项选择新建
在这里插入图片描述

在application.yml中添加配置将服务分到某命名空间

spring:cloud:nacos:discovery:namespace: 71097ffc-c1e7-471b-8538-879599cbf6eb # 命名空间id

6、Nacos注册中心与Eureka注册中心的区别

Nacos会把实例分成临时(默认)或非临时,对他们的健康检测不同

  1. 对临时实例与Eureka一样对Nacos服务器发送心跳检测,出现问题就剔除该实例
  2. 对非临时实例不做心跳,而是Nacos服务器主动发请求询问服务提供者状态,不健康时也不会剔除,会一直问
  3. Nacos中,不仅客户端会定时从注册中心拉取服务(与Eureka相同),注册中心也会主动推送服务的变更信息

服务提供者中添加配置,从而设置为非临时实例

spring:cloud:nacos:discovery:ephemeral: false # 设置为非临时实例

7、Nacos统一配置管理与热更新

配置管理

一个服务的配置文件可能和几十个服务实例有关系,在更新配置后这些服务都需要重启
我们需要对服务的配置统一管理,并且对实例做热更新
在Nacos控制台配置管理新增配置,配置内容里应该是可能有变化的配置,不是所有配置 yml就是yaml
在业务中使用Spring的@Value注解就可以去读取配置文件中的值

之后在项目启动时会先读取nacos配置文件,再读取本地配置文件application.yml并且将其合并,再创建spring容器加载bean

在这里插入图片描述

  1. 引入Nacos的配置管理客户端依赖
<!--        nacos配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
  1. 在resource中新建bootstrap.yml文件,它是个引导文件,这个文件的优先级比nacos.yml和application.yml都要高
    ,我们可以把nacos服务器信息和配置文件信息写在bootstrap.yml中,以方便找到服务对应配置
# 配置的名字是userservice-dev.yaml
spring:application:name: userservice # 服务名称,就是配置名称的前半段profiles:active: dev # 开发环境,这里是dev,配置名称的后半段cloud:nacos:config:server-addr: localhost:8848 # nacos地址file-extension: yaml # 文件后缀名

如果出问题试一下加上bootstrap的依赖,新版springboot不默认启动它

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-bootstrap -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>4.0.4</version>
</dependency>

还要注意nacos控制台中配置文件和服务需要在一个namespace中!!!
@Value获取不到配置的问题查看这个博主

配置热更新

Nacos中的配置文件变更后微服务无需重启即可感知,有两种方法:
方法一:在@Value注入的变量所在类上添加注解@RefreshScope

@RestController
@RequestMapping("/user")
@RefreshScope
public class UserController {@Value("${pattern.dateformat}") // 尝试通过名字获取nacos配置文件中的值private String dateformat;
}

方法二:使用@ConfigurationProperties
新建一个类,要保证:

  • 其结构与nacos配置文件中的某条相同(重要)
  • 有Getter和Setter方法
  • 注解中使用相同前缀prefix
  • @Component以方便其他地方使用
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {private String dateformat;
}//对比配置文件的内容
pattern:dateformat: yyyy-MM-dd HH:mm:ss

8、多环境配置共享

有的配置是多个环境共有的
在这里插入图片描述
配置优先级:

服务名-profile.yaml>服务名.yaml>本地配置文件

9、Nacos集群

这篇博文

相关文章:

Java分布式微服务1——注册中心(Eureka/Nacos)

文章目录 基础知识注册中心Eureka注册中心与Ribbon负载均衡1、Eureka注册中心2、Eureka的搭建3、Eureka服务注册4、复制服务实例5、拉取服务6、Ribbon负载均衡的流程及Eureka规则调整&#xff1a;7、Ribbon负载均衡饥饿加载 Nacos注册中心1、服务端Nacos安装与启动2、客户端Nac…...

(文章复现)建筑集成光储系统规划运行综合优化方法matlab代码

参考文献&#xff1a; [1]陈柯蒙,肖曦,田培根等.一种建筑集成光储系统规划运行综合优化方法[J].中国电机工程学报,2023,43(13):5001-5012. 1.基本原理 本文建立的双层耦合模型内、外层分别对应求解容量配置与能量调度问题。外层模型设置光伏与储能容量备选集并将容量配置组合…...

【Redis】——RDB快照

Redis 是内存数据库&#xff0c;但是它为数据的持久化提供了两个技术&#xff0c;一个是AOF日志&#xff0c;另一个是RDB快照&#xff1a; AOF 文件的内容是操作命令&#xff1b;RDB 文件的内容是二进制数据。 RDB 快照就是记录某一个瞬间的内存数据&#xff0c;记录的是实际…...

微服务监控技术skywalking的部署与使用(亲测无坑)

微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注&#xff1a;本篇文章采用docker部署&#xff0c;采用8.2.0版本&#xff0c;版本一定…...

DLA 神经网络的极限训练方法:gradient checkpointing

gradient checkpointing 一般来说&#xff0c;训练的过程需要保存中间结果&#xff08;不管是GPU还是CPU&#xff09;。前向传播根据输入(bottom_data)计算输出(top_data)&#xff0c;后向传播由top_diff计算bottom_diff&#xff08;如果某个变量打开梯度进行训练的话&#xff…...

python excel 操作

excel文件内容如下&#xff1a; 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径&#xff0c;如果路径或者文件名有中文给前面加一个 r 2、常用函数 &#xff08;1&#xff09;获取一个sheet工作表 table file.sheets(…...

记一次Linux启动Mysql异常解决

文章目录 第一步&#xff1a; netstat -ntlp 查看端口情况2、启动Mysql3、查看MySQL日志 tail -100f /var/log/mysqld.log4、查看磁盘占用情况&#xff1a;df -h5、思路小结 第一步&#xff1a; netstat -ntlp 查看端口情况 并没有发现3306数据库端口 2、启动Mysql service …...

ATFX汇市:美联储年内或仍将加息依次,美指向下空间不大

环球汇市行情摘要—— 昨日&#xff0c;美元指数上涨0.08%&#xff0c;收盘在102.08点&#xff0c; 欧元贬值0.07%&#xff0c;收盘价1.1003点&#xff1b; 日元贬值0.51%&#xff0c;收盘价142.47点&#xff1b; 英镑升值0.28%&#xff0c;收盘价1.2784点&#xff1b; 瑞…...

【博客687】k8s informer的list-watch机制剖析

k8s informer的list-watch机制剖析 1、list-watch场景&#xff1a; client-go中的reflector模块首先会list apiserver获取某个资源的全量信息&#xff0c;然后根据list到的rv来watch资源的增量信息。希望使用client-go编写的控制器组件在与apiserver发生连接异常时&#xff0c…...

用Python获取链家二手房房源数据,做可视化图分析数据

前言 数据采集的步骤是固定: 发送请求, 模拟浏览器对于url地址发送请求获取数据, 获取网页数据内容 --> 请求那个链接地址, 返回服务器响应数据解析数据, 提取我们需要的数据内容保存数据, 保存本地文件 所需模块 win R 输入cmd 输入安装命令 pip install 模块名 (如果你…...

Yield Guild Games:社区更新 — 2023 年第二季度

本文重点介绍了 Yield Guild Games (YGG) 2023 年第二季度社区更新中涵盖的关键主题&#xff0c;包括公会发展计划 (GAP) 第 3 季的总结、YGG 领导团队的新成员以及 YGG 的最新消息地区公会网络和广泛的游戏合作伙伴生态系统。 在 YGG 品牌焕然一新的基础上&#xff0c;第二季…...

Stable Diffusion - 运动服 (Gymwear Leggings) 风格服装与背景的 LoRA 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132179050 测试模型&#xff1a;DreamShaper 8 运动裤 (Gymwear Leggings) 是紧身的裤子&#xff0c;通常用于健身、瑜伽、跑步等运动。运动裤的…...

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…...

无涯教程-Perl - continue 语句函数

可以在 while 和 foreach 循环中使用continue语句。 continue - 语法 带有 while 循环的 continue 语句的语法如下- while(condition) {statement(s); } continue {statement(s); } 具有 foreach 循环的 continue 语句的语法如下- foreach $a (listA) {statement(s); } co…...

【贪心算法】leetcode刷题

贪心算法无固定套路。 核心思想&#xff1a;先找局部最优&#xff0c;再扩展到全局最优。 455.分发饼干 两种思路&#xff1a; 1、从大到小。局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。先遍历的胃口&a…...

PyMySQL库版本引起的python执行sql编码错误

前言 长话短说&#xff0c;之前在A主机&#xff08;centos7.9&#xff09;上运行的py脚本拿到B主机上&#xff08;centos7.9&#xff09;运行报错&#xff1a; UnicodeEncodeError: latin-1 codec cant encode characters in position 265-266: ordinal not in range(256)两个…...

第二章-算法

第二章-算法 数据结构和算法的关系 算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 算法的特性 算法有五个基本特征&#xff1a;输入、输出、有穷性、确定性和可行性。 输入&#xff1a;算法具…...

‘vue’不是内部或外部命令,也不是可运行的程序或批处理文件的原因及解决方法

今天我在用node.js的时候&#xff0c;结果出现如下错误&#xff1a; C:\Users\xiesj> vue -v vue不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 原因&#xff1a; 1、确定npm是否已正确安装&#xff1f; 2、确定vue以及vue-cli已正确安装&#xff1f;…...

HBase API

我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的&#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目&#xff0c;导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…...

Qt6之QListWidget——Qt仿ToDesk侧边栏(1)

一、 QLitWidget概述 注意&#xff1a;本文不是简单翻译Qt文档或者接口函数&#xff0c;而侧重于无代码Qt设计器下演示使用。 QListWidget也称列表框类&#xff0c;它提供了一个类似于QListView提供的列表视图&#xff0c;但是它具有一个用于添加和删除项的经典的基于项的接口…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...