声明
初生牛犊不怕虎啊,我和我的意志斗争,不过胜负已经知晓,不然该文章也不会出现,Nacos集群,经历过无数次实验,我成功了!!!
先锋
单服务搭建Nacos集群(docker-compose方式),全网首发,我是第一个欧耶!!!
前提
- Centos版本:7.x
- Docker(版本任意)
- 提前装好Docker-compose依赖
- Mysql5.7(Docker容器中安装)
为什么搭建Nacos集群?
Nacos支持几乎所有主流类型的“服务”的发现、配置和管理,服务将自身入驻到Nacos中,Nacos将服务管理起来,并且服务与服务之间的通信也在服务发现基础之上进行的,如果Nacos服务因某种原因宕机了,也就意味将军失去了虎符,服务将会群龙无首,服务与服务之间通信的桥梁也会消失,对于该情况,我们可以搭建Nacos集群,即使某个Nacos挂掉,其他存活的Nacos服务也会正常工作,大大的提升了系统的可用性。
Nacos单机模式和集群模式
如何搭建Nacos集群?
长话短说,在讲清楚为什么搭建Nacos集群后,就要开始进行Nacos的集群搭建了,我搭建Nacos集群是在单个服务器上搭建的,没有使用分布式的方式,不过单服务搭建方式和分布式搭建方式基本类似,只不过配置内容不同。
自己画的,凑合下哈,实现流程通过该图展现出来
步骤一:Nacos官方中寻找灵感
Nacos官网,到Nacos官方中获取Nacos官网提供的搭建Nacos集群的配置文件(custom.properties和cluster-hostname.yaml)。
步骤二:修改配置文件中的内容
修改cluster-hostname.yaml配置文件,注意mysql的网段一定要和nacos的网段在同一个网段域中,否则就会无法连接,原因是无法访问到mysql地址。
cluster-hostname.yaml
version: "3.7"
services:
nacos1:
hostname: nacos1 #主机名称
container_name: nacos1 #容器名称
image: nacos/nacos-server:1.3.0 #Docker镜像包
volumes: #映射
- ./nacos/cluster-logs/nacos1:/home/nacos/logs
- ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
ports: #端口
- "28846:28846"
environment: #环境
NACOS_APPLICATION_PORT: 28846 #nacos端口号
NACOS_SERVER_IP: 172.168.0.5 #nacos的ip
NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
SPRING_DATASOURCE_PLATFORM: mysql #nacos依赖的数据
MYSQL_SERVICE_HOST: 172.168.0.2 #数据的地址
MYSQL_SERVICE_DB_NAME: nacos_devtest #数据库名称
MYSQL_SERVICE_PORT: 3306 #数据库端口
MYSQL_SERVICE_USER: root #数据库用户名
MYSQL_SERVICE_PASSWORD: root #数据库密码
restart: always #重启方式
depends_on: #启动顺序
- mysql
networks: #网段设置
extnetwork:
ipv4_address: 172.168.0.5
nacos2:
hostname: nacos2
image: nacos/nacos-server:1.3.0
container_name: nacos2
volumes:
- ./nacos/cluster-logs/nacos2:/home/nacos/logs
- ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "28847:28847"
environment:
NACOS_APPLICATION_PORT: 28847
NACOS_SERVER_IP: 172.168.0.4
NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 172.168.0.2
MYSQL_SERVICE_DB_NAME: nacos_devtest
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: root
restart: always
depends_on:
- mysql
networks:
extnetwork:
ipv4_address: 172.168.0.4
nacos3:
hostname: nacos3
image: nacos/nacos-server:1.3.0
container_name: nacos3
volumes:
- ./nacos/cluster-logs/nacos3:/home/nacos/logs
- ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "28848:28848"
environment:
NACOS_APPLICATION_PORT: 28848
NACOS_SERVER_IP: 172.168.0.3
NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: 172.168.0.2
MYSQL_SERVICE_DB_NAME: nacos_devtest
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: root
networks: always
depends_on:
- mysql
networks:
extnetwork:
ipv4_address: 172.168.0.3
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: nacos_devtest
MYSQL_USER: nacos
MYSQL_PASSWORD: nacos
volumes:
- ./mysql:/var/lib/mysql
ports:
- "28336:3306"
networks:
extnetwork:
ipv4_address: 172.168.0.2
nginx-server:
image: nginx:latest
container_name: nginx-server
ports:
- "28180:28180"
volumes:
- /SpringCloud/nginx/conf.d:/etc/nginx/conf.d
- /SpringCloud/nginx/nginx.conf:/etc/nginx/nginx.conf
- /SpringCloud/logs/nginx:/var/log/nginx
- /SpringCloud/www:/usr/share/nginx/html
environment:
- TZ=Asia/Shanghai
restart: always
networks:
extnetwork:
ipv4_address: 172.168.0.6
networks:
extnetwork:
ipam:
config:
- subnet: 172.168.0.0/24
custom.properties
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*
# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
nginx.conf
user root;
worker_processes 4;
error_log /var/log/nginx/error.log info;
#pid /var/run/nginx.pid;
events {
worker_connections 4096;
}
http {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
add_header Access-Control-Allow-Headers X-Requested-With;
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
autoindex on;
#gzip on;
upstream nacoscluster{
ip_hash;
server 172.168.0.5:28846;
server 172.168.0.4:28847;
server 172.168.0.3:28848;
}
server {
listen 28180;
#server_name gwmyd.org.cn;
location ^~/ {
proxy_pass http://nacoscluster;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
client_max_body_size 100M;
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
}
步骤三:将配置文件上传到服务器中
注意:cluster-hostname.yaml配置文件中的映射文件路径,这里的配置文件放置目录都是根据cluster-hostname.yaml配置文件中的映射目录来放置的。
步骤四:Shell命令
对于接下的操作就是Shell命令了,连接到服务器中,通过Shell命令进行操作。
小细节
在这里有个小细节,由于我们在yaml配置文件中配置了网段,所以在执行yaml文件之前,先查看docker容器中已存在网段是否和我们自定义网段冲突,如果不冲突则正常运行,如果冲突的话则运行时会报错并提示“”该网段已经存在“”,解决方案1:换未存在的网段,解决方案2:删掉冲突的网段。
好,步入正题,在确定没有冲突的网段之后,就可以运行yaml文件了,需要注意的是,Docker容器映射的端口一定要对外开放,否则外部无法访问。
步骤四说明:在启动成功之后,如果去查看Nacos对应的mysql的数据库的话,会发现数据库中是空表的,如果发现此问题不需要担心,当我们在Nacos客户端创建配置的时候,Nacos底层会自动帮我们创建数据表。
步骤五:访问测试
访问方式:服务器ip或服务器域名:nginx监听端口号/nacos
通过Navicat for MySQL客户端进行连接,前提是外网开放映射端口,本地保证可以访问到。
Nacos的选举
Nacos的选举是基于Raft算法的,我怎么知道是基于Raft算法呢?很简单,因为我查看了日志(偷笑),由于主题是如何搭建Nacos集群,所以对于Nacos选举的详细描述忽略,不过我会通过图片的方式放置在下方,如果有不懂的地方,可以通过评论区询问。
导入该依赖查看Nacos选举步骤源码
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-naming</artifactId>
<version>0.8.0</version>
</dependency>
最核心的类是RaftCore类,其余的都是辅助类。
最终效果,leader已经被选出来。
Nacos的过半机制
对于Nacos的过半机制,实际上非常容易理解,话不多说,码起来。
/**
* look,这就是过半机制,如果看不懂的话可以将peers.size()方法换成数字,
* eg: 3/2+1=2,如果投票数大于等于peers.size()/2+1的值,则就成功。
*
*/
public int majorityCount() {
return peers.size() / 2 + 1;
}
Nacos的参数指南
Nacos的参数地址,yaml配置文件中的参数都是参照该页面的参数进行配置的,不过对于JVM的设置参数(对Java虚拟机的一些优化)我没有使用,感兴趣的码佬们可以进行添加。
尾声
深夜文章,写之不易,麻烦各位码佬们点赞关注下,我会时不时更新一些实战系列的文章~~