溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Alibaba之Nacos詳解

發(fā)布時(shí)間:2020-07-09 06:51:13 來源:網(wǎng)絡(luò) 閱讀:1307 作者:Java月亮呀 欄目:編程語(yǔ)言

上個(gè)月最后一天的凌晨,Spring Cloud Alibaba 正式入駐了 Spring Cloud 官方孵化器,并在 maven 中央庫(kù)發(fā)布了第一個(gè)版本。

目前 Spring Cloud Alibaba 還只能算是預(yù)覽版吧,里邊的坑肯定不少,不過我還是決定試試,看看 Alibaba 到底靠譜不靠譜。

Alibaba之Nacos詳解

一、Spring Cloud Alibaba

目前 Spring Cloud Alibaba 項(xiàng)目還處于 Spring Cloud 官方孵化器中,打開它 Github 的就能看到 “親切” 的中文文檔。

它目前只有三個(gè)組件:

  • Sentinel:把流量作為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性。

  • Nacos:一個(gè)更易于構(gòu)建云原生應(yīng)用的動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái)。

  • AliCloud OSS: 阿里云對(duì)象存儲(chǔ)服務(wù)(Object Storage Service,簡(jiǎn)稱
    OSS),是阿里云提供的海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù)。您可以在任何應(yīng)用、任何時(shí)間、任何地點(diǎn)存儲(chǔ)和訪問任意類型的數(shù)據(jù)。

看官方路線圖上講后邊還會(huì)增加:

  • Dubbo:Apache Dubbo? (incubating) 是一款高性能 Java RPC 框架。

  • RocketMQ:Apache RocketMQ? 基于 Java 的高性能、高吞吐量的分布式消息和流計(jì)算平臺(tái)。

  • Schedulerx:阿里中間件團(tuán)隊(duì)開發(fā)的一款分布式任務(wù)調(diào)度產(chǎn)品,支持周期性的任務(wù)與固定時(shí)間點(diǎn)觸發(fā)任務(wù)。

  • AliCloud SLS:針對(duì)日志類數(shù)據(jù)的一站式服務(wù),在阿里巴巴集團(tuán)經(jīng)歷大量大數(shù)據(jù)場(chǎng)景錘煉而成。您無需開發(fā)就能快捷完成日志數(shù)據(jù)采集、消費(fèi)、投遞以及查詢分析等功能,提升運(yùn)維、運(yùn)營(yíng)效率,建立 DT 時(shí)代海量日志處理能力。

從數(shù)量上來看,Alibaba 的組件數(shù)量和目前 Netflix 的相比少了一多半,但是仔細(xì)看看各組件的功能描述,也就明白了。在沒真正上手之前,我個(gè)人先大膽猜測(cè)一下:

  • Nacos = Eureka/Consule + Config + Admin
  • Sentinel = Hystrix + Dashboard + Turbine
  • Dubbo = Ribbon + Feign
  • RocketMQ = RabbitMQ
  • Schedulerx = Quartz
  • AliCloud OSS、AliCloud SLS 這三個(gè)應(yīng)該是獨(dú)有的
    鏈路跟蹤(Sleuth、Zipkin)不知道會(huì)不會(huì)在 Sentinel 里
    以上只是猜測(cè),待我從坑里爬出來之后再回來更新。也歡迎大家一起交流探討~
    這里我就先試試 Nacos。

二、Nacos

Alibaba之Nacos詳解

這是 Nacos 的架構(gòu)圖,可以看到它確實(shí)是融合了服務(wù)注冊(cè)發(fā)現(xiàn)中心、配置中心、服務(wù)管理等功能,和我之前猜想的它是 Eureka/Consule + Config + Admin 的合體差不多。

另外通過官方文檔發(fā)現(xiàn),Nacos 除了可以和 Spring Cloud 集成,還可以和 Spring、SpringBoot 進(jìn)行集成。

不過我們只關(guān)注于 Spring Cloud,別的就略過了,直接上手吧~

工程的目錄結(jié)構(gòu)如下:

alibaba
├── nacos-config
│   ├── pom.xml
│   └── src
├── nacos-consumer
│   ├── pom.xml
│   └── src
├── nacos-provider
│   ├── pom.xml
│   └── src
└── pom.xml

首先引入 Spring Cloud Alibaba 的 BOM

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/>
</parent>
<properties>
    <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    <spring-cloud-alibaba.version>0.2.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <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>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

這里版本號(hào)有坑,文檔上說和 Spring Boot 2.0.x 版本兼容,但是實(shí)測(cè) 2.0.6.RELEASE 報(bào)錯(cuò)

java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable

三、Nacos Server

在使用 Nacos 之前,需要先下載 Nacos 并啟動(dòng) Nacos Server。

Nacos Server 有兩種運(yùn)行模式:

  • standalone
  • cluster

不論哪種方式吧,都需要先去?https://github.com/alibaba/nacos/releases?下載最新的 release 包,然后解壓,以 nacos-server-0.4.0.zip 為例

unzip nacos-server-0.4.0.zip
cd nacos

1、standalone 模式

此模式一般用于 demo 和測(cè)試,不用改任何配置,直接敲以下命令執(zhí)行

sh bin/startup.sh -m standalone

Windows 的話就是

cmd bin/startup.cmd -m standalone

然后從?http://localhost:8848/nacos/index.html?進(jìn)入控制臺(tái)就能看到如下界面了

Alibaba之Nacos詳解

2、cluster 模式

集群模式需要依賴 MySQL,然后改兩個(gè)配置文件:

conf/cluster.conf
conf/application.properties

具體怎么改,在這里就先不展開了。我們先用 standalone 模式擼起來,享受 coding 的快感,然后再慢慢轉(zhuǎn)到 cluster 上邊。

四、配置管理

在 nacos/pom.xml 里添加依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

啟動(dòng)類不用修改:

@SpringBootApplication
public class NacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class, args);
    }
}

修改 bootstrap.yml

spring:
  application:
    name: nacos
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848

注意:必須是寫在 bootstrap.yml 中,配置在 application.yml 中不行,啟動(dòng)報(bào)錯(cuò)

java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.application.name' in value "${spring.application.name}"

至于 bootstrap.yml 和 application.yml 的區(qū)別,之前講過這里就不贅述了。

添加一個(gè) Endpoint 便于觀察

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {

    @Value("${useLocalCache:false}")
    private boolean useLocalCache;

    @RequestMapping("/get")
    public boolean get() {
        return useLocalCache;
    }
}

注意一定要加@RefreshScope注解

小心!此處有坑!

這時(shí)候先別急著啟動(dòng) NacosConfigApplication 的,需要需要通過調(diào)用 Nacos Open API 往 Nacos Server 里發(fā)布一個(gè)配置。dataId 為 nacos.properties,內(nèi)容為useLocalCache=true

curl -X "POST" "http://127.0.0.1:8848/nacos/v1/cs/configs" \
     -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \
     --data-urlencode "dataId=nacos.properties" \
     --data-urlencode "group=DEFAULT_GROUP" \
     --data-urlencode "content=useLocalCache=true

dataId 的完整格式如下:

prefix?prefix?{spring.profile.active}.${file-extension}
  • prefix 默認(rèn)為?spring.application.name?的值,也可以通過配置項(xiàng) spring.cloud.nacos.config.prefix來配置。
  • spring.profile.active 即為當(dāng)前環(huán)境對(duì)應(yīng)的 profile,詳情可以參考 Spring >Boot 文檔。 注意:當(dāng) spring.profile.active 為空時(shí),對(duì)應(yīng)的連接符 - >也將不存在,dataId 的拼接格式變成 prefix.prefix.{file-extension}
  • file-exetension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項(xiàng) spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。

然后啟動(dòng) NacosConfigApplication,從啟動(dòng)日志里能看到

Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='nacos.properties'}]}

如果 propertySources 里邊是空的,那抱歉,你掉到坑里邊了。 如果你能看到之前發(fā)布的 dataId,那恭喜,請(qǐng)求?http://localhost:8080/config/get?就可以看到返回內(nèi)容 true 了。

再次調(diào)用 Nacos Open API 修改內(nèi)容為useLocalCache=false

再次訪問?http://localhost:8080/config/get?,此時(shí)返回內(nèi)容為false,說明程序中的useLocalCache值已經(jīng)被動(dòng)態(tài)更新了。

當(dāng)然,以上手動(dòng)調(diào)用 Nacos Open API 的方式也可以通過 Nacos Console 的可視化界面來操作

Alibaba之Nacos詳解

另外我們可以查詢配置的歷史記錄并能快速回滾

Alibaba之Nacos詳解

還能查詢到某個(gè)配置當(dāng)前的被監(jiān)聽狀態(tài)(這里的分頁(yè)有些 bug)

Alibaba之Nacos詳解

五、數(shù)據(jù)源

經(jīng)過了上邊的一些簡(jiǎn)單操作,我們已經(jīng)可以正常使用 Nacos 配置中心了。
但是不知道你有沒有想過:配置數(shù)據(jù)是存在哪里呢?

我們沒有對(duì) Nacos Server 做任何配置,那么數(shù)據(jù)只有兩個(gè)位置可以存儲(chǔ):

  • 內(nèi)存
  • 本地?cái)?shù)據(jù)庫(kù)

如果我們現(xiàn)在重啟剛剛在運(yùn)行的 Nacos Server,會(huì)發(fā)現(xiàn)剛才加的 nacos.properties 配置還在,說明不是內(nèi)存存儲(chǔ)的。

這時(shí)候我們打開NACOS_PATH/data,會(huì)發(fā)現(xiàn)里邊有個(gè)derby-data目錄,Derby 是 Java 編寫的數(shù)據(jù)庫(kù),屬于 Apache 的一個(gè)開源項(xiàng)目。我們的配置數(shù)據(jù)現(xiàn)在就存儲(chǔ)在這個(gè)庫(kù)中。

Derby 我并不是很熟悉,那能不能將數(shù)據(jù)源改為我們熟悉的 MySQL 呢?當(dāng)然可以了。

注意:不支持 MySQL 8.0 版本

這里我以本地運(yùn)行的 MySQL 為例:

創(chuàng)建一個(gè)名為nacos_config的 database

將NACOS_PATH/conf/nacos-mysql.sql中的表結(jié)構(gòu)導(dǎo)入剛才創(chuàng)建的庫(kù)中,這幾張表的用途就自己研究吧

修改NACOS_PATH/conf/application.properties,加入 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=root

創(chuàng)建cluster.conf,填入要運(yùn)行 Nacos Server 機(jī)器的 ip

192.168.100.155
192.168.100.156

我就是運(yùn)行個(gè) demo,沒有多余機(jī)器來組建集群怎么辦呢?

其實(shí)不用虛擬機(jī),直接只填一個(gè)本地地址也是可以的(僅限于配置管理,服務(wù)發(fā)現(xiàn)不行)。

這里有兩個(gè)坑:

Nacos Server 的數(shù)據(jù)源是用 Derby 還是 MySQL 完全是由其運(yùn)行模式?jīng)Q定的:

standalone 的話僅會(huì)使用 Derby,即使在 application.properties 里邊配置 MySQL 也照樣無視;
cluster 模式會(huì)自動(dòng)使用 MySQL,這時(shí)候如果沒有 MySQL 的配置,是會(huì)報(bào)錯(cuò)的。
官方提供的 cluster.conf 示例如下

#it is ip
#example
10.10.109.214
11.16.128.34
11.16.128.36

從習(xí)慣來看,這個(gè)#號(hào)后邊的應(yīng)該就是注釋的,但是抱歉哦,必須刪掉,否則下面的異常就撲面而來

Caused by: java.lang.NumberFormatException: For input string: "it is ip:0"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Long.parseLong(Long.java:589)
  at java.lang.Long.parseLong(Long.java:631)
  at com.alibaba.nacos.naming.core.DistroMapper.onServerStatusUpdate(DistroMapper.java:125)
  at com.alibaba.nacos.naming.core.DistroMapper.init(DistroMapper.java:100)
  at com.alibaba.nacos.naming.core.DistroMapper.<clinit>(DistroMapper.java:65)
  ... 79 common frames omitted

以上配置結(jié)束后,運(yùn)行 Nacos Server 就能看到效果了。

除了 MySQL 的數(shù)據(jù)表發(fā)生了變化,我們會(huì)發(fā)現(xiàn)NACOS_PATH/data下的目錄結(jié)構(gòu)也發(fā)生了變化,多了config-data/DEFAULT_GROUP/nacos_config這么一個(gè)文件,里邊的內(nèi)容就是我們的配置

useLocalCache=true

這是容錯(cuò)呢?還是緩存呢?只有等看過源碼才知道了。

六、服務(wù)發(fā)現(xiàn)

服務(wù)注冊(cè)中心和服務(wù)發(fā)現(xiàn)的服務(wù)端都是由 Nacos Server 來提供的,我們只需要提供 Service 向其注冊(cè)就好了。

首先我們先將 Nacos Server 由偽分布式改為 standalone 模式,原因后邊再說吧。

這里模擬提供兩個(gè) service:provider 和 consumer

alibaba
├── nacos-provider
│   ├── pom.xml
│   └── src
└── nacos-consumer
│   ├── pom.xml
│   └── src
└── pom.xml

首先在 provider 和 consumer 的 pom 添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在兩者的 bootstrap.yml 中添加配置

1、provider

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 18080
consumer

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  port: 18081

使用 Spring Cloud 的原生注解 @EnableDiscoveryClient 開啟服務(wù)發(fā)現(xiàn)

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosProviderApplication.class, args);
    }
}

提供 Endpoint 以供訪問


@RestController
@RequestMapping("/echo")
public class EchoController {

    @RequestMapping(value = "/{string}", method = RequestMethod.GET)
    public String echo(@PathVariable String string) {
        return "Hello Nacos Discovery " + string;
    }
}

2、Consumer

在 NacosConsumerApplication 中集成 RestTemplate 和 Ribbon

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
  return new RestTemplate();
}

提供 Controller

@RestController
@RequestMapping("/echo")
public class TestController {

    private final RestTemplate restTemplate;

    @Autowired
    public TestController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @RequestMapping(value = "/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://nacos-provider/echo/" + str, String.class);
    }

}

分別啟動(dòng) NacosProviderApplication 和 NacosConsumerApplication ,調(diào)用?http://localhost:18080/echo/windmt?和?http://localhost:18081/echo/windmt?,返回內(nèi)容均為 Hello Nacos Discovery windmt,說明服務(wù)發(fā)現(xiàn)成功了。

這時(shí)候查看 Nacos Console 也能看到已注冊(cè)的服務(wù)列表及其詳情

Alibaba之Nacos詳解

Alibaba之Nacos詳解

現(xiàn)在來講一下為什么前邊要將 Nacos Server 由偽分布式再改為 standalone 模式。

單個(gè)節(jié)點(diǎn)的 Nacos Server 偽分布式在配置管理運(yùn)行的好好的,但是到了服務(wù)發(fā)現(xiàn),它就失效了。

通過 log 可以發(fā)現(xiàn)一些端倪,單節(jié)點(diǎn)的在選主的時(shí)候,無法正確選出 leader

==> logs/naming-raft.log <==
2018-11-13 16:38:56,424 INFO leader timeout, start voting,leader: null, term: 1

從而導(dǎo)致 Client 無法正常注冊(cè)

java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([127.0.0.1:8848]) tried
    at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:339) ~[nacos-client-0.3.0.jar:na]
    at com.alibaba.nacos.client.naming.net.NamingProxy.reqAPI(NamingProxy.java:272) ~[nacos-client-0.3.0.jar:na]
    at com.alibaba.nacos.client.naming.net.NamingProxy.registerService(NamingProxy.java:171) ~[nacos-client-0.3.0.jar:na]
    at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:161) ~[nacos-client-0.3.0.jar:na]
    ... ...

七、小結(jié)

當(dāng)今年年初 Dubbo 進(jìn)入 Apache 孵化器的時(shí)候,就有預(yù)感阿里要與 Spring Cloud 結(jié)緣。只是沒想到這么快。

如今 Spring Cloud Alibaba 已經(jīng)進(jìn)入了 Spring Cloud 官方孵化器,相信等不了多久也就能正式發(fā)布了。雖然大家在生產(chǎn)環(huán)境必然還不會(huì)這么快速地接入,但是總歸是多了一種選擇。

而 Nacos 作為微服務(wù)核心的服務(wù)注冊(cè)與發(fā)現(xiàn)中心,讓大家在 Eureka 和 Consule 之外有了新的選擇,開箱即用,上手簡(jiǎn)潔,暫時(shí)也沒發(fā)現(xiàn)有太大的坑。但將配置中心融合也融合進(jìn)來是好是壞,這個(gè)我先按下不表。

總而言之,Spring Cloud Alibaba 的入駐對(duì)于 Spring Cloud 生態(tài)總歸是好的~

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI