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> 
                            