nacos简介
官方首页用了一句话来概况描述nacos
是什么:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
,说明nacos
是一个集注册中心和配置中心的为一体的服务平台。类似与spring-cloud
中将config-server
与eureka-server
两大功能打包到了一起,当然,nacos
功能可能要远远比他们的组合更为强大。我们分别从nacos
服务端与客户端来简单入门使用。
nacos-server使用
nacos-server
如最新的zipkin
一样都推荐使用官方编译包直接下载使用。下载地址:https://github.com/alibaba/nacos/releases,以下我们使用nacos
的1.1.0
版进行简单的配置。
默认情况下启动用会采用单例模式,比如我们要在windows
环境搭建单个节点来进行测试等,为了减少工作量可能会采用单例模式(生产环境官方推荐集群部署)。
数据持久化
默认单例情况下nacos
使用derby
内存型数据库,这样一来我们就无法通过外部修改对应的数据库配置以及信息无法持久化保存,所以一般我们都会切换到数据库。
首先我们创建一个用于持久化的mysql
库nacos-config
,再使用官方提供的conf
目录下的nacos-mysql.sql
脚本进行数据库初始化。
接下来是在conf/application.properties
文件中配置数据库相关配置,示例
#配置nacos日志路劲
nacos.logs.path=D:/nacos/Logs
#tomcat访问日志
server.tomcat.accesslog.directory=D:/nacos/Logs
#设置此参数和数据库连接后才能使用数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
配置主要的功能:
- 1、修改日志输出地址。
- 2、持久化的数据库连接。
当使用多库方式是db.num
来配置为使用的库的个数,然后增加db.url.n=xxxx
的方式配置不同库的访问url
信息
详情可参考conf
目录目录下的application.properties.example
文件。
用户信息修改
nacos-server
默认使用的用户名和密码为nacos/nacos
,一般生产环境我们都会做修改,操作方式是修改nacos-config
数据库中users
表中的username
和paswword
字段,如果同步修改了用户名还需要修改roles
表中表中的username
。
这里需要特别注意的是密码修改,nacos
为了密码安全使用了加密(该加密算法可以让每次对同样的数据进行加密后的结果都不一样,而且无法解密),所以我们要修改的时候,也需要使用加密算法加密后在存储。spring
为我们提供了改算法的实现,我们只需要引入如下jar
包依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
<scope>compile</scope>
</dependency>
接下来我们只需要调用如下代码即可加密密码和进行密码校验
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String newPassword="新密码";
//调用encode方法加密密码
String encodedPaswword = encoder.encode(newPassword);
System.out.println(encodedPaswword);
//调用matches方法确认密码是否正确
System.out.println(encoder.matches(newPassword,encodedPaswword));
在windows
环境我们直接使用startup.cmd
和shutdown.cmd
即可控制nacos-server
的启动和停止。如果是linux
环境则使用对应的同名的.sh
文件来控制。但是linux
下默认采用集群方式,如果使用单例方式需要在命令中指定单例模式,如下
sh startup.sh -m standalone
值得注意的是在之前的版本中,默认并不会采用后台模式启动nacos
,这个时候需要自己去修改脚本增加nohup
命令或者使用其他如下方式
nohup sh startup.sh -m standalone &
集群配置
生产环境为了高可用,官方推荐使用3台以上的的nacos
,为了方便我们再一台机子配置三个nacos-server
节点来搭建伪集群。我们的内网地址为172.18.93.180
我们给程序分别配置端口为8847
、8848
、8849
,数据连接配置相同。此外我们需要配置conf
目录下的cluster.conf
来配置三个节点的位置
172.18.93.180:8847
172.18.93.180:8848
172.18.93.180:8849
这样配置后,我们分别启动是三个节点的startup.sh
脚本,启动没有报异常后,我们可以登录http://外网IP:8847/nacos
。点击集群管理->节点列表
,我们可以看到是哪个节点的信息
小槽点
- 1、日志输出
有点小吐槽的是,nacos
的日志输出非常之多,而且不支持在配置文件application.properties
中做精细化的开关或者级别配置。唯一可以在应用配置文件中配置的是nacos.logs.path
来配置日志输出路劲,默认是获取nacos.home
变量的路劲,并在路劲下创建logs
文件夹来存储,而nacos.home
是在startup.sh
脚本中传入的,最终获取的是程序所在目录下。而早期版本甚至会在系统用户目录下创建logs
和nacos
两个目录来保存日志,1.1.0
版本默认会在当前程序的根目录下创建logs
来目录来保存日志。
其次,我配置了nacos.logs.path
参数启动后,仍旧有日志会打印到${nacos.home}/logs
目录下主要是cmdb-main.log
,nacos_gc.log
,start.out
等。其次在linux
用户根目录下还会创建一个nacos/logs
的目录保存config.log
以及naming.log
日志。
而我们自定义的日志输出路劲日志也非常之多,特别是tomcat
的web
访问日志access_log
,客户端越多,日志越多,我写了10个客户端左右,不跑业务每天的日志量也是在80M
到300M
左右不等
另外,nacos
的logback
配置文件nacos-logback.xml
中对各类日志的块大小分割保存并未设置压缩,当客户端太多的时候日志量非常之大,并且各个日志的分割标准也不相同,最大的2G
分割,最小的20M
分割。
- 2、
JVM
内存大小
nacos
的JVM
参数大小是写死在了shell
脚本中,而且集群情况下,为了避免频繁GC
,设置的最小和最大内存为2G
,相当于说只要启动一份nacos-server
程序,就会占用掉2G的内存空间,即时可能它自身根本用不到(当然这里本人并未测试过nacos-server
程序使用内存的需求量,大内存可以直接忽略),之前我使用eureka-server
做注册中心时512M
跑几十个客户端程序,没有任何问题。建议在application.properties
中增加上调整JVM
内存大小的参数。方便配置修改,而不是直接修改shell
脚本
个人觉得既然推荐采用官方编译版本直接运行,那么应该提供更多的应用参数配置以达到开箱即用的效果
- 3、
shutdown.sh
脚本
默认的shutdown.sh
脚本脚本在集群情况下执行会将同一台机子上的所有节点都关闭掉,因为shell
命令查找的是有nacos.nacos
标记的pid
,当搭建伪集群的情况,这种情况就非常危险了。一旦执行脚本所有nacos
节点全部关闭了。个人觉得即使不考虑采用伪集群方案,为了避免风险shutdown.sh
脚本都应该默认关闭当前目录下的节点更为安全,例如将原脚本更改为
#!/bin/sh
# Copyright 1999-2018 Alibaba Group Holding Ltd.
# Licensed 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.
BIN_DIR=$(cd `dirname $0`;pwd)
#获取项目根目录
DEPLOY_DIR=$(cd ${BIN_DIR};cd ..;pwd)
pid=`ps ax | grep -i $DEPLOY_DIR |grep java | grep -v grep | awk '{print $1}'`
if [ -z "$pid" ] ; then
echo "No nacosServer running."
exit -1;
fi
echo "The nacosServer(${pid}) is running..."
kill ${pid}
echo "Send shutdown request to nacosServer(${pid}) OK"
nacos-client使用
nacos-client
顾名思义是与nacos-server
程序进行交互的客户端核心包,可以支持自定义方式配置。但是我们一般情况下都是采用spring-cloud-alibaba
或者dubbo
组件来调用,所以一般采用直接通过API
来配置调用的方式。接下来我们以spring-cloud
环境为例进行配置。
引入组件依赖
首先,我们需要明确的是nacos-server
是同时具备注册中心与配置中心的功能,其中配置中心功能并非必须使用的。官方提供了两个maven
依赖来帮我们实现自动化装配,maven
坐标如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
看名称很容易理解spring-cloud-starter-alibaba-nacos-discovery
是注册中心功能的客户端集成,spring-cloud-starter-alibaba-nacos-config
是配置中心功能的客户端集成。当然,这里没有代入任何版本号,因为都是采用spring-boot
框架,所以官方也为我们提供类类似spring-cloud
一样的依赖申明包spring-cloud-alibaba-dependencies
,我们可以像引入spring-cloud-dependencies
一样引入它,正确的做法是在内部framework
框架包中分别引入两个组件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
由这两个组件分别为我们规范和申明spring-cloud
组件和nacos
相关组件,而版本申明我们在maven
变量中配置如下
<properties>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>0.9.0.RELEASE</spring-cloud-alibaba.version>
</properties>
由于整个项目使用的spring-boot
版本,所以按照老规矩,我们使用maven
在继承的方式在项目中引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/>
</parent>
这样就基本上具备了正确引入组件版本的条件了。
最新消息Spring Cloud
官方修改了各个第三方项目的发布策略,第三方spring-cloud
项目需要自身维护。所以spring-cloud-alibaba
组件将从0.9.1
版本开始将原org.springframework.cloud
包更换为com.alibaba.cloud
,而原来的spring-cloud-starter-alibaba-xxx
格式的artifactId
将会变更为alibaba-xxx-spring-cloud-starter
。详情见官方说明
参数配置
如果要使用nacos
配置中心功能,那么如同spring-cloud-starter-config
组件使用一样,需要在bootstarp.properties
(如果采用yaml
方式则在bootstarp.yml
中配置)中增加配置中心地址,这样才能正常使用配置中心功能。
#config center
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
如果nacos
集群,那么这里可以采用逗号分隔配置多个配置中心地址。
接下来,我们需要在application.properties
(如果采用yaml
方式则在application.yml
中配置)中配置注册中心地址。
#registry center
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
同理nacos
集群时,可以采用逗号分隔配置多个地址.
其他客户端配置可以通过spring.cloud.nacos.*
开始的配置参数进行配置。
OK,经过前面几步,我们的nacos
客户端程序就可以正常使用了。我们可以正常无差别的使用spring-cloud
中的feign
、ribbon
、hystrix
等组件了。
注意
- 1、
nacos-server
与eureka-server
在客户端处配置不太一样的一点是,客户端不需要在url
上配置对应nacos-server
的用户名和密码,因为服务端对客户单访问的部分url
进行了权限允许,这样一来客户端配置方便了,不需要因为服务端更改了用户名和密码信息而更改配置。但是同样带来的问题是可能收到外部网络的干扰,所以建议将nacos-server
外部访问时指定特定的环境或者IP。 - 2、
nacos
目前的版本发布与spring-cloud-alibaba-dependencies
并不一致,例如截止当前nacos
已经发布了1.0.1
和1.1.0
,但是对一个的spring-cloud-alibaba-dependencies
最新版本是0.9.0.RELEASE
,其引入的nacos-client
版本仍旧为1.0.0
,所以要使用最新的如果要使用最新的nacos-client
需要将spring-cloud-starter-alibaba-nacos-discovery
和spring-cloud-starter-alibaba-nacos-config
中的nacos-client
剔除,然后单独引入nacos-client
依赖,例如:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>[1.0.0,)</version>
</dependency>