一, Nacos 简介
Nacos 是用于微服务管理的平台, 其核心功能是服务注册与发现, 服务配置管理.
Nacos 作为服务注册发现组件, 可以替换 Spring Cloud 应用中传统的服务注册于发现组件, 如: Eureka,consul 等, 支持服务的健康检查.
Nacos 作为服务配置中心, 可以替换 Spring Cloud Config.
当然 Nacos 作为一个微服务管理平台, 除了面向 spring Cloud, 还支持很多其他的微服务基础设施, 如: docker,dubbo,kubernetes 等. 除了核心的服务注册与发现和配置管理功能, 还提供了各种服务管理的功能特性, 如: 动态 DNS, 服务元数据管理等.
二, Nacos 单点部署
Nacos 支持单点部署的模式, 搭建过程非常简单, 实际上 nacos 的 standalone 模式没有所谓的安装过程, 就是下载和启动. 但是这种情况没有高可用支持, 所以只适合测试或学习使用.
首先去 nacos 的 GitHub 地址下载 release 安装包. 当然你也可以自己下载源码之后进行编译打包, nacos 是使用 java 开发的, 使用 maven 进行编译打包. 这里我们就不自己打包了, 使用 release 安装包. 下载地址是: https://github.com/alibaba/nacos/releases . 在 Linux 系统下可以使用如下的命令下载和解压缩.
- # 下载 nacos
- wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz;
- # 解压 nacos
- tar -xvf nacos-server-1.1.4.tar.gz
进入到 nacos/bin 目录下面, startup 命令用于启动 nacos,shutdown 命令用于停掉 nacos.
如果你是 Linux/unix 系统, 使用
sh startup.sh -m standalone
脚本启动方式.
如果你是 Windows 系统, 双击 startup.cmd 启动 nacos.
nacos 的默认服务端口是 8848, 启动完成之后通过浏览器访问 nacos:http://ip:8848/nacos/. 看到如下界面, 需要登陆, 默认的用户名密码都是 nacos, 登陆之后看到如下界面:
如果你访问不到上面的界面, 请检查你部署的主机操作系统的防火墙设置. 以下是为 CentOS7 系统防火墙开放 8848 端口的命令, 其他系统请自行解决.
- firewall-cmd --zone=public --add-port=8848/tcp --permanent
- firewall-cmd --reload
三, 查看主机网卡名称
使用 ip addr 命令查看 Linux 主机的网卡.
第一个 lo 网络 ip 是回路 ip,127.0.0.1, 这个是标配
第二个 enp0s3 网络设备, ip 是 10.0.2.15, 这个是因为我的服务器网络使用了双网卡: 桥接 + HostOnly 模式. 正常的服务器是没有的.
第三个 enp0s8 就是本服务器真正的使用到提供服务的网络 ip, 如: 192.168.161.4.
第四个网络设备是因为我在这台虚拟机上安装过 docker, 所以有一个 docker0 的网络设备.
因为较多的网络设备, 导致我在后续安装过程出现问题. 这里先卖个关子.
四, 配置 nacos 集群
我们准备了三台服务器 (虚拟机),192.168.161.3,192.168.161.4,192.168.161.5. 在三台服务器上分别下载, 解压 nacos, 并开放 8848 端口. 参考单点 standalone 部署的模式的操作. 然后在 conf/cluster.conf 中加入三台服务器的 ip 配置
- #ip:port
- 192.168.161.3:8848
- 192.168.161.4:8848
- 192.168.161.5:8848
初始化 MySQL 数据库, sql 源文件是在 nacos/conf 解压目录下面的 nacos-MySQL.sql 文件. sql 语句源文件. 并在 nacos/conf/application.properties 中增加 MySQL 配置
- spring.datasource.platform=MySQL
- db.num=1
- db.url.0=jdbc:MySQL://192.168.161.3:3306/testdb?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
- db.user=test
- db.password=
spring.datasource.platform 说明支持数据持久化的数据库类型, 已知目前只支持 MySQL
db.num 数据库的数量, 我们实验环境只有一个 MySQL 数据库, 所以是 1
db.url.0 表示第一个 MySQL 数据库的 jdbc url 连接. 如果还有第二个, 第三个, 请增加 db.url.n 中的 n.
问题: 解决网卡获取的不是我们希望绑定的网卡的问题: 当我们配置完成之后, 使用 startup.sh 命令启动. 发现集群节点列表中并没有任何记录. 而且后台服务日志报错, 内容如下:
分析: 通过日志我们看到 nacos 程序自动获取的是 10.0.2.15 这个 ip, 而我们配置的是 192.168.161.x 的 ip. 二者不一致, 所以报错. 我们看一下获取主机 ip 的程序源码, 如下:
- private static String getHostAddress() {
- String address = System.getProperty("nacos.server.ip");
- if (StringUtils.isNotEmpty(address)) {
- return address;
- } else {
- address = "127.0.0.1";
- }
- ...
- }
解决方案: 看完源码之后, ip 是通过 System.getProperty 获取的, 所以我们完全可以通过 JVM 传参指定 ip. 在 startup.sh 的启动脚本中增加 nacos.server.ip 参数.
- #=================================================================================
- # JVM Configuration
- #================================================================================
- # 单机模式对应的启动参数
- if [[ "${MODE}" == "standalone" ]]; then
- JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
- JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
- else
- # 集群模式对应的启动参数
- JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
- JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
- JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
- # 新增以下参数设置本机 ip 地址
- JAVA_OPT="${JAVA_OPT} -Dnacos.server.ip = 你的服务器的 ip"
- fi
当以上工作都完成之后, 我们通过浏览器分别访问 nacos 服务, 看到如下界面. 集群管理的节点列表里面已经有三各节点, ip 分别是 192.168.161.3:8848,192.168.161.4:8848,192.168.161.5:8848.
五, nacos 集群架构
在完成 nacos 集群的配置之后, 我们可以通过三个入口分别访问集群内的 nacos 服务, 那下面的问题就是如何将三个入口转成一个入口. 目前许多个人开发者写的博客或教程中的方法就是在三个 nacos 服务的前端加一个负载均衡器, 如: nginx,haproxy. 然后号称是生产级别的搭建方法, 但这种方法是绝对不能用于生产的, 因为你的 nginx 和 haproxy 是单点, 一旦 nginx 挂了, 整个服务就挂了.
nacos 官网推荐的方法是使用虚拟 ip 的方法, 如下:
最开始虚拟 ip192.168.161.6 可能与 192.168.161.3 的主机绑定在一起, 通过这两个 ip 都可以访问 192.168.161.3 主机的 nacos 服务.
一旦 192.168.161.3 主机宕机或者其他网络故障, 192.168.161.6 会自动切换到与 192.168.161.4 或者 192.168.161.5 主机绑定在一起. 这个过程被叫做虚拟 ip 的漂移.
这种虚拟 ip 的方法就是没有使用到负载均衡, 访问的仍然是某一个节点的 nacos 服务, 只不过形成了主从备份, 提供了高可用. 那既可以提供高可用, 又可以提供负载均衡的办法可能有的朋友已经想到了, 如下图:
在 nacos 服务的前端加上 nginx 或者 haproxy 的负载均衡器
然后对负载均衡器使用虚拟 ip, 通过 keepalived 实现虚拟 ip 的漂移
用户访问负载均衡器实现对 nacos 服务的访问, 主 nginx 挂掉, 虚拟 ip 漂移到从 nginx 负载均衡提供服务
六, nacos 集群 (虚拟 ip 漂移)
我们就拿官网中推荐的方法, 使用虚拟 ip 访问 nacos 集群的方式做个例子讲解一下. 为什么不讲第三种? 一般系统架构水平到了的人听懂这种方式就知道第三种方式怎么做, 水平不到的人听了第三种仍然还是不懂.
6.1. 安装配置 keepalived
在三台服务器上分别安装 keepalived
yum install -y keepalived
在三台服务器上分别修改 / etc/keepalived/keepalived.conf
- vrrp_instance VI_1 {
- state MASTER
- interface enp0s8
- virtual_router_id 51
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 123456
- }
- virtual_ipaddress {
- 192.168.161.6
- }
- }
一台服务器是 MASTER, 其他的服务器为 BACKUP
interface 配置为我们刚刚查看的网卡的名称
virtual_router_id 必须一致, 表示这三台服务器抢用一个虚拟 ip.
修改 priority 优先级, 三台服务器要不一样, 比如: 100,101,102, 优先级最高的优先使用虚拟 ip.MASTER 的优先级一定要高于 BACKUP 主机
advert_int 是几台服务器之间的同步检查时间, 1 秒
authentication 的设置必须一致, 这样这几台服务器才能通信
修改 virtual_ipaddress 为三台服务器所在网段内未被占用的 IP 地址, 比如: 192.168.161.6
6.2. 修改防火墙
CentOS7 必须开放防火墙配置, 否则三台主机无法就虚拟 ip 的使用优先级通信, 将都是 MASTER, 都配置虚拟 ip.
- firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT;
- firewall-cmd --reload;
6.3. 启动 keepalived 服务
sudo systemctl restart keepalived.service
期待您的关注
向您推荐博主的系列文档:《手摸手教您学习 SpringBoot 系列 - 16 章 97 节》 http://springboot.zimug.com/
来源: https://www.cnblogs.com/zimug/p/12034550.html