版本选择
Nacos 1.X 是老版本,将来会停止维护。 建议您使用2.X版本。 请移步到 Nacos2.X相关文档.
您可以在Nacos的release notes中找到每个版本支持的功能的介绍,当前推荐的稳定版本为2.1.1。
https://nacos.io/zh-cn/docs/quick-start.html
https://github.com/alibaba/nacos/releases
解决 Nacos 国内下载速度缓慢的问题
方案 1. 选择相应的版本源码下载
由于各种已知的原因(不可抗力),在国内下载的速度太慢了,记录分享下解决方案。
整体思路:使用国内的 Gitee 上的镜像传送门下载源码、进行本地编译
因为nacos需要依赖java,所以需要提前安装好jdk,官方推荐jdk8,按照要求安装即可,具体安装可以参考:
Linux环境JDK安装
如果部署nacos集群的话,需要通过nginx做集群的负载均衡,nginx的安装可以参考:Centos7 安装nginx
nacos的持久化使用的是MySQL
上面基础环境奠定了以后开始做nacos集群的安装和部署工作。
下载
https://github.com/alibaba/nacos/releases
特别提醒:
这里有个坑需要规避,进入这个下载地址后,不要直接点击后面的zip或者tar.gz下载,
需要点击对应版本号,进入详情页面,拉到底部下载,下载的包名是nacos-server-2.0.3.tar.gz。
如果直接点击后面的zip或者tar.gz下载,下载的包是nacos-2.0.2.tar.gz,这个不是编译好的安装包。
上传nacos安装包到服务器上
2.2 解压编译
- 解压下载的压缩包,
- 进入到 Nacos 文件夹,进行编译 命令如下: mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- 可能报错,见文章下方:
- 编译结果如下 编译过程很慢,请耐心等待,编译好的在百度网盘,直接下载
这里可以看到已经编译成功了,并且打好的包的位置也打印出来了。
- 启动验证
4.1 解压 这里把上面的 nacos-server.zip 复制到服务器验证。
unzip nacos-server-$version.zip
或者
tar -xvf nacos-server-$version.tar.gz cd nacos/bin
4.2
启动服务器 Linux/Unix/Mac 启动命令 (standalone 代表着单机模式运行,非集群模式):sh startup.sh -m standalone 如果您使用的是 ubuntu 系统,或者运行脚本报错提示 [[符号找不到,可尝试如下运行:bash startup.sh -m standaloneWindows 启动命令 (standalone 代表着单机模式运行,非集群模式): cmd startup.cmd -m standalone
4.3 登录 nacos 服务控制台验证 在浏览器输入:
http://ip:8848/nacos
用户名 / 密码默认为:nacos/nacos
bin 直接安装
https://blog.csdn.net/millery22/article/details/125564078?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125564078-blog-122182282.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-125564078-blog-122182282.235%5Ev38%5Epc_relevant_sort_base2&utm_relevant_index=2
上传nacos安装包到服务器上
可以通过scp命令将nacos安装包上传到服务器上,命令如下:
scp D:\\nacos-server-2.0.3.tar.gz root@192.168.75.130:/usr/local
解压nacos安装包:
tar -xvf nacos-server-2.0.3.tar.gz
将名称改为nacos-8840
mv nacos nacos-8840
持久化数据库配置
进入nacos-8840/cnof目录下,将Connect URL of DB修改为如下内容:
spring.datasource.platform=mysql
jdbc.DriverClassName=com.mysql.cj.jdbc.Driver ## 如果使用数据库是MySQL8,需要加上此驱动名,否则不用加
db.num=1
db.url.0=jdbc:mysql://192.168.75.128:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
db.user.0=root
db.password.0=123456
将nacos-8840/conf目录下的nacos-mysql.sql文件复制到数据库所在的服务器内,创建名为nacos_config数据库,并在数据库内执行sql脚本文件;
## 复制文件到数据库所在服务器
scp nacos-mysql.sql root@192.168.75.128:/usr/local
## 创建数据库并执行脚本
mysql -uroot -p123456
create datasource nacos_config
use nacos_config
source /usr/local/nacos-mysql.sql
修改集群配置
将nacos-8840/conf目录下的cluster.conf.example文件复制一份并重命名为cluster.conf,修改其内容如下:
## 复制并重命名
cp cluster.conf.example cluster.conf
## 修改内容,将文件内最后三行换成现有的集群ip和端口,如果超过3台依次向后加即可
vim cluster.conf
## 修改后如下:
192.168.75.130:8840
192.168.75.130:8850
192.168.75.130:8860
修改application.properties文件,将server-port修改为8840;
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8840
配置优化点
这个优化点在你的服务器性能较好的情况下,可以不做,我是在单台虚拟机里面部署三个nacos服务,资源紧张,修改一下此配置更放心,进入nacos-8840/bin目录,找到startup.sh文件,将文件中java堆栈的配置修改小一点,这里修改成128m,修改内容JAVA_OPT=“${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m”,具体修改如下:
## 修改前的内容
if [[ "${MODE}" == "standalone" ]]; thenJAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
elseif [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; thenJAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"fiJAVA_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"
fi
## 修改后的内容
if [[ "${MODE}" == "standalone" ]]; thenJAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
elseif [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; thenJAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"fiJAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
复制集群节点
上面已经完成端口为8840节点的配置,接下来将nacos-8840复制两份出来,并重命名:
cp -R nacos-8840 nacos-8850
cp -R nacos-8840 nacos-8860
修改8850和8860节点的配置,很简单,将application.properties文件中的server-port做对应的修改即可。
启动集群服务
分别执行三个节点的startup.sh命令:
# 在/usr/local目录下执行
./nacos-8840/bin/startup.sh
./nacos-8850/bin/startup.sh
./nacos-8860/bin/startup.sh
检查节点是否已经启动成功:
netstat -ano | grep 8840
netstat -ano | grep 8850
netstat -ano | grep 8860
配置nginx负载均衡
主要配置负载和监听,配置内容如下:
## 在http下配置负载
upstream nacoscluster { server 127.0.0.1:8840;server 127.0.0.1:8850;server 127.0.0.1:8860;
}
http{## 在server内配置监听server {listen 8848; ## 监听8848端口 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #root html; #index index.html index.htm; proxy_pass http://nacoscluster; ## 代理到负载上 }}
}
stream {upstream nacosgrpc {server 127.0.0.1:9840;server 127.0.0.1:9850;server 127.0.0.1:9860;}server {listen 9848; # 这里监听的端口是和http内监听的端口对应+1000得到的(8848+1000)proxy_pass nacosgrpc;}
}
配置完成后启动或者重启nginx即可。
访问nacos页面
在浏览器中输入:http://192.168.75.130:8848/nacos,会弹出登录页面,默认用户名和密码都是nacos,到此集群部署大功告成。
存在的坑点
官方解释
nacos2.0版本相比1.x新增了gRPC的通信方式,因此需要增加两个端口,新增端口在配置的主端口(server.port)基础上,进行一定的偏移量自动生成。偏移规则:
端口 与主端口偏移量 描述
9848 1000 客户端gRPC请求服务端端口,用于客户端服务发起连接和请求
9849 1001 客户端gRPC请求服务端端口,用于服务间同步等
改动引起的变化说明
因为这个改动,在一台机器上部署nacos集群时,不能将运行端口设置为连续端口,比如:8840、8841、8842,否则会发生端口冲突。
运行在8840端口nacos服务实际上会占用8840、8940、8941三个端口;
运行在8841端口nacos服务实际上会占用8841、8941、8942三个端口;
运行在8842端口nacos服务实际上会占用8842、8942、8943三个端口。
另一个问题
在官方文档中,还有一个很重要的说明,是加粗的内容:
使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。
正常Nacos都是使用集群的模式,需要使用nginx做转发,这里就需要在nginx配置文件中增加一些配置,如果继续使用nacos 1.x的配置,在启动项目的时候会出现报错。详细说明如下。
代码中nacos的配置信息
spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: 192.168.75.130:8848
这个配置是在nacos 1.x的时候是没有问题的,但是如果你nacos更新到了2.x,也没有修改nginx配置文件中grpc的转发,这里就会出现启动项目报错问题。报错信息:Request nacos server failed。这里提到,但是这里没有需要修改的,需要修改的在nginx内。
nginx需要做的修改
首先是要求你的nginx中包含stream模块,如何检查你的nginx是否安装了stream模块呢,用下面的命令:
/usr/local/nginx/sbin/ningx -V
打印出来的信息如下:
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
看下面的config arguments信息,如果包含–with-stream,那么就没有问题,stream模块已经包含在内。我这里就是没有这个模块,需要安装。采用我这种模式安装,首先注意一定要把nginx内的配置文件备份一下。
# 第一步,注意这里的--prefix=/usr/local/nginx根据你的实际情形来
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream
# 第二步make && make install
知道为啥让你备份了吧,这两步执行相当于重新装了一下。安装好以后,执行/usr/local/nginx/sbin/ningx -V命令,输出的结果就有–with-stream啦。
到现在就可以修改nginx的配置啦,其实在上面的安装过程已经体现了,在这里重点再提一下。配置内容如下。需要注意的是stream需要在http外,和http同级。
stream {upstream nacosgrpc {server 127.0.0.1:9840;server 127.0.0.1:9850;server 127.0.0.1:9860;}server {listen 9848; # 这里监听的端口是和http内监听的端口对应+1000得到的(8848+1000)proxy_pass nacosgrpc;}
}
源码安装
MAVEN - 如果没有License头会报错(apache-rat-plugin):Too man错误描述
Failed to execute goal org.apache.rat:apache-rat-plugin:0.13:check (rat-check) on project atlas-webapp:
Too many files with unapproved license: 6 See RAT report
错误原因
由于添加了apache-rat-plugin插件,所以项目中新添加的文件如果没有加上License头,会在检查时报错。
解决方案
方案一 不推荐
在每个新添加的文件中,加上License头。
/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License. You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
方案二
文件打包时跳过检查,添加: -Drat.skip=true
mvn clean package -Drat.skip=true -DskipTests -Denforcer.skip=true -Pdist,embedded-hbase-solr
方案三 采用
将项目中的插件:apache-rat-plugin 去掉