天天看点

spring-cloud-alibaba组件使用基础入门

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。
  • 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>           

继续阅读