Nacos-服务注册,服务发现(一)

nacos快速入手

Nacos是Spring Cloud Alibaba的组件, Spring Cloud Alibaba遵循Spring Cloud中定义的服务注册, 服

务发现规范. 因此使⽤Nacos和使⽤Eureka对于微服务来说,并没有太⼤区别.

主要差异在于:

  • Eureka需要⾃⼰搭建⼀个服务, Nacos不⽤⾃⼰搭建服务, 组件已经准备好了, 只需启动即可.
  • 对应依赖和配置不同

1.引入spring-cloud-alibaba的依赖

在⽗⼯程的pom⽂件中的 <dependencyManagement> 中引⼊Spring Cloud Alibaba的依赖:

<properties><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
</properties>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope>
</dependency>

<aside> 💡

注意: Spring Boot 和Spring Cloud的版本是有⼀定对应关系的. Spring Cloud Alibaba也遵循Spring Cloud 的标准, 在引⼊依赖时, ⼀定要确认各个版本的对应关系.

Spring Cloud Alibaba 和Spring Cloud版本对应关系, 参考官⽅⽂档:

版本发布说明-阿里云Spring Cloud Alibaba官网

版本在⼀定范围内可以⾃由选择.

</aside>

2.引入Nacos相关的依赖

在order-service和product-service中引⼊nacos依赖

				<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>//引⼊Load Balance依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency>

3.修改配置

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端⼝

spring:application:name: product-servicecloud:nacos:discovery:server-addr: 110.41.51.65:10020

4.远程调用

修改IP为项目名称

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "<http://product-service/product/>" + orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

为restTemplate添加负载均衡注解 @LoadBalanced

@Configuration
public class BeanConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}

5.测试

启动order-service 和product-service服务, 观察Nacos的管理界⾯, 发现order-service 和product-service 都注册在Nacos上了。

测试接口:http://127.0.0.1:8080/order/1

启动多个服务,测试负载均衡

启动三个 product-service 实例

观察nacos:

多次访问,http://127.0.0.1:8080/order/1,观察日志

常见问题

  1. java.net.UnknownHostException

    2023-12-25T19:04:23.803+08:00 ERROR 25892 --- [nio-8080-exec-1] o.a.c.c.C.[.[.
    [/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] 
    in context with path [] threw exception [Request processing failed: 
    org.springframework.web.client.ResourceAccessException: I/O error on GET 
    request for "<http://product-service/product/1001>": product-service] with root 
    cause
    java.net.UnknownHostException: product-serviceat java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:572) ~
    [na:na]at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]at java.base/java.net.Socket.connect(Socket.java:583) ~[na:na]at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:183) ~
    [na:na]at 
    java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:534) ~[na:na]
    ......
    

    检查是否添加 LoadBalance 依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
    </dependency>
    
  2. 服务注册失败

    可能没有报错⽇志, 或者报错⽇志如下(与版本有关)

    Parameter 0 of method inetIPv6Utils in
    com.alibaba.cloud.nacos.util.UtilIPv6AutoConfiguration required a bean of type 
    'org.springframework.cloud.commons.util.InetUtilsProperties' that could not be 
    found.
    The injection point has the following annotations:- 
    @org.springframework.beans.factory.annotation.Autowired(required=true)
    Action:
    Consider defining a bean of type 
    'org.springframework.cloud.commons.util.InetUtilsProperties' in your 
    configuration.
    

    检查Spring Cloud Alibaba版本是否正确 参考:版本发布说明-阿里云Spring Cloud Alibaba官网

Nacos负载均衡

Nacos⽀持多种负载均衡策略, 包括权重, 同机房, 同地域, 同环境等.

服务下线

当某一个节点上接口的性能较差时,我们可以第一时间对该节点进行下线,防止对服务造成一定的影响。(问ai再确认一下)

步骤:服务详情 → 下线

点击下线后,再次请求接⼝,会发现该服务没有请求进来了,再次单击上线, 该节点会继续收到请求。

权重配置

权重配置,配置的是这个节点流量权重,权重大就代表流量大,权重小就代表流量小。

1.修改权重配置

操作: 详情 → 对应节点 → 编辑 → 修改权重值

权重配置默认为1,这里测试改成 0.1

2.开启 Nacos 负载均衡策略

由于Spring Cloud LoadBalance组件⾃⾝有负载均衡配置⽅式, 所以不⽀持Nacos的权重属性配置。

我们需要开启Nacos的负载均衡策略, 让权重配置⽣效

参考:如何解决MSE Nacos上修改服务实例的权重不生效问题_微服务引擎(MSE)-阿里云帮助中心

#开启nacos的负载均衡策略
spring:cloud:loadbalancer:nacos:enabled: true

3.测试权重配置

启动服务,访问多次接⼝,观察结果, 会发现9091端⼝号的实例接收的请求明显⽐另外两个实例少。

整体流量⽣效, 局部流量不是严格按照设置的⽐例进⾏分配的

常见问题

修改权重时, 可能会报错:

原因:Nacos 采⽤ raft 算法来计算 Leader, 并且会记录前⼀次启动的集群地址, 当服务器 IP 改变时

导致 raft 记录的集群地址失效, 导致选 Leader 出现问题. (⽹络环境发⽣变化时, IP地址也会发⽣变化)

解决办法:删除 Nacos 根⽬录下 data ⽂件夹下的 protocol ⽂件夹即可。

Nacos 集群优先访问

Nacos把同⼀个机房内的实例, 划分为⼀个集群. 所以同集群优先访问, 在⼀定程度上也可以理解为同房优先访问.

微服务架构中, ⼀个服务通常有多个实例共同提供服务, 这些实例可以部署在不同的机器上, 这些机器

可以分布在不同的机房, ⽐如product-service:

实例1: 分布在上海机房 实例2: 分布在上海机房 实例3: 分布在北京机房 实例4: 分布在北京机房

微服务访问时, 应尽量访问同机房的实例. 当本机房内实例不可⽤时, 才访问其他机房的实例.

⽐如order-service 在上海机房, product-service 在北京和上海机房都有实例, 那我们希望可以优先访

问上海机房, 如果上海机房没有实例, 或者实例不可⽤, 再访问北京机房的实例. 通常情况下, 因为同一

个机房的机器属于⼀个局域⽹, 局域⽹访问速度更快⼀点.

为实例配置集群名称

1.为product-service配置集群名称

spring:cloud:nacos:discovery:cluster-name: SH #集群名称: 上海集群

重启服务, 观察Nacos控制台, SH集群下多了⼀个实例

复制product-service启动配置, 添加VM Option

设置9091端⼝号的实例, 机房为BJ

-Dserver.port=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ

设置9092端⼝号的实例, 机房为BJ

-Dserver.port=9092 -Dspring.cloud.nacos.discovery.cluster-name=BJ

观察Nacos, BJ集群下多了两个实例

2.为order-service配置集群名称

spring:cloud:nacos:discovery:cluster-name: SH #集群名称: 上海集群

开启Nacos负载均衡策略

spring:cloud:loadbalancer:nacos:enabled: true

测试

启动服务

  1. 对接⼝访问多次, 观察⽇志, 会发现只有9090端⼝的实例收到了请求(同集群)

  2. 把9090端⼝的实例进⾏下线(SH集群), 再次访问接⼝, 观察⽇志, 发现9091端⼝和9092端⼝的实例收到了请求

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

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

相关文章

单片机(STM32-ADC模数转换器)

一、基础知识1. 模拟信号&#xff08;Analog Signal&#xff09;定义&#xff1a;模拟信号是连续变化的信号&#xff0c;可以取任意数值。特点&#xff1a;幅值和时间都是连续的&#xff0c;没有“跳变”。举例&#xff1a;声音&#xff08;麦克风采集到的电压&#xff09;温度…

side.cpp - OpenExo

side.cpp构造函数源代码run_side - 核心read_data()源代码FSR压力传感器读取与赋值步态事件检测&#xff1a;落地&#xff08;ground_strike&#xff09;步态周期自适应&#xff1a;期望步长更新Toe-Off/Toe-On事件检测与站立/摆动窗口更新步态百分比进度估算FSR阈值动态读取&a…

基于Java+MySQL实现(Web)文件共享管理系统(仿照百度文库)

文件共享管理系统的设计与实现摘要&#xff1a;本文件共享管理系统解决了用户在搜索文件不需要下载文件到本地硬盘后才能查看文件的详细内容的弊端&#xff1b;解决用户在搜索关键字不明确条件下无法搜索到自己需要的文件弊端&#xff1b;解决了系统用户并发量增加后服务器宕机…

go语言基础教程:1. Go 下载安装和设置

1. Go 下载安装和设置1. 安装Go 官网下载安装即可&#xff0c;注意要记住安装的位置&#xff0c;例如D:\Go cmd输入go 或者go env 会输出各种信息&#xff0c;代表安装成功 2. hello go &#xff08;1&#xff09;编写 hello.go go是以文件夹为最小单位管理程序的&#xff0c…

使用相机不同曝光时间测试灯光闪烁频率及Ai解释

1.背景坐地铁上&#xff0c;拨弄着手机拍照中的专业模式&#xff0c;偶然发现拍出了条纹&#xff0c;怀疑是灯光的缘故&#xff0c;但是随后在家里的LED等下就拍不出类似的效果了。好奇心❤让我又尝试多了解了一点和不断尝试&#xff0c;发现不同的曝光时间可以拍出不同明显程度…

力扣-416.分割等和子集

题目链接 416.分割等和子集 class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i 0; i < nums.length; i) {sum nums[i];}if (sum % 2 1)return false;int target sum / 2;// dp[i]表示&#xff1a;背包容量为i时&#xff0c;能装的最大…

http协议学习-body各种类型

1、概述使用postman工具和nc命令分析http协议中body各种类型的格式。2、分析环境准备虚拟机中用nc命令模仿服务器&#xff0c;启动监听状态。 windows机器安装postmannc -k -l 192.168.202.223 80821、params参数postman中params添加俩个key为m、n&#xff1b;value为1、2&…

C++中的塔尖算法(Tarjan算法)详解

C中的塔尖算法&#xff08;Tarjan算法&#xff09;详解——目录C中的塔尖算法&#xff08;Tarjan算法&#xff09;详解一、什么是Tarjan算法&#xff1f;二、算法原理与实现步骤1. 核心概念2. 主要逻辑3. C代码示例三、应用场景与扩展1. 典型应用2. 注意事项四、为什么选择Tarj…

Qt 数据库事务处理与数据安全

在 Qt 应用程序中&#xff0c;数据库事务处理是确保数据完整性和一致性的关键技术。通过事务&#xff0c;可以将多个数据库操作作为一个不可分割的单元执行&#xff0c;保证数据在并发访问和异常情况下的安全性。本文将详细介绍 Qt 中数据库事务的处理方法和数据安全策略。 一、…

Redis的事务和Lua之间的区别

Redis的事务和Lua之间的区别 Redis 提供了事务和 Lua 脚本两种实现原子性操作的方式。当需要以原子方式执行多个命令时,我们可以选择其中一种方案。 原子性保证 两者都确保操作的不可分割性 需要注意:不管是事务还是 Lua 脚本都不支持回滚机制 区别: 事务:某个命令失败不会…

腾讯云SDK

SDK的用途&#xff0c;现在显然是想更系统地了解它的产品定位和核心能力。 用户可能是开发者或者技术决策者&#xff0c;正在评估腾讯云的开发工具链。从ta连续追问云服务相关技术细节的习惯看&#xff0c;应该具备相当的技术背景&#xff0c;但需要避免过度使用术语。 需要突出…

大数据集分页优化:LIMIT OFFSET的替代方案

针对大数据集分页场景中 LIMIT OFFSET 的性能瓶颈&#xff0c;以下是已验证的高效替代方案及实施要点&#xff1a;⚠️ 一、LIMIT OFFSET 的核心问题当偏移量&#xff08;OFFSET&#xff09;增大时&#xff0c;数据库需‌物理扫描并丢弃前 N 条记录‌&#xff0c;导致资源浪费和…

Linux网络框架分析

在 Linux 内核架构中,/net 和 /drivers/net 是网络子系统的两个核心组成部分,它们之间的关系体现了 Linux 经典的 “抽象层分离” 设计哲学。以下是深入分析: 一、核心关系图解 #mermaid-svg-esFw9i3LN65SYumi {font-family:"trebuchet ms",verdana,arial,sans-se…

ISIS高级特性GR

一、概述IS-IS GR是一种支持GR能力的高可靠性技术&#xff0c;可以实现数据的不间断转发。与我们之前介绍的OSPF的GR功能几乎一致,但实现方法并不相同。1、GR支持GR的ISIS的设备,IIH报文中一定会携带TLV211(GR),TLV211包含的字段(1)RR:restart request 请求重启,默认是3秒发送1…

电厂液压执行器自动化升级:Modbus TCP与DeviceNet的协议贯通实践

一、项目背景在我们电厂的汽轮机控制区&#xff0c;液压执行器是实打实的“关键选手”——从调节蒸汽阀门开度到控制闸板起落&#xff0c;全靠它在高压环境下精准动作。但这套系统一直有个“沟通障碍”&#xff1a;负责统筹控制的施耐德PLC走Modbus TCP协议&#xff0c;而液压执…

ucharts 搭配uniapp 自定义x轴文字 实现截取显示

formatter格式化问题因为组件不能传递 function&#xff0c;所有的 formatter 均需要变成别名 format 来定义&#xff0c;并在 config-ucharts.js 或 config-echarts.js 配置对应的 formatter 方法&#xff0c;组件会根据 format 的值自动替换配置文件中的 formatter 方法。uCh…

Logstash 多表增量同步 MySQL 到 Elasticsearch:支持逻辑删除与热加载,Docker 快速部署实战

​ 1. 项目结构 install-elk/ ├── start-elastic.sh ├── es-data/ # Elasticsearch 持久化目录&#xff08;自动创建&#xff09; ├── logstash/├── logstash.yml├── pipeline/│ ├── user.conf│ ├── articles.conf│ …

服务器托管:网站经常被攻击该怎么办?

“木马”对于孩子来说是个玩具&#xff0c;但是对于网络行业来说是一个病毒威胁&#xff0c;站长在进行建站的过程中&#xff0c;通常都会面临一个问题网站被挂马&#xff0c;有些网站服务器托管在进行多次处理木马之后得不到根治&#xff0c;后续会受到频繁的攻击该怎么办&…

判断子序列-leetcode

给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子序列&#x…

如何提高微信小程序的应用速度

1、如何提高微信小程序的应用速度&#xff1f;加载时1、上传代码时&#xff0c;对代码进行压缩。2、清理点代码中无效的代码和资源文件。3、减少本地代码中图片等资源的数量和大小。如将多个图片合成一张图片。还有将图片资源放在静态资源库存储。渲染1、在加载页面时&#xff…