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 目录下,没有就 mkdir /opt
1、tar -zxvf jdk-8u171-linux-x64.tar.gz、tar -zxvf jdk-8u341-linux-aarch64.tar.gz
2、mv jdk1.8.0_171/ jdk8
3、mv jdk8/ /usr/local/
4、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文件立即生效
5、source /etc/profile
MySQL
MySQL 5.7 X86_X64 安装步骤:https://www.cnblogs.com/huchong/p/9152117.html
在 172.16.249.10 节点安装,Linux Arrach64 安装 MySQL 过程如下:
1、安装 MySQL arrach64 yum 包:wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz
2、tar -xvf mysql-5.7.27-aarch64.tar.gz
3、修改目录名称:mv /usr/local/mysql-5.7.27-aarch64 /usr/local/mysql
4、创建日志目录:mkdir -p /usr/local/mysql/logs
5、新建组:groupadd mysql、新建用户:useradd -r -g mysql mysql
6、修改目录所有者:chown -R mysql:mysql /usr/local/mysql
7、创建软链接:ln -sf /usr/local/mysql/my.cnf /etc/my.cnf
8、复制包:cp -rf /usr/local/mysql/extra/lib* /usr/lib64/
9、将老版本库包更新名:mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.old
10、引用新版本软链接:ln -s /usr/lib64/libstdc++.so.6.0.24 /usr/lib64/libstdc++.so.6
11、设置开机启动
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
12、添加环境变量:vi /etc/profileexport MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/binsource /etc/profile
13、初始化启动 MySQL,无密码方式登陆:mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
14、开启 MySQL:systemctl start mysqld
15、查看 MySQL 运行状态:systemctl status mysqld
16、登陆 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
17、远程连接 MySQL 关闭服务器防火墙:
- 暂时关闭:systemctl stop firewalld,重启后仍然生效
- 永久关闭:systemctl disable firewalld
Nacos 集群
1、tar -zxvf nacos-server-2.0.3.tar.gz
2、mv /opt/nacos /usr/local/nacos
3、在 172.16.249.10 节点安装的数据库中执行
- create database nacos_config;
- use nacos_config;
- 执行 SQL 脚本,表结构语句:/usr/local/nacos/conf/nacos-mysql.sql
4、修改 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
5、如果是在单台节点上部署集群,需要将端口分散开来,因为 Nacos 内置还占用了两个端口用于 gRPC 使用的,偏移量为 1000、1001,除了自身的 8848 端口,还会占用 8848、8849 这两个端口
- 错误示例: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 断开。
6、正式开始配置集群,首先我们要更改 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
7、每个节点启动:sh /usr/local/nacos/bin/startup.sh,默认就是以集群方式启动的
8、单机模式启动方式:sh startup.sh -m standalone,windows 就是 startup.cmd -m standalone
Nginx
1、安装前置环境
- yum -y install gcc
- yum -y install openssl openssl-devel make zlib zlib-devel gcc gcc-c++ libtool pcre pcre-devel
2、tar -zxvf nginx-1.16.1.tar.gz
3、mv nginx-1.16.1 nginx、mv nginx/ /usr/local/
4、配置模块生成 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
5、编译安装:make && make install
6、启动:/usr/local/nginx/sbin
Nginx 配置实现负载均衡到不同 Nacos 节点
1、备份文件:cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bk
2、编辑 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 查看节点列表,如下图:
1、引入 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>
2、修改 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 提取码: 8h0e
更多技术文章可以查看:vnjohn 个人博客