文章目录
- 1、前置相关知识及说明
- 2、官网
- 3、环境
- 4、Nacos 和 Zookeeper、Eureka 的主要区别
- 5、安装部署 & 启动
- 5.1、Windows
- 下载安装包
- 部署
- 单机部署
- 集群部署
- 测试
- 6、使用
- 服务端
- 客户端 - SpringBoot 使用 Nacos Client
- 7、运维
- 健康检查
- 获取配置,验证服务端是否正常
- 异常处理
- do metadata operation failed
- 8、Nacos架构&原理
- 总结
1、前置相关知识及说明
相关参考:
服务注册与发现(请忽略最后的广告部分。感觉其他东西解释的非常棒棒哒!)
什么是 Nacos
SpringBoot
CAP原则
说明:
- 需要注意 Nacos 分为:服务端、客户端
- 安装部署部分,属于服务端操作
- 使用部分,属于客户端操作
2、官网
GitHub 地址
官网地址
官方文档
官方 Nacos 快速开始(包括:安装、启动、停止)
3、环境
操作系统 : Windows 11 家庭中文版
JDK : 1.8.0_321
Nacos : 2.2.0 (Dec 14, 2022)
4、Nacos 和 Zookeeper、Eureka 的主要区别
如下表所示:(从其他地方 copy 的,出处忘记了,不过网上搜一下 大把 ~)
Nacos | Zookeeper | Eureka | |
---|---|---|---|
一致性协议 | CP + AP | CP | AP |
访问协议 | Http/DNS | TCP | Http |
健康检查 | TCP/Http/MySQL/上报心跳/用户扩展 | Keep Alive | 上报心跳 |
访问策略 | 服务端访问策略 + 客户端访问粗略 | 客户端访问策略 | 客户端访问策略 |
多地域数据中心 | 支持 | 不支持 | 不支持 |
读写TPS | 万级 | 万级 | 千级 |
服务容量 | 百万级 | 十万级 | 万级 |
5、安装部署 & 启动
5.1、Windows
说明:示例为 Windows ,Linux 操作类似。同一个部署包在 Linux 也可使用。
下载安装包
下载地址
Windows 可以使用 nacos-server-2.2.0.zip 这个文件
解压,进入对应的文件夹
部署
单机部署
注意:
- 路径不能有中文
- 默认占用端口三个:8848、9848(8848 + 1000)、9849(8848 + 1001),注意端口冲突问题
Windows 命令 - 查看端口占用情况
netstat -aon|findstr "8848"
Windows 启动命令(standalone 代表着单机模式运行,非集群模式)
D:\nacos\bin\startup.cmd -m standalone
正常启动后可以看到
…… …… ……
2023-01-20 22:27:50,653 INFO Nacos started successfully in stand alone mode. use embedded storage
集群部署
参考官方文档
PS:没那么多机器,模拟不了
大概步骤:
- 更改配置文件 cluster.conf 配置集群信息
- 配置数据源
- 启动服务 sh startup.sh -p embedded 或 sh startup.sh
- 验证
测试
服务启动后,可以通过浏览器打开控制台,验证服务是否正常启动
http://localhost:8848/nacos/index.html
默认账号:nacos
默认密码:nacos
6、使用
说明:可通过官方文档中提供的办法进行相关操作,对 Nacos 服务进行验证。
服务端
通过浏览器登录页面创建配置
配置信息
客户端 - SpringBoot 使用 Nacos Client
通过 https://start.spring.io/ 初始化一个 SpringBoot 项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<nacos.version>0.2.12</nacos.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yaml
spring:
application:
name: nacons-demo
profiles:
active: default
nacos:
discovery:
enabled: true
autoRegister: true
serverAddr: localhost:8848
username: nacos
password: nacos
config:
serverAddr: localhost:8848
username: nacos
password: nacos
dataId: config-default.yaml
remote-first: true
type: yaml
auto-refresh: true
bootstrap:
enable: true
NacosConfigTestController
package com.example.demo.api;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class NacosConfigTestController {
@Value("${demo.key}")
private String key;
@GetMapping("/test")
public String queryConfig() {
return "key is:" + key + ".";
}
}
启动服务
如服务可以正常启动则证明成功获取配置文件,因配置文件 application.yaml 中没有 demo.key
如服务报错
Could not resolve placeholder ‘demo.key’ in value “${demo.key}”
则表示未获取到配置文件
也可通过访问端口,校验配置文件获取情况
http://localhost:8080/api/test/
正常情况下,返回结果
key is:value.
7、运维
健康检查
通过浏览器访问地址 http://localhost:8848/nacos/actuator/health
返回结果
{
"status": "UP"
}
获取配置,验证服务端是否正常
# 获取 token
curl -X POST "http://localhost:8848/nacos/v1/auth/login?username=nacos&password=nacos"
# 返回结果
{"accessToken":"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3NDIyMjEyN30.C7Hsp9-IaSPqBuFjO5ewkwFOouHeoVcVOGGRkn1IP3c","tokenTtl":18000,"globalAdmin":true,"username":"nacos"}
# 获取配置文件
curl -H "Authorization:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTY3NDIyMjEyN30.C7Hsp9-IaSPqBuFjO5ewkwFOouHeoVcVOGGRkn1IP3c" "http://localhost:8848/nacos/v1/cs/configs?dataId=config-default.yaml&group=DEFAULT_GROUP"
# 返回结果
demo:
key: value
异常处理
do metadata operation failed
客户端注册报错
…… …… ……
…… do metadata operation failed ……
…… …… ……
原因:Nacos 服务端 更改过 IP 或端口号,缓存文件与服务信息不匹配导致的异常
解决方法:清除 Nacos 根目录下 data/protocol ,重启服务,恢复正常
说明:时间久远,当时未记录服务端、客户端版本信息。遇到类似报错的时候,可以尝试 ~
8、Nacos架构&原理
参考书籍
总结
Nacos 服务端部署、客户端的入门,还是比较简单的。不过难免在实际项目的使用过程中,会遇到些许奇奇怪怪的问题。但是,由于使用量较大,因此对于查找解决方法相对来说并不算特别困难 ~