依赖
为了进行所有微服务的管理,使用Nacos 实现服务的注册,而这个注册一定要使用到Nacos的领域模型。
SpringCloudAlibaba体系中提供了对Nacos注册中心的自动配置支持,开发者只需要在微服务的提供端提供Nacos发现服务(spring-cloud-starter-alibaba-nacos-discovery)与配置(spring-cloud-starter-alibaba-nacos-config)依赖,而Nacos配置依赖启动优先级较高,所以就需要在项目中提供 bootstrap.yml配置文件,并在此配置文件中定义Nacos相关连接信息,随后再编写application.yml配置文件定义Nacos发现配置
Nacos 2.x
虽然当前使用的是Nacos 2.x版本,Nacos 1.x服务注册和Nacos 2.x服务注册有很大的区别,在Nacos 1.x的时候使用的spring-cloud-starter-alibaba-nacos-discovery这个依赖库就可以解决注册问题。
gRPC
Nacos 2.x核心的实现机制,在于长连接提高通信性能,所以采用的是“gRPC”的通讯协议;Nacos2.0 版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
project(":provider-dept-8001") { // 部门微服务
dependencies {
implementation(project(":common-api")) // 导入公共的子模块
implementation(libraries.'mybatis-plus-boot-starter')
implementation(libraries.'mysql-connector-java')
implementation(libraries.'druid')
implementation(libraries.'springfox-boot-starter')
implementation('org.springframework.boot:spring-boot-starter-security')
// 以下的依赖库为Nacos注册中心所需要的依赖配置
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation('com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config') {
exclude group: 'com.alibaba.nacos', module: 'nacos-client' // 移除旧版本的Nacos依赖
}
implementation(libraries.'nacos-client') // 引入与当前的Nacos匹配的依赖库
}
}
bootstrap.yml
spring: # Spring配置项
cloud: # SpringCloud配置项
nacos: # Nacos注册中心的配置
config: # gRPC通讯配置
server-addr: nacos-server:8848 # Nacos地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: YootkCluster # 配置集群名称
application.yml
spring:
application: # 配置应用信息
name: dept.provider # 是微服务的名称
cloud: # Cloud配置
nacos: # Nacos注册中心配置
discovery: # 发现服务
service: ${spring.application.name} # 使用微服务的名称作为注册的服务名称
server-addr: nacos-server:8848 # Nacos服务地址
namespace: 96c23d77-8d08-4648-b750-1217845607ee # 命名空间ID
group: MICROCLOUD_GROUP # 一般建议大写
cluster-name: YootkCluster # 配置集群名称
metadata: # 根据自身的需要配置元数据
version: 1.0 # 自定义元数据项
company: 沐言科技 # 自定义元数据项
url: www.yootk.com # 自定义元数据项
author: 李兴华(爆可爱的小李老师) # 自定义元数据项
1、 [nacos-server主机](考虑到后续开发的问题,建议将当前的Nacos单节点服务主机的IP地址进行一下变更)
打开网卡配置文件,配置静态IP地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=192.168.190.158
2、[nacos-server主机]修改当前主机的名称
vi /etc/hostname
nacos-server
3、[nacos-server主机]修改hosts主机映射文件:
打开主机映射文件,配置主机映射项
vi /etc/hosts
192.168.190.158 nacos-server
4、[nacos-server主机]
为了使配置生效,重新启动当前的主机系统:
reboot
5、将当前于打包完成的”nacos-server- 2.0.2.tar.gz”文件上传到Linux系统之中,可以直按通过FTP方式上传;
为了便于统一管理,本次上传文件保存的父目录为"/var/ftp/" ;
6、[nacos-server主机]
将上传得到的"nacos-server-2.0.2.tar.gz" 文件进行解压缩,解压缩到"/usr/local" 目录之中:
tar xzvf /var/ftp/nacos-server-2.0.2.tar.gz -C /usr/local/
7、 [ nacos-server主机]
按照正常的做法应该是直接通过内部提供的SH命令进行服务启动,但是Nacos所给出的SH脚本命令无法直接使用,必须修改其文件格式
打开配置文件:
vi /usr/local/nacos/bin/startup.sh
vi /usr/local/nacos/bin/shutdown.sh
查看当前格式:
set ff
[得到结果: “fileformat=dos” ]
修改文件格式:
set ff=unix
8、[nacos-server主机] 启动Nacos服务
bash -f /usr/local/nacos/bin/startup.sh -m standalone
9、[nacos-server主机]
在Nacos应用服务启动完成后,下面查看一 下当前Nacos所占用的服务端口信息
netstat -nptl| grep java
10、[ nacos-server 主机]现在仅仅是实现了Nacos服务启动,但是最终访问之前还需要进行防火墙的配置。
配置访问端口:
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --zone=public --add-port=7848/tcp --permanent
firewall-cmd --zone=public --add-port=9848/tcp --permanent
firewall-cmd --zone=public --add-port=9849/tcp --permanent
配置重新加载:
firewall-cmd --reload
11、 [Nacos控制台]服务启动之后,下面通过浏览器访问Linux主机上的控制台:
通过Nacos保存所有微服务配置信息的地方是Nacos注册中心的内存里面,但是对于一些配置项(Nacos 领域模型、用户的认证与授权)的操作一般都是保存在数据库之中,同时在Nacos里面也提供了- -些数据库的创建脚本支持。Nacos在进行服务数据存储时分为两类数据信息: -一个是微服务的注册数据,另外一个是相关的服务配置数据,而所有的配置数据在开发中一般不会轻易改变,这样就可以将其存储在MySQL数据库之中
1、[nacos-mysql 主机]
该主机配置的主机名称为"nacos-mysql", 同时IP 地址变更为"192.168.190.159"
vi /etc/sysconfig/network-scripts/ifcfg-ens3
IPADDR=192.168.190.159
vi /etc/hostname
vi /etc/hosts
reboot
2、[nacos-mysql 主机]
在当前的虚拟机里面配置MySQL-8.x数据库,服务启动: service mysqld start
3、[nacos-mysql 主机]
启动MySQL客户端,进行MySQL数据库的连接: /usr/local/mysql/bin/mysql -uroot -p1234 -hnacos-mysql
4、[nacos-mysql主机]在MySQL里面创建一个数据库, 名称为"nacos"
创建新数据库:
CREATE DATABASE nacos CHARACTER SET UTF8;
使用新数据库:
USE nacos;
5、[nacos-server主机]
Nacos 数据存储的表结构是由Nacos给出来的,所以就可以找到Nacos安装包之中所提供的SQL创建脚本,将数据库脚本发送到"nacos-mysql" 主机之中:
scp /usr/local/nacos/conf/nacos-mysql.sql 192.168.190.159:/usr/local/src
6、[nacos-mysql 主机] 利用source命令进行导入即可。
source /usr/local/src/nacos-mysql.sql
7、[nacos-mysql主机] 查看当前所创建的数据表
show tables
如果按照实际的项目开发来讲,此时的程序代码应该继续采用库表分离的设计模型进行操作,因为要考虑到各种极限的高并发访问的处理问题。
8、 [nacos-server主机] 此时需要将当前这个MySQL数据库在Nacos中进行配置,打开Nacos的配置文件:
vi /usr/local/nacos/conf/application.properties
9、[nacos-server主机] 在application.properties配置文件之中定义MySQL的连接信息项:
配置数据源类型: spring.datasource.platform=mysql
数据节点数量: db.num=1
数据库连接地址:
db.url.0=jdbc:mysql://192.168.190.159:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
数据库用户名:db.user.0=root
数据库密码:db.password.0=1234
10、[ nacos-server主机]此时需要重新启动Nacos服务进程,通过内部给出的命令关闭Nacos服务:
/usr/local/nacos/bin/shutdown.sh
11、[nacos-server 主机] 重新启动Nacos服务进程
bash -f /usr/local/nacos/bin/startup.sh -m standalone
12、 [nacos控制台]为了便于验证是否配置正确,可以通过Nacos控制台来进行一个新用户的添加浏览器访问地址:
http://nacos-server:8848/nacos
此时创建了一个新的用户"muyan/yootk" ,创建完成之后查询一下对应数据表内容,观察是否有对应的信息提供。
命名空间Id 96c23d77-8d08-4648-b750-1217845607ee
1、官方文档
https://nacos.io/zh-cn/docs/open-api.html
2、[POST请求] 创建新的命名空间
http://nacos-server:8848/nacos/v1/console/namespaces?customNamespaceId=&namespaceName=yootk&namespaceDesc=yootk.com
3、[POST请求] 向yootk命名空间进行配置发布
http://nacos-server:8848/nacos/v1/cs/configs?tenant=39ab51a6-e00b-4308-b341-754ff7765487&dataId=dept.provider&group=MICRO_REST&content=www.yootk.com
4、[POST请求]发布新的实例数据
http://nacos-server:8848/nacos/v1/ns/instance?namespaceId=39ab51a6-e00b-4308-b341-754ff7765487&ip=192.168.1.27&port=8090&serviceName=dept.service&groupName=MICRO_REST
5、[GET请求] 查询一个指定的服务信息.
http://nacos-server:8848/nacos/v1/ns/instance?namespaceId=39ab51a6-e00b-4308-b341-754ff7765487&ip=192.168.1.27&port=8090&serviceName=dept.service&groupName=MICRO_REST
6、[DELETE请求] 删除指定的服务实例.
http://nacos-server:8848/nacos/v1/ns/instance?namespaceId=39ab51a6-e00b-4308-b341-754ff7765487&ip=192.168.1.27&port=8090&serviceName=dept.service&groupName=MICRO_REST
这个时候如果要想为部门微服务引入多台服务器来承受住高并发的访问问题,随之所带来的情况有如下几种:
1.如何可以更好的实现微服务的数据管理,微服务需要有数据库进行数据存储,而在多台实例的情况下就需要引入一个
组件实现数据库之中的代理操作(这个操作不属于本次的实现范围);
2·不管有多少个服务节点提供,那么最终所有的微服务都要求在Nacos注册中心中进行配置,而后消费端才可以通过注
册的服务名称来找到所有的服务节点;
3·虽然某一个微服务的实例节点增多可以提升并发访问量,但是所有的服务一般都需要通过注册中心来进行微服务的调
用,此时你微服务的性能提升了,但是注册中心的性能没有提升,最终所带来的问题就是整个的服务依然没有提升性能,所以在整个的微服务集群之中,还需要考虑到注册中心的高性能处理,那么自然又需要引入注册中心的集群化配置了;
4·那么一旦有注册中心了,所有的微服务就需要被统一的管理,针对于注册中心实现代理访问了,而这个代理访问在
Nacos 1.x的时代比较简单,因为一切都是以HTTP协议为主的,而在Nacos 2.x的时代里面就有了HTTP控制台以及gRPC的服务注册管理,这样就需要多引入一个GRPC的代理机制;
—且引入了Nacos集群,则一定也需要进行数据库的有效管理,于是这个时候依然要考虑到数据库的分布式存储;
本次的开发将围绕着Nacos集群搭建、部门微服务的集群搭建、Nacos服务代理(Nginx、HAProxy)以及最终的服务存储等环节来进行设计与开发,本次的操作更多的环节上是以配置为主,而对于代码的部分实际上修改的并不是特别多。
1、【nacos-server主机】删除掉当前Nacos使用痕迹:
rm -rf /usr/local/nacos/{data,logs}
2、【nacos-server主机】对当前的服务主机进行关机处理:
halt
3、【 VMWare虚拟机】
对“Nacos-Server”虚拟机进行复制,分别得到“Nacos-Cluster-A"、“Nacos-Cluster-B"、"Nacos-Cluster-C”三台虚拟机,这三台虚拟机复制完成之后,当前的IP地址还是原始的“Nacos-Server”所配置的
4、【Nacos-Cluster-*主机】修改对应的网络环境,打开网卡配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
Nacos-Cluster-A: IPADDR=192.168.190.151
Nacos-Cluster-B: IPADDR=192.168.190.152
Nacos-Cluster-C: IPADDR=192.168.190.153
5、【Nacos-Cluster-*主机】修改当前的主机名称: vi/etc/hostname;
Nacos-Cluster-A: nacos-cluster-a
Nacos-Cluster-B: nacos-cluster-b
Nacos-Cluster-C: acos-cluster-c
6、【Nacos-Cluster-*主机】修改三台主机的主机列表: vi /etc/hosts
192.168.190.151 nacos-cluster-a
192.168.190.152 nacos-cluster-b
192.168.190.153 nacos-cluster-c
192.168.190.155 nacos-proxy
7、【Nacos-Cluster-*主机】如果要想配置生效,则需要重新启动当前的虚拟机: reboot
8【Nacos-Cluster-A主机】如果要想实现Nacos集群配置,可以直接参考已有的集群配置模版文件,一般的做法是将这个文件进行复制处理;
cp /usr/local/nacos/conf/cluster.conf.example /usr/local/nacos/conf/cluster.conf
9、【Nacos-Cluster-A主机】打开集群配置文件: vi /usr/local/nacos/conf/cluster.conf
10、【Nacos-Cluster-A主机】将所有参与到集群之中的Nacos主机项配置到该文件之中
正确的配置:
192.168.190.151:8848
192.168.190.152:8848
192.168.190.153:8848
按照Nacos官方文档的说法(cluster.conf配置文件中也有说明),如果要想实现Nacos的集群配置应该只能够使用IP地址
11、【Nacos-Cluster-A主机】其他的两个Nacos主机本质上的配置环境跟当前的主机相同,所以将cluster.conf配置文件拷贝到其他的主机之中(这些主机已经配置了SSH免登录);
拷贝到"Nacos-Cluster-B":
scp /usr/local/nacos/conf/cluster.conf nacos-cluster-b:/usr/local/nacos/conf/
拷贝到"Nacos-Cluster-C":
scp /usr/local/nacos/conf/cluster.conf nacos-cluster-c:/usr/local/nacos/conf/
12、【Nacos-Cluster-*主机】从当前的配置来讲是无法通过主机名称来实现 Nacos集群配置的,所以如果要想让其通过主机名称访问,则需要修改Nacos启动脚本文件:vi /usr/local/nacos/bin/startup.sh
14、【Nacos-Cluster-*主机】启动当前集群之中全部的Nacos 服务实例,这个时候启动就不再需要追加单独运行的参数了.
bash -f /usr/local/nacos/bin/startup.sh
15、【Nacos-Cluster-*主机】随意找到一台主机,来观察当前的启动的信息:
more /usr/local/nacos/ogs/start.out
INFO Nacos started successfully in cluster mode.use external storage
需要注意的是,在进行Nacos服务配置的时候,请一定要在其运行的先期就确定是以独立的模式运行还是以集群的模式运行,因为牵扯到扩展的数据库存储问题,如果要更换模式则一定要更换数据库;
DROP DATABASE nacos;
CREATE DATABASE nacos CHARACTER SET UTF8;
USE nacos;
source /usr/local/src/nacos-mysql.sql
如果你现在全部的配置都是新建的虚拟机或者是新的云服务器,这个时候请定要配置好防火墙端口访问规则:
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --zone=public --add-port=7848/tcp --permanent
firewall-cmd --zone=public --add-port=9848/tcp --permanent
firewall-cmd --zone=public --add-port=9849/tcp --permanent
firewall-cmd --reload
16、【本地系统】为了便于服务的访问,修改本地系统之中的 hosts配置文件
192.168.190.151 nacos-cluster-a
192.168.190.152 nacos-cluster-b
192.168.190.153 nacos-cluster-c
192.168.190.155 nacos-proxy
17、【本地系统】此时访问任意的一个Nacos集群中的节点控制台:
此时的 Nacos节点一共提供有三个(实际之中肯定会有更多的节点,如果你的项目已经达到了亿万级访问量仅仅依靠三个Nacos节点,得让客户端玩废,可以根据需要任意扩充),但是这每一个Nacos都提供有一个控制台,这样实在是不方便管理,最佳的做法是采用统一的路径来实现服务管理,本次使用Nginx来进行开发。
1、【nacos-proxy主机】修改当前代理主机的IP地址: vi /etc/sysconfig/network-scripts/ifcfg-ens33
2、【nacos-proxy主机】修改主机名称: vi /etc/hostname
3、【nacos-proxy主机】修改主机列表配置文件: vi /etc/hosts
192.168.190.151 nacos-cluster-a
192.168.190.152 nacos-cluster-b
192.168.190.153 nacos-cluster-c
192.168.190.155 nacos-proxy
4、【nacos-proxy主机】重新启动当前的虚拟主机: reboot
5、【nacos-proxy主机】进入到“/var/ftp”目录之中:
cd /var/ftp
6、 【nacos-proxy主机】通过wget命令直接下载Nginx源代码:
wget https://nginx.org/download/nginx-1.21.1.tar.gz
7、【nacos-proxy主机】将当前源代码的压缩文件解压缩到“/usr/local/src”目录之中:
tar xzvf /var/ftp/nginx-1.21.1.tar.gz -C /usr/local/src
8、【nacos-proxy主机】进入到Nginx源代码所在目录:
cd /usr/local/src/nginx-1.21.1/
9、【nacos-proxy主机】创建Nginx编译后的程序存储目录:
mkdir -p /usr/local/nginx/{logs,conf,sbin}
10、【nacos-proxy主机】安装Nginx编译所需要的依赖库:
yum -y install pcre-devel openssl openssl-devel
11、【nacos-proxy主机】对当前Nginx源代码进行编译配置:
./configure --prefix=/usr/local/nginx/ --sbin-path=/usr/local/nginx/sbin/ --with-http_ssl_module \
--conf-path=/usr/local/nginx/conf/nginx.conf --pid-path=/usr/local/nginx/logs/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-http_v2_module
12、【nacos-proxy主机】Nginx编译安装: make && make install
13、【nacos-proxy主机】打开Nginx的配置文件: vi /usr/local/nginx/conf/nginx.conf
upstream nacoscluster {
server nacos-cluster-a:8848 weight=3 ;
server nacos-cluster-b:8848 weight=1 ;
server nacos-cluster-c:8848 weight=2 ;
}
location / {
proxy_pass http://nacoscluster;
root /nacos/;
}
14、【nacos-proxy主机】检查一下当前Nginx配置是否正确: /usr/local/nginx/sbin/nginx -t
程序执行结果:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok .
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
15、【nacos-proxy主机】为当前的代理主机添加防火墙访问规则:
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload
16、【nacos-proxy主机】启动Nginx服务进程:
/usr/local/nginx/sbin/nginx
17、【本地系统】本地系统已经配置了主机映射信息,所以可以直接通过Nginx代理访问:
nacos-proxy:8848/nacos
提示: 将当前主机中的hosts配置文件之中地址,这样访问nacos-server或nacos-proxy都是走的代理主机,只是为了方便
192.168.190.155 nacos-server
192.168.190.155 nacos-proxy
所以也可以使用nacos-server:8848/nacos
进行Nginx代理访问
实际上Nginx可以实现gPRC的代理机制,Nginx从1.13版本之后开始支持了gRPC代理通讯,所以理论上本次的注册gRPC代理应该也可以通过Nginx来完成,但是Nginx之中对于gRPC没有任何的改善,并不适合于长连接的操作,你现在如果使用了Nginx实现gRPC代理,最终是无法完成所有微服务注册的。
在 Nacos 2.x开发版本中为了提高服务注册与发现管理的性能,采用了gRPC协议,所以在进行服务代理时就可以利用HAProxy代理组件来实现Nacos集群管理。HAProxy是一款高可用组件,可以有效的实现集群服务节点的负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,开发者可以直接通过HAProxy官方站点 (haproxy.org/)免费获取该组件.
1、【nacos-proxy主机】进入到“/var/ftp”目录之中准备下载:
cd /var/ftp
2、【nacos-proxy主机】通过wget命令下载haproxy工具包:
wget https://www.haproxy.org/download/2.4/src/haproxy-2.4.2.tar.gz
3、【nacos-proxy主机】将HAProxy源代码开发包解压缩到“/usr/loca/src”目录之中:
tar xzvf /var/ftp/haproxy-2.4.2.tar.gz -C /usr/local/src/
4、【nacos-proxy主机】进入到HAProxy源代码所在的目录之中:
cd /usr/local/src/haproxy-2.4.2/
5、【nacos-proxy主机】HAProxy是一个源代码程序,所以需要进行编译前缀的配置:
make TARGET=custom ARCH=x86_64 PREFIX=/usr/local/haproxy
6、【nacos-proxy主机】进行HAProxy安装:
make install PREFIX=/usr/local/haproxy
7、【nacos-proxy主机】创建haproxy.cfg配置文件:
global # 全局配置
log 127.0.0.1 local0 # 启用日志
nbproc 1 # 监控进程个数
maxconnrate 300 # 进程每秒所能创建的最大连接数
maxcomprate 300 # 压缩速率
maxsessrate 500 # 进程每秒能创建的会话数量
chroot /usr/local/haproxy # HAProxy部署路径
pidfile /usr/local/haproxy/haproxy.pid # pid文件存储路径
maxconn 30000 # 进程所能接收的最大并发连接数
user haproxy # 启动用户名
group haproxy # 启动用户组
daemon # 后台模式运行
stats socket /usr/local/haproxy/stats # 开启统计Socket
defaults # 默认配置
mode http # http处理模式
log global # 全局日志配置
option dontlognull # 不记录健康日志信息
option redispatch # 允许重新分配session
option http-use-htx # 启用HTTP/2
option logasap # 传输大文件时提前记录日志
option httplog # 日志类别
retries 3 # 失败重试次数
timeout queue 1m # 队列超时
timeout connect 5m # 连接超时
timeout client 5m # 客户端超时
timeout server 5m # 服务端超时
timeout http-keep-alive 100s # 保持HTTP连接
timeout check 10s # 超时检查
listen admin_stats # 管理控制台
stats enable # 启用管理控制台
bind 0.0.0.0:9999 # 监控端口设置
mode http # 管理控制台模式
log global # 日志配置
maxconn 10 # 最大连接数量
stats uri /admin # 登录监控子路径配置
stats realm welcome\ Haproxy # 登录提示信息
stats auth admin:admin # 监控的账号密码
stats admin if TRUE # 启用管理员模式
option httplog # http日志记录
stats refresh 30s # 监控刷新时间
stats hide-version # 隐藏页面版本号
frontend nacos_cluster # 代理集群配置(名称自定义)
bind :9848 # 代理端口
mode http # 代理模式
log global # 日志配置
maxconn 8000 # 最大连接数
default_backend nacos_cluster_nodes # 代理节点名称(名称自定义)
backend nacos_cluster_nodes # 集群节点(名称自定义)
mode http # 代理模式
server nacos-a nacos-cluster-a:9848 check # 集群节点
server nacos-b nacos-cluster-b:9848 check # 集群节点
server nacos-c nacos-cluster-c:9848 check # 集群节点
8、【nacos-proxy主机】添加一个新的用户
useradd haproxy
9、【nacos-proxy主机】启动HAProxy服务进程,启动的时候指定好配置文件的路径:
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
10、【nacos-proxy主机】当HAProxy服务启动之后会自动占用配置好的9999、9848两个端口,修改防火墙规则: .
firewall-cmd --zone=public --add-port=9999/tcp --permanent
firewall-cmd --zone=public --add-port=9848/tcp --permanent
firewall-cmd --reload
11、【本地系统】通过代理服务的主机地址来访问HAProxy 控制台:
http://nacos-proxy:9999/admin
搭建Nacos服务集群是为了提升“注册与发现”服务的处理性能,但是最终肯定得落实到所有微服务的注册处理上,所以此时就需要通过之前搭建的HAProxy来实现微服务的统一注册。
由于现在仅仅是一台主机(不再打算进行打包处理,而后去配置其他的虚拟机了),所以本次考虑的是在不同的端口上运行相同的微服务,所以最佳的做法是对已有的微服务进行一些复制的处理。
1、【microcloud项目】当前开发的是部门微服务,那么既然是部门微服务,可以考虑将部门微服务的代码复制两套(功能相同,服务的端口以及连接的数据库不同),这个直接在工作目录下运行;
2、【microcloud项目】修改settings.gradle配置文件,追加新复制后的模块名称:
rootProject.name = 'microcloud'
include 'common-api'
include 'provider-dept-8001'
include 'provider-dept-8002'
include 'provider-dept-8003'
include 'consumer-springboot-80'
include 'nacos-example'
3、【microcloud项目】修改build.gradle配置文件,为新增两个模块配置所需的项目依赖,依赖同8001子模块;
4、【IDEA工具】当一切的配置都修改完成之后回到IDEA工具之中,将开始进行项目的自动更新;
5、【provider-dept-*子模块】为每一个子模块定义所需要的数据库脚创建数据库:
DROP DATABASE IF EXISTS yootk8002;
DROP DATABASE IF EXISTS yootk8003;
提示一下:这三个数据库的结构全部是相同的(如果在实际的生产环境过程之中,一般都需要引入后续的MySQL集群),仅仅是一个loc的字段不同(标注的是当前所使用的数据库名称)。.
6、【provider-dept-8002子模块】项目的整体的结构是类似的,但是需要修改一些配置文件和启动类的名称:
application.yml
server: # 服务端配置
port: 8002 # 8002端口
spring:
application: # 配置应用信息
name: dept.provider # 是微服务的名称
datasource: # 数据源配置
type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
driver-class-name: com.mysql.cj.jdbc.Driver # 驱动程序类
url: jdbc:mysql://localhost:3306/yootk8002
启动类
package com.yootk.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StartProviderDept8002Application {
public static void main(String[] args) {
SpringApplication.run(StartProviderDept8002Application.class, args);
}
}
7、【provider-dept-8003子模块】同上一步
8、【provider-dept-8003子模块]考虑到关于Nacos领域模型中集群的概念,建议修改一下此模块的集群名称:
MuyanCluster
9、【Nacos控制台】此时并不打算去更换命名空间了,所以使用已有的命名空间ID继续使用;
10、【provider-dept-*子模块】此时启动当前的应用模块,但是在启动的时候出现了如下的错误信息:
Caused by. com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING .
解决方案:
原因是客户端 gRPC无法和服务端创建连接,请先使用
telnet$inacos.server.address:$(nacos.server.grpc.port)
进行测试,查看网络是否畅通,服务端端口是否已经正确监听。
若服务端没有问题,查看配置是否有误,服务端和客户端的所配置的端口应一致。
若配置也没有问题,查看是否有防火墙或VIP端口转发问题,Nacos2.0的gRPC端口均通过主端口的偏移量计算产生,因此端口转发也需要满足该偏移量。
按照官方的说法,你此时的gRPC代理可能出现了问题,最佳的处理形式就是使用telnet做一个grpc的代理测试。
11、【本地系统】使用telnet做一个连接测试:telnet nacos-server 9848
在新版本的Nacos里面如果要是使用的是 http 型的代理是无法继续成功的
12、【nacos-proxy主机】修改 haproxy配置文件(改变协议):vi /usr/local/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
nbproc 1
maxconnrate 300
maxcomprate 300
maxsessrate 500
chroot /usr/local/haproxy #部署路径
pidfile /usr/local/haproxy/haproxy.pid #pid文件
maxconn 30000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /usr/local/haproxy/stats
defaults
mode tcp
log global
option dontlognull
option redispatch
option http-use-htx
option logasap
option tcplog
retries 3
#timeout http-request 100s
timeout queue 1m
timeout connect 5m
timeout client 5m
timeout server 5m
timeout connect 5m
timeout http-keep-alive 100s
timeout check 10s
maxconn 100000
listen admin_stats
stats enable
bind 0.0.0.0:9999 #监控端口设置
mode http
log global
maxconn 10
stats uri /admin #登录监控子路径配置
stats realm welcome\ Haproxy
stats auth admin:admin #监控的账号密码
stats admin if TRUE
option httplog
stats refresh 30s
stats hide-version
frontend nacos_cluster
bind :9848
mode tcp
log global
option tcplog
option dontlognull
option nolinger
maxconn 8000
timeout client 30s
default_backend nacos_cluster_nodes
backend nacos_cluster_nodes
mode tcp
server nacos-a nacos-cluster-a:9848 check
server nacos-b nacos-cluster-b:9848 check
server nacos-c nacos-cluster-c:9848 check
13、【[Nacos控制台】此时分别启动部门微服务集群之中的其他的微服务,这样就可以在控制台见到如下的信息
14、【provider-dept*子模块】按照现在的配置是通过了代理服务实现了最终微服务的注册,但是现实的开发中万一不希望配置这样的HAProxy的代理,那么也可以直接写上全部的Nacos节点。
为了解决当前可能存在的“分区容错性”的设计思想,我们在整个的项目架构之中引入了多个 Nacos服务节点,而这多个Nacos服务节点彼此之间所保存的数据是相同的,但是毕竟在整个的处理之中是向一个Nacos节点进行注册数据处理的,可是这些数据却可以自动的同步到其他的节点。
引入Nacos服务集群的可以提高服务注册与发现的处理性能,然而在实际的Nacos运行过程之中,每一个Nacos数据节点都只会保存自己的配置数据,由于集群中的每个节点都需要满足数据的修改与获取的功能需求,所以就需要将集群中的节点数据进行自动同步处理,即:某一个节点数据发生改变时将同步到其他节点。
除了一些无法遇见的外力之外,一般情况下很少会出现完全崩溃的可能性(突然出现了某些热点的话题,用户蜂拥而至),像机房停电、网络损坏等等。虽然通过若干个节点可以实现数据的分区存储,但是这若干个节点之间毕竟要有数据同步的需要,所以此时在进行数据处理时就存在有两种实现原则:一致性原则(Consistency、简称“C原则")、可用性原则(Availability、简称“A原则")
1、CP原则:一致性原则+分区容错性原则.
CP原则属于强一致性原则,要求所有节点可以查询到的数据随时随刻都保持一致(同步中的数据不可查询),即:若干个节点形成一个逻辑的共享区域,某一个节点更新的数据都会立即同步到其它数据节点之中,当数据同步完成后才能返回成功的结果,但是在实际的运行过程中网络故障在所难免,如果此时若干个服务节点之间无法通讯时就会出现错误,从而牺牲了可用性原则(A原则)。.
在Nacos中的C原则实现依靠的是Raft算法,在Raft将一致性算法分为了几个部分,包括领导选取(Leader Selection)、日志复制(Log Replication)、安全(Safety),并且使用了更强的一致性来减少了必须需要考虑的状态。在Raft算法中将服务端节点划分为三种不同的状态(或者称为角色):
1·领导者(Leader):负责客户端交互以及日志复制,在同一时刻的集群环境中只最多存在一个Leader;
2·跟随着(Follower):被动请求的节点,跟随Leader实现数据同步;
3·候选人(Candidate):一个临时的角色,只存在于Leader选举阶段,某个节点要想成为Leader,就需要发出投票请求,同时自己也将变为Candidate状态,如果选举成功则变为Leader,否则退回为Follower。.
CP缺点:
是一个强关联的操作形式,所以一旦有某些节点出现了问题之后,所带来的最终的问题就是整个的数据更新失败,如果您仅仅是在一个机房内,那么CP模式没有任何的问题,但是一旦要跨机房(一个在青岛,一个在西藏);
2、AP原则:可用性原则+分区容错性原则
AP原则属于弱一致性原则,在集群中只要有存沽的节佘那么所反达术DT所有销小即中以N到理操作中即便某些节点没有成功的实现数据同步也返回成功,这样就牺牲一致性原则(C原则)。.
AP使用形式:
对于数据的同步一定会发出指令,但是最终的节点是否真的实现了同步,并不一定肯定,可是却可以及时的得到数据更新成功的响应,可以应用在网络环境不那么好的场景了。在Nacos 中的AP原则实现主要依靠的是 Distro协议实现,该协议是阿里私有协议。在该协议中不需要把数据存储到磁盘或者数据厍之中,因为临时数据通常会和服务器保持有一个session 会话,只要该会话存在,数据就不会消失。在Distro 协议中服务端接收到数据后,会由服务端的负责节点实现数据写入后返回,而后台会将这些数据异步发送给其他节点。
阿里在进行Nacos设计的时候充分的考虑到了市场化的运作(市面上大多都是以单一的实现形式为主的,例如:ZooKeeper使用的是CP、而Eureka采用的是AP),在nacos中提供了两种模式的动态切换。.
切换为CP模式:
curl -X PUT "nacos-proxy:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP&username=nacos&password=nacos"
切换为AP模式:
curl -X PUT "nacos-proxy:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=AP&username=nacos&password=nacos"
这种模式调整之前请一定要区分出您所应用的项目的场景,而后根据场景确定好后就别总是随机修改了。