【SpringCloud】(一文通)注册中心的其他实现-Nacos

一. Nacos简介

2018年6月, Eureka 2.0宣布闭源(但是1.X版本仍然为活跃项目), 同年7月份, 阿里 Nacos 宣布开源. 并快速成为国内最受关注开源产品. 作为Eureka的替代, Nacos已经成为了国内开发者的首选, 目前NacosStar 已经突破28K(Eureka 12K)

Nacos (Dynamic Naming and Configuration Service)

在最初开源时, Nacos 选择进行内部三个产品合并统⼀开源(Configserver 非持久注册中心,VIPServer 持久化注册中心,Diamond 配置中心). 定位为:⼀个更易于构建云原生应用的动态服务发现, 配置管理和服务管理平台. 所以Nacos 是⼀个注册中心组件, 但它又不仅仅是注册中心组件.

截止目前, Nacos 几乎支持了所有的主流语言, 比如 Java, Go, C++, Nodejs, Python, Scala等

二. Nacos安装

2.1 下载安装包

目前官方推荐的稳定版本为2.2.3

下载地址 https://github.com/alibaba/nacos/releases/tag/2.2.3 点击跳转

在这里插入图片描述

其他版本下载链接: 下载链接: https://github.com/alibaba/nacos/releases 点击跳转

2.2 Windows

2.2.1 解压

把压缩包解压到任意非中文的目录下

在这里插入图片描述

目录介绍:

bin: Nacos启停脚本

  • startup.cmd :windows平台的启动脚本
  • startup.sh :Linux平台的启动脚本
  • shutdown.cmd : windows平台的停止脚本
  • shutdown.sh : Linux平台的停止脚本

conf: Nacos配置文件

target: 存放 Nacos 应用的 jar 包

2.2.2 修改单机模式

Nacos 默认启动方式为集群, 启动前需要修改配置为单机模式

  1. 使用记事本打开 startup.cmd
  2. Line 26左右, 修改启动模式

set MODE=“cluster”
改为
set MODE=“standalone”

如下图所示:

在这里插入图片描述

2.2.3 启动 Nacos

启动非常简单, 进⼊bin目录下, 双击 startup.cmd 即可

在这里插入图片描述

访问 Nacos主页, 出现以下界面, 表示 Nacos 启动成功

http://127.0.0.1:8848/nacos

在这里插入图片描述

2.2.4 常见问题

Nacos 启动后, 目录下会多⼀个logs的文件夹

报错日志在: logs/nacos.log

集群模式启动

报错日志

Caused by: java.net.UnknownHostException: jmenv.tbsite.net
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:572)
at java.base/java.net.Socket.connect(Socket.java:633)
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:534)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:639)
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:282)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:387)
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:409)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLC
onnection.java:1309)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConn
ection.java:1242)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConne
ction.java:1128)
at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection
.java:1057)
at com.alibaba.nacos.common.http.client.request.JdkHttpClientRequest.execute(JdkHt
tpClientRequest.java:114)
at com.alibaba.nacos.common.http.client.NacosRestTemplate.execute(NacosRestTemplat
e.java:482)
at com.alibaba.nacos.common.http.client.NacosRestTemplate.get(NacosRestTemplate.ja
va:72)
at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.syncFromAddress
Url(AddressServerMemberLookup.java:175)
at com.alibaba.nacos.core.cluster.lookup.AddressServerMemberLookup.run(AddressServ
erMemberLookup.java:143)
	... 126 common frames omitted
2024-08-15 12:14:54,260 WARN [HttpClientBeanHolder] Start destroying common HttpClient

2024-08-15 12:14:54,260 WARN [ThreadPoolManager] Start destroying ThreadPool

Nacos默认是集群(cluster)启动,将其设置为单机(standalone), 设置方式参考 上面

端口号冲突

Nacos 默认端口号是8848, 如果该端口号被其他应用占用, 启动会报错

此处不展示错误信息

解决方式有以下两种, 任选其⼀:

  1. 关闭该进程

a. 打开cmd

Win + R, 弹出命令提示符, 输入 cmd

在这里插入图片描述

b. 查找进程

输入命令

netstat -ano|findstr "8848"

在这里插入图片描述

c. 杀掉进程

taskkill /pid 4968 -f

在这里插入图片描述

  1. 修改 Nacos 端口号

修改文件: ${Nacos目录}/conf/application.properties
23行左右

在这里插入图片描述

修改8848为期望的端口号即可

2.3 Linux

2.3.1 准备安装包

上传提前下载好的安装包到服务器上某个目录, 比如 /usr/local/src

解压安装包

unzip nacos-server-2.2.3.zip

如果第⼀次使用, 未安装 unzip 命令, 需要安装⼀下

apt-get install unzip

解压后目录如下:

root@hcss-ecs-0bb1:/usr/local/src/nacos# pwd
/usr/local/src/nacos
root@hcss-ecs-0bb1:/usr/local/src/nacos# ll
total 44
drwxr-xr-x 5 root root 4096 May 25 2023 ./
drwxr-xr-x 3 root root 4096 Dec 25 15:07 ../
drwxr-xr-x 2 root root 4096 May 25 2023 bin/
drwxr-xr-x 2 root root 4096 May 25 2023 conf/
-rw-r--r-- 1 root root 16583 Mar 6 2023 LICENSE
-rw-r--r-- 1 root root 1305 May 14 2020 NOTICE
drwxr-xr-x 2 root root 4096 May 25 2023 target/

和windows⼀样

2.3.2 单机模式启动

进入 nacos/bin 目录, 输入命令

bash startup.sh -m standalone

上述命令为 Ubuntu 系统的命令
nacos 安装前需要先安装 JDK
CenterOS 使用: sh startup.sh -m standalone

启动成功后, 访问 Nacos 链接: http://IP:port/nacos

在这里插入图片描述

10020为修改后的端口号, 需要在服务器上开放对应的端口号

三. Nacos快速上手

Nacos 是 Spring Cloud Alibaba 的组件, Spring Cloud Alibaba 遵循Spring Cloud 中定义的服务注册, 服务发现规范. 因此使用 Nacos 和使用 Eureka 对于微服务来说,并没有太大区别

主要差异在于:

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

操作参考: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery 点击跳转

3.1 服务注册/服务发现

Nacos 的服务注册和服务发现代码⼀样

引入 Spring Cloud Alibaba 依赖在父工程的 pom 文件中的 中引入 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>

注意: Spring Boot 和Spring Cloud的版本是有⼀定对应关系的. Spring Cloud Alibaba也遵循Spring Cloud 的标准, 在引入依赖时, ⼀定要确认各个版本的对应关系.Spring Cloud Alibaba 和Spring Cloud版本对应关系, 参考官方文档:https://sca.aliyun.com/zh-cn/docs/2022.0.0.0/overview/version-explain/
点击跳转 版本在⼀定范围内可以自由选择.

引入 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.2 配置 Nacos 地址

在这里插入图片描述

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

也可以改成本地 Nacos 的IP: 127.0.0.1:8848

3.3 远程调用

  1. 修改IP为项目名
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;
}
  1. 为 restTemplate 添加负载均衡注解 @LoadBalanced
@Configuration
public class BeanConfig {
	@Bean
	@LoadBalanced
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

3.4 启动服务

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

在这里插入图片描述

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

在这里插入图片描述

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

启动三个 product-service 服务

在这里插入图片描述

观察 Nacos 控制台

在这里插入图片描述

多次访问接口, 观察日志

http://127.0.0.1:8080/order/1

3.6 常见问题

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-service
at 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:5) ~[na:na]

// ...

检查是否添加 LoadBalance 依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

服务注册失败

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

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 支持多种负载均衡策略, 包括权重, 同机房, 同地域, 同环境等.

4.1 服务下线

当某⼀个节点上接口的性能较差时, 我们可以第⼀时间对该节点进行下线.

操作步骤: 服务详情 -> 下线

在这里插入图片描述

点击下线后, 再次请求接口, 会发现该服务没有请求进来了

再次单击上线, 该节点会继续收到请求

4.2 权重配置

除了下线之外, 我们也可以配置这个节点的流量权重

4.2.1 配置权重

操作步骤: 找到对应节点 ->编辑 -> 在弹出的窗口修改权重值

在这里插入图片描述
每个节点默认权重为1

4.2.2 开启 Nacos 负载均衡策略

由于 Spring Cloud LoadBalance 组件自身有负载均衡配置方式, 所以不支持Nacos 的权重属性配置.我们需要开启 Nacos 的负载均衡策略, 让权重配置生效

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

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

spring:
	cloud:
		loadbalancer:
			nacos:
				enabled: true

4.2.3 测试权重配置

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

整体流量生效, 局部流量不是严格按照设置的比例进行分配的

4.2.4 常见问题

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

在这里插入图片描述

报错信息: caused: errCode: 500, errMsg: do metadata operation failed ;caused:com.alibaba.nacos.consistency.exception.ConsistencyException:The Raft Group[naming_instance_metadata] did not find the Leader node;caused: The RaftGroup[naming_instance_metadata] did not find the Leader node;

原因: Nacos 采用 raft 算法来计算 Leader, 并且会记录前⼀次启动的集群地址, 当服务器 IP 改变时会导致 raft 记录的集群地址失效, 导致选 Leader 出现问题. (网络环境发生变化时, IP地址也会发生变化)

解决办法: 删除 Nacos 根目录下 data 文件夹下的 protocol 文件夹即可

4.3 同集群优先访问

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

微服务架构中, ⼀个服务通常有多个实例共同提供服务, 这些实例可以部署在不同的机器上, 这些机器可以分布在不同的机房, 比如 product-service:

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

在这里插入图片描述

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

比如 order-service 在上海机房, product-service 在北京和上海机房都有实例, 那我们希望可以优先访问上海机房, 如果上海机房没有实例, 或者实例不可用, 再访问北京机房的实例. 通常情况下, 因为同⼀个机房的机器属于⼀个局域网, 局域网访问速度更快⼀点.

在这里插入图片描述

4.3.1 给实例配置集群名称

  1. 为 product-service 配置集群名称
spring:
	cloud:
		nacos:
			discovery:
				server-addr: 110.41.51.65:10020
				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=9091 -Dspring.cloud.nacos.discovery.cluster-name=BJ

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

在这里插入图片描述

  1. 为 order-service 配置集群名称: SH
spring:
	cloud:
		nacos:
			discovery:
				server-addr: 110.41.51.65:10020
				cluster-name: SH #集群名称: 上海集群

4.3.2 开启 Nacos 负载均衡策略

同权重配置

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

spring:
	cloud:
		loadbalancer:
			nacos:
				enabled: true

4.3.3 测试

启动服务

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

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

五. Nacos 健康检查

5.1 两种健康检查机制

Nacos 作为注册中心, 需要感知服务的健康状态, 才能为服务调用方提供良好的服务.

Nacos 中提供了两种健康检查机制:

客户端主动上报机制:

  • 客户端通过心跳上报方式告知服务端(nacos注册中心)健康状态, 默认心跳间隔5秒;
  • nacos 会在超过15秒未收到心跳后将实例设置为不健康状态, 超过30秒将实例删除

服务器端反向探测机制:

  • nacos 主动探知客户端健康状态, 默认间隔为20秒.
  • 健康检查失败后实例会被标记为不健康, 不会被立即删除

在这里插入图片描述

Nacos 中的健康检查机制不能主动设置,健康检查机制是和 Nacos 的服务实例类型强相关的.

5.2 Nacos 服务实例类型

Nacos 的服务实例(注册的节点)分为临时实例和非临时实例.

  • 临时实例: 如果实例宕机超过⼀定时间, 会从服务列表剔除, 默认类型.
  • 非临时实例: 如果实例宕机, 不会从服务列表剔除, 也可以叫永久实例

Nacos 对临时实例, 采取的是 客户端主动上报机制, 对非临时实例, 采取服务器端反向探测机制

在这里插入图片描述

配置⼀个服务实例为永久实例

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

重启服务, 观察 Nacos 控制台

在这里插入图片描述

停止服务, 再观察控制台

在这里插入图片描述

节点依然不会消失.

5.3 常见问题

5.3.1 Nacos 服务实例类型不允许改变

设置服务实例类型, 重新启动 Nacos 可能会报错

原因: Nacos 会记录每个服务实例的IP和端口号, 当发现IP和端口都没有发生变化时, Nacos 不允许⼀个服务实例类型发生变化, 比如从临时实例,变为非临时实例, 或者从非临时实例, 变成临时实例

解决办法:

  1. 停掉 nacos
  2. 删除 nacos 目录下 /data/protocol/raft 信息, 里面会保存应用实例的元数据信息.

5.3.2 服务正常, Nacos 健康检查失败

现象:

服务正常, 但是 Nacos 显示健康状态为 false

在这里插入图片描述

原因和解决办法:

参考:如何解决Nacos持久化实例HTTP/TCP的健康检查不通过问题_微服务引擎(MSE)-阿⾥云帮助中⼼

六. Nacos 环境隔离

企业开发中, ⼀个服务会分为开发环境, 测试环境和生产环境.

  1. 开发环境:开发人员用于开发的服务器, 是最基础的环境. ⼀般日志级别设置较低, 可能会开启⼀些调试信息.
  2. 测试环境:测试人员用来进行测试的服务器, 是开发环境到生产环境的过渡环境.
  3. 生产环境:正式提供对外服务的环境, 通常关掉调试信息.

通常情况下, 这几个环境是不能互相通信的. Nacos 提供了 namespace (命名空间)来实现环境的隔离. 不同的 namaspace 的服务不可见

6.1 创建 Namespace

默认情况下,所有服务都在同⼀个 namespace,名为 public

在这里插入图片描述
点击左侧命名空间, 可以对 namespace 进行操作

在这里插入图片描述

新增命名空间

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

6.2 配置 namespace

namespace 创建完成后, 对服务进行配置

在这里插入图片描述

修改 order-service 的命名空间

spring:
	cloud:
		nacos:
			discovery:
				namespace: 51152a13-7911-49e3-bbdc-16fd5670a257

6.3 测试远程调用

  1. 启动服务, 观察 Nacos 控制台

public 命名空间下只有 product-service 服务

在这里插入图片描述

order-service 在 dev 命名空间下

在这里插入图片描述

  1. 访问接口, 测试远程调用

发现服务报错

  1. 修改 product-service 的其中⼀个实例, 命名空间改为 dev
spring:
	cloud:
		nacos:
			discovery:
				namespace: 51152a13-7911-49e3-bbdc-16fd5670a257
  1. 启动服务

观察Nacos控制台

在这里插入图片描述

再次访问接口 http://127.0.0.1:8080/order/3, 发现远程调用成功

在这里插入图片描述

七. Nacos 配置中心

除了注册中心和负载均衡之外, Nacos 还是⼀个配置中心, 具备配置管理的功能.Namespace 的常用场景之⼀是不同环境的配置区分隔离. 例如开发测试环境和生产环境的配置隔离

7.1 为什么需要配置中心

当前项目的配置都在代码中, 会存在以下问题:

  1. 配置文件修改时, 服务需要重新部署. 微服务架构中, ⼀个服务可能有成百个实例, 挨个部署比较麻烦, 且容易出错.
  2. 多⼈开发时, 配置⽂件可能需要经常修改, 使用同⼀个配置文件容易冲突.

配置中心就是对这些配置项进行统⼀管理. 通过配置中心, 可以集中查看, 修改和删除配置, ⽆需再逐个修改配置文件. 提高效率的同时, 也降低了出错的风险

在这里插入图片描述

  1. 服务启动时, 从配置中心读取配置项的内容, 进行初始化.

  2. 配置项修改时, 通知微服务, 实现配置的更新加载

7.2 快速上手

通过以下操作, 我们先来感受下 Nacos 配置中心的使用

参考⽂档: Nacos Spring Cloud 快速开始 Nacos config

7.2.1 添加配置

在 Nacos 控制台添加配置项

在这里插入图片描述

注意: 配置管理的命名空间和服务列表的命名空间是隔离的, 两个是分别设置的. 默认是 public 也就是服务管理命名空间配置 ≠ 配置管理的命名空间

新建配置项

在这里插入图片描述

配置内容:

nacos.test.num=5

说明:

  1. Data ID 设置为项目名称
  2. 配置内容的数据格式, ⽬前只⽀持 properties 和 yaml 类型
  3. 设置配置内容

7.2.2 获取配置

  1. 引入 Nacos Config 依赖
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud 2020.*之后版本需要引⼊bootstrap-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  1. 配置 bootstrap.properties

微服务启动前, 需要先获取 nacos 中配置, 并与 application.yml 配置合并. 在微服务运行之前, Nacos 要求必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址.

spring.application.name=product-service
spring.cloud.nacos.config.server-addr=110.41.51.65:10020

或者使用 bootstrap.yml

spring:
	application:
		name: product-service
	cloud:
		nacos:
			config:
				server-addr: 110.41.51.65:10020

spring.application.name 需要和 nacos 配置管理的Data ID⼀致
spring.cloud.nacos.config.server-addr 为 Nacos Server 的地址

配置中心和注册中心的配置是隔离的
Nacos 配置中心: spring.cloud.nacos.config.server-addr
Nacos 注册中心: spring.cloud.nacos.discovery.server-addr

  1. 编写程序
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/config")
@RefreshScope
@RestController
public class NacosController {
	@Value("${nacos.test.num:0}")
	private Integer nacosNum;
	
	@RequestMapping("/get")
	public Integer get() {
		return nacosNum;
	}
}
  • @Value 读取配置
  • @RefreshScope 配置进行热更新
  1. 测试

启动程序, 访问接口: http://127.0.0.1:9090/config/get

在这里插入图片描述

在 Nacos 控制台修改 nacos.test.num

在这里插入图片描述

再次访问接口:

在这里插入图片描述

7.2.3 常见问题

  1. 读取不到配置项

可能原因:

  • 配置错误: 检查配置 Data ID, 配置格式, 配置空间等
  • 未引入依赖
  1. No spring.config.import property has been defined

原因: bootstrap.properties 是系统级的资源配置文件, 用于程序执行更加早期配置信息读取. 但是 SpringCloud 2020.* 之后的版本把 bootstrap 禁用了, 导致在读取文件的时候读取不到而报错, 所以需要重新导入 bootstrap 包进来就可以了

  1. Nacos Server地址配置错误

7.3 配置中心详解

7.3.1 设置命名空间

Nacos配置管理的命名空间和服务列表的命名空间是分别设置的. 默认是public
Nacos命名空间配置依然在bootstrap.properties中进行配置

spring.cloud.nacos.config.namespace=51152a13-7911-49e3-bbdc-16fd5670a257

对应bootstrap.yml配置

spring:
	cloud:
		nacos:
			config:
				namespace: 51152a13-7911-49e3-bbdc-16fd5670a257

value 对应 命名空间的 ID, 如下图所示:

在这里插入图片描述

如果设置命名空间后, 项目启动时, 会从该命名空间下找对应的配置项

在这里插入图片描述

重新访问接口, 观察结果:

http://127.0.0.1:9090/config/get

在这里插入图片描述

7.3.2 Data Id

Data Id 格式介绍

在 Nacos Spring Cloud 中, dataId 的完整格式如下:

 ${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值, 也可以通过配置项spring.cloud.nacos.config.prefix 来配置.
  • spring.profiles.active 即为当前环境对应的 profile. 当 spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${fileextension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties和 yaml 类型. 默认为 properties.

微服务启动时, 会从Nacos读取多个配置 文件:

  1. ${prefix}-${spring.profiles.active}.${file-extension} 如: product-service-dev.properties
  2. ${prefix}.${file-extension} , 如: product-service.properties
  3. ${prefix} 如product-service

${spring.application.name}, ${spring.profiles.active} 等通过配置文件来指定时, 必须放在bootstrap.properties 文件中

观察日志

在 bootstrap.yml 中添加 spring.profiles.active 值

spring:
	profiles:
		active: dev

三个文件的优先级为: product-service-dev.properties > product-service.properties > product-service

测试

bootstrap.yml 配置如下:

spring:
	application:
		name: product-service
	profiles:
		active: dev
	cloud:
		nacos:
			config:
				server-addr: 110.41.51.65:10020
				namespace: 51152a13-7911-49e3-bbdc-16fd5670a257

配置项如下:

在这里插入图片描述

访问接口: http://127.0.0.1:9090/config/get

服务获取到了 product-service-dev.properties 的值

在这里插入图片描述

删除 product-service-dev.properties 配置, 再次访问接口

在这里插入图片描述

注意:

  1. bootstrap.yml 设置的配置格式必须和 nacos 控制台配置的数据格式保持⼀致.
  2. 不设置配置格式(spring.cloud.nacos.config.file-extension)时, 默认为properties

八. 服务部署

  1. 修改数据库, Nacos 等相关配置
  2. 对两个服务进行打包
  3. 上传 jar 到 Linux 服务器
  4. 启动Nacos,启动前最好把 data 数据删除掉.
  5. 启动服务
#后台启动order-service, 并设置输出⽇志到logs/order.log
nohup java -jar order-service.jar >logs/order.log &

#后台启动product-service, 并设置输出⽇志到logs/order.log
nohup java -jar product-service.jar >logs/product-9090.log &

#启动实例, 指定端⼝号为9091
nohup java -jar product-service.jar --server.port=9091 >logs/product-9091.log &

观察 Nacos 控制台

在这里插入图片描述

  1. 测试

访问接口: http://110.41.51.65:8080/order/1

观察远程调用的结果:

在这里插入图片描述

九. Nacos与Eureka的区别

共同点:

  • 都支持服务注册和服务拉取

区别:

  1. 功能
    Nacos 除了服务发现和注册之外, 还提供了配置中心, 流量管理和 DNS 服务等功能.
  2. CAP理论
    Eureka遵循AP原则, Nacos 可以切换 AP 和 CP 模式,默认 AP.
    Nacos 根据配置识别 CP 或者 AP 模式. 如果注册 Nacos 的 Client 的节点是临时节点, 那么 Nacos 对这个 Client 节点的效果就是 AP, 反之是 CP. AP 和 CP 可以同时混合存在.
  3. 服务发现
    Eureka:基于拉模式. Eureka Client会定期从Server拉取服务信息, 有缓存, 默认每30秒拉取⼀次.
    Nacos:基于推送模式. 服务列表有变化时实时推送给订阅者, 服务端和客⼾端保持心跳连接.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Redamancy丶早晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值