Nacos 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 介绍
Nacos(Naming Configuration Service) 是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云原生应用程序
服务发现是微服务架构中的关键组件之一,Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台,Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
什么是 Nacos?
Nacos = 注册中心+配置中心组合
Nacos 支持几乎所有主流类型 "服务"发现、配置和管理,常见的服务如下:
- Kubernetes Service
- gRPC & Dubbo RPC Service
- Spring Cloud Restful Service
为何使用 Nacos ?
为何使用注册中心呢?我们以入住酒店的前台为例子,稍微加以解释:先设想一个没有服务前台的酒店,客人入住需要自己寻找合适居住的房间,客人不知道每个房间的情况,无法确定那个房间是打扫干净可以入住,客人只能逐个房间寻找,如果遇到已经居住房客的房间一定很尴尬,显然这是不正常的情况。正常的情况是酒店会安排服务台,酒店打扫干净可以入住的房间会登记注册到服务台,这样客人来住店,只需要在前台就可以查找到可以入住的房间,这样就无需等待快速的入住。显然,服务台提供注册和发现机制可以让房客快速找到合适的房间,快速解决入住问题。
采用微服务以后,软件微服务组件各自独立,但最终还要组合为一个整体作为一个软件系统服务于最终客户,这时软件组件之间也需要彼此通讯,彼此调用方法。微服务架构内部发起通讯调用方法的一方成为“服务消费者”,提供远程方法调用的服务器称为“服务提供者”,往往为了提高系统性能,会提供多个服务器作为服务提供者,此时服务消费者找到服务提供者的过程,就类似于用户在找房间的过程。为了帮助服务消费者快速的发现服务提供者,在微服务框架中都会引入注册中心。注册中心类似于酒店的前台,提供在软件服务的注册和发现功能,服务提供者会先在注册中心进行注册,声明可以对外提供服务,而服务消费者只需要在注册中心就可以快速发现找到可以使用的服务,快速使用服务;注册中心实现了服务提供和服务消费的快速撮合功能
Nacos 集群搭建
Nacos 官方推荐安装稳定版本 2.0.3,链接:https://nacos.io/zh-cn/docs/quick-start.html
该博文搭建的是三台 Nacos 节点组建成集群,搭配一台 MySQL 作为外置数据源(一般为了保证高可用,设置为一主一从), 一台 Nginx 负责 Nacos 服务节点之间的转发和负载均衡
若在 Nacos 未配置外置数据源时,默认会使用内置数据源 derby 进行存储,每台 Nacos 节点都会有一个 derby,为了方便数据统一管理,使用 MySQL 作为外置数据源进行存储
Nacos 前置必备的环境:JDK,集群需要使用到 Nginx、MySQL,下面来介绍这几个环境在 Linux 中的安装步骤以及集群部署,安装包以及使用 Nacos 集群注册与发现的源码会在文末给出~
准备三台虚拟机节点,静态 IP:我这边的是 172.16.249.10~172.16.249.12
JDK
上传安装包到 /opt 目录下
- 区分不同内核版本:tar -zxvf jdk-8u171-linux-x64.tar.gz、tar -zxvf jdk-8u341-linux-aarch64.tar.gz
- mv jdk1.8.0_171/ jdk8
- mv jdk8/ /usr/local/
- vim /etc/profile
#按i进入编辑,在profile文件尾部添加如下内容 #JDK配置 export JAVA_HOME=/usr/local/jdk8 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin export PATH=$PATH:${JAVA_PATH} #Esc --> :wq保存并退出 #通过命令让profile文件立即生效
- source /etc/profile
MySQL
MySQL 5.7 X86_X64 安装步骤:https://www.cnblogs.com/huchong/p/9152117.html
在 172.16.249.10
节点安装,Linux Arrach64 内核
安装 MySQL 过程如下:
- 安装 MySQL arrach64 yum 包:
wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
- tar -xvf mysql-5.7.27-aarch64.tar.gz
- 修改目录名称:mv /usr/local/mysql-5.7.27-aarch64 /usr/local/mysql
- 创建日志目录:mkdir -p /usr/local/mysql/logs
- 新建组:groupadd mysql、新建用户:useradd -r -g mysql mysql
- 修改目录所有者:chown -R mysql:mysql /usr/local/mysql
- 创建软链接:ln -sf /usr/local/mysql/my.cnf /etc/my.cnf
- 复制包:cp -rf /usr/local/mysql/extra/lib* /usr/lib64/
- 将老版本库包更新名:mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old
- 引用新版本软链接:ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
- 设置开机启动
cp -rf /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld cd /etc/init.d/ systemctl enable mysqld
- 添加环境变量:vi /etc/profile
export MYSQL_HOME=/usr/local/mysql export PATH=$PATH:$MYSQL_HOME/bin source /etc/profile
- 初始化启动 MySQL,无密码方式登陆:
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
初始化时可能会提示你以下错误:
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
通过命令:yum install -y libaio 安装好以后再初始化
- 启动 MySQL:systemctl start mysqld
- 查看 MySQL 运行状态:systemctl status mysqld
- 登陆 MySQL:mysql -uroot -p、回车即可登录成功
设置 MySQL 密码:SET PASSWORD = PASSWORD(‘123456’);
ALTER USER ‘root’@‘localhost’ PASSWORD EXPIRE NEVER;
usr mysql;
设置 root 账号随地都可以登录:update user set host = ‘%’ where user = ‘root’;
刷新权限:FLUSH PRIVILEGES;、退出:exit
- 远程连接 MySQL 关闭服务器防火墙
暂时关闭:systemctl stop firewalld,重启后仍然生效
永久关闭:systemctl disable firewalld
Nacos 集群
- tar -zxvf nacos-server-2.0.3.tar.gz
- mv /opt/nacos /usr/local/nacos
- 在
172.16.249.10
节点安装的数据库中执行
create database nacos_config;
use nacos_config;
执行 SQL 脚本,表结构语句:/usr/local/nacos/conf/nacos-mysql.sql
- 修改 application.properties 文件,在修改之前做一个备份:
cp application.properties application.properties.init
,更新如下内容:
### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=123456
- 若是在单台节点上部署集群,需要将端口分散开来,因为 Nacos 内置还占用了两个端口用于 gRPC 使用的,偏移量为 1000、1001,除了自身的 8848 端口,还会占用 9848、9849 这两个端口
错误示例:8848、8849、8850
正确示例:8848、8868、8888
Nacos 2.0 版本相比 1.X 新增了 gRPC通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成
端口 | 与主端口的偏移量 | 描述 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
随即在使用 VIP/Nginx 请求时,需要配置成 TCP 转发,不能配置 http2 转发,否则连接会被 Nginx 断开
- 正式开始配置集群,首先我们要更改 cluter.conf 这个配置文件,当然我们也需要备份,但是这里它的原始名称为:cluster.conf.example,我们需要把它保留同时复制出一个 cluster.conf 来进行更改
cp cluster.conf.example cluster.conf
具体配置内容,配置集群时要写入节点间真实的 IP 地址,通过 ip addr 查看网卡 ens** 开头的 IP
具体修改内容如下:
#it is ip 172.16.249.10:8848 172.16.249.11:8848 172.16.249.10:8848
每个节点启动:sh /usr/local/nacos/bin/startup.sh,默认就是以集群方式启动的
单机模式启动命令:sh startup.sh -m standalone
,Windows 启动命令: startup.cmd -m standalone
Nginx
- 安装前置环境
yum -y install gcc
yum -y install openssl openssl-devel make zlib zlib-devel gcc gcc-c++ libtool pcre pcre-devel
- 解压包:tar -zxvf nginx-1.16.1.tar.gz
- mv nginx-1.16.1 nginx、mv nginx/ /usr/local/
- 配置模块生成 MakeFile 文件:
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --pid-path=/usr/local/nginx/logs/nginx.pid --http-log-path=/usr/local/nginx/logs/access.log --with-http_stub_status_module --with-http_ssl_module
- 编译安装:make && make install
- 启动:/usr/local/nginx/sbin
Nginx 配置实现负载均衡到不同 Nacos 节点
备份文件:cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bk
更新 nginx.conf
文件内容如下:
stream { upstream nacos { server 172.16.249.10:8848; server 172.16.249.11:8848; server 172.16.249.12:8848; } } server { listen 1998; server_name localhost; location / { proxy_pass http://nacos; } }
使用集群
部署完以后,访问 http://172.16.249.10:1998/nacos
查看节点列表,如下图:
- 引入 Nacos 相关依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 更新 application.yml、bootstrap.yml 文件内容如下:
spring: application: name: nacos-config-client profiles: # active: dev # 开发环境 active: test # 测试环境 # active: prod # 生产环境 server: port: 3377
spring: cloud: nacos: config: server-addr: 172.16.249.10:1998 file-extension: yaml namespace: server-addr: 172.16.249.10:1998
- 新增配置类如下:
import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @Author vnjohn * @Date 2022/8/9 */ @RestController @RefreshScope public class ConfigInfoController { @Value("${config.info}") private String configInfo; @GetMapping("config/info") public String configInfo() { return configInfo; } }
- 在 Nacos 中添加配置文件,以便项目启动时能够读取到内容,配置文件的命名格式:
${spring.application.name}-${spring.profile.active}.${file-extension}
配置文件名称:nacos-config-client-test.yaml
新增完配置文件以后,可以看到数据库:nacos_config#config_info
多了一条记录
到此 Nacos 集群以及如何使用集群就完结了
安装包及仓库地址
仓库链接:https://github.com/vnjohn/spring-cloud-alibaba-vnjohn
网盘链接:https://pan.baidu.com/s/1Knq1yo0vd6UpVhvlkIs5xg?pwd=8h0e
总结
此篇博文,讲解了 Nacos 是什么以及为何使用 Nacos 的初衷,从零到一实战落地搭建 Nacos 集群,包含了依赖于其他的组件:JDK、MySQL、Nginx 等,随即演示了怎么去使用集群进行数据操作,最后,将该部分实战的源码整理到 GitHub 以及网盘中
,希望能够帮助到你~
如果觉得博文不错,关注我 vnjohn
,后续会有更多实战、源码、架构干货分享!
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!