天天看點

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>           

繼續閱讀