Spring Cloud Alibaba之服務(wù)發(fā)現(xiàn)組件 - Nacos實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)(二)

前言

  • 前面的文章已經(jīng)說了什么是Spring Cloud Alibaba幻馁,以及為什么選擇使用SCA帜消,這里我們就使用Spring Cloud Alibaba如何完成微服務(wù)的架構(gòu)搭建展開講解潦嘶。
  • 大家都知道作為微服務(wù)項(xiàng)目中一個必不可少的功能就是:服務(wù)的注冊和發(fā)現(xiàn)乏矾,而市面上實(shí)現(xiàn)此功能的技術(shù)有很多谨胞,像Zookeeper帮辟,Eureka鳍徽,consul等蔫巩。
  • 而作為阿里巴巴最新的開源項(xiàng)目之一霹期,Nacos核心定位是“一個更易于幫助構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)叶组、配置和服務(wù)管理平臺”,項(xiàng)目地址:https://nacos.io/zh-cn/

Naco提供了兩個核心功能:服務(wù)注冊與發(fā)現(xiàn)历造,動態(tài)管理配置

1. 服務(wù)注冊與發(fā)現(xiàn)

  • Nacos提供基于DNS和基于RPC的服務(wù)發(fā)現(xiàn)甩十,既能被用來支持https/http的服務(wù)注冊與發(fā)現(xiàn)船庇,也支持RPC如dubbo的服務(wù)注冊與發(fā)現(xiàn)。

  • 與Dubbo使用的zookeeper相比而言侣监,兩者差異還是比較大的鸭轮,zookeeper是一種分布式的協(xié)調(diào)服務(wù),它天生是作為分布式數(shù)據(jù)一致性場景下的解決方案橄霉,所以zookeeper是CP(一致性和分區(qū)容錯性),它犧牲了可用性來保證一致性窃爷,在極端情況下(master選舉期間)服務(wù)會對外停止服務(wù),對于服務(wù)可用要求比較高的系統(tǒng)是難以接受的姓蜂。Nacos是一種去中心話的架構(gòu)按厘,屬于CAP理論里的AP(可用性和分區(qū)容器性)架構(gòu),支持最終一致性钱慢,在分布式服務(wù)發(fā)現(xiàn)與注冊場景下具有很不錯的性能逮京。目前dubbo官方也支持使用Nacos代替zookeeper。

  • 而相比Spring Cloud Eureka來說束莫,Nacos更加強(qiáng)大懒棉。Nacos=Spring Cloud Eureka + Spring Cloud Config.

2. 動態(tài)配置服務(wù)
動態(tài)修改配置并實(shí)時(shí)生效對于服務(wù)端的同學(xué)來說并不陌生,這種服務(wù)能夠讓我們的服務(wù)擁有更多的靈活性览绿,不需要重啟服務(wù)即可做到配置實(shí)時(shí)生效策严,非常適合于“配置優(yōu)先”的服務(wù)開發(fā)。

接下來我們將使用Nacos完成服務(wù)的注冊和發(fā)現(xiàn)功能饿敲。

使用Nacos實(shí)現(xiàn)服務(wù)注冊與發(fā)現(xiàn)

安裝Nacos

下載地址:https://github.com/alibaba/nacos/releases
本文版本:1.0.0

下載完成之后妻导,解壓。根據(jù)不同平臺诀蓉,執(zhí)行不同命令栗竖。

  • Linux/Unix/Mac
    啟動命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式):
    sh startup.sh -m standalone

  • Windows
    啟動命令:
    cmd startup.cmd
    或者雙擊startup.cmd運(yùn)行文件渠啤。

附:startup.sh腳本位于Nacos解壓后的bin目錄下狐肢。

這里主要介紹Spring Cloud與Nacos的集成使用,對于Nacos的高級配置沥曹,后續(xù)再補(bǔ)充, 因?yàn)槲覀冮_發(fā)環(huán)境是window所以才使用第二種方式啟動份名。

啟動完成之后,訪問:http://127.0.0.1:8848/nacos/妓美,可以進(jìn)入Nacos登陸頁面:


如果使用Nacos 0.8.0以上版本僵腺,會出現(xiàn)登錄頁面,默認(rèn)用戶名密碼為:nacos

登陸成功后會進(jìn)入Nacos的服務(wù)管理頁面壶栋,具體如下:


構(gòu)建應(yīng)用接入Nacos注冊中心

在完成了Nacos服務(wù)的安裝和啟動之后辰如,下面我們就可以編寫兩個應(yīng)用(服務(wù)提供者和服務(wù)消費(fèi)者)來驗(yàn)證服務(wù)的注冊與發(fā)現(xiàn)了。

服務(wù)提供者

第一步:創(chuàng)建一個SpringBoot工程贵试,命名為:alibaba-nacos-discovery-server.

第二步:編輯pom.xml琉兜,加入必要的依賴配置凯正,詳細(xì)如下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <!-- spring-cloud-starter-{spring cloud子項(xiàng)目名稱}-[{模板名稱}] -->
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

上述配置主要分三部分:

  • parent: 定義Spring Boot的版本
  • dependencyManagement: Spring Cloud的版本以及Spring Cloud Alibaba的版本 ,由于Spring Cloud Alibaba還未納入Spring Cloud主版本管理豌蟋,所以需要單獨(dú)引入
  • dependencies: 當(dāng)前應(yīng)用需要使用的依賴內(nèi)容廊散。這里新加入了Nacos的服務(wù)注冊與發(fā)現(xiàn)版本模塊: spring-cloud-starter-alibaba-nacos-discovery。 由于 dependencyManagement中已經(jīng)引入了版本梧疲,所以這里就不用指定具體的版本號了允睹。

第三步: 創(chuàng)建應(yīng)用主類,編寫對外提供服務(wù)的測試HTTP接口:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryServerApplication {

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

@SpringBootApplication定義是一個SpringBoot應(yīng)用幌氮,@EnableDiscoveryClient開啟Spring Cloud的服務(wù)注冊與發(fā)現(xiàn)缭受,由于這里引入了spring-cloud-starter-alibaba-nacos-discovery模塊,所以Spring Cloud Common中定義了那些與服務(wù)治理相關(guān)接口將使用Nacos的實(shí)現(xiàn)浩销。這點(diǎn)不論我們使用Eureka贯涎、Consule還是其他Spring Cloud整合的注冊中心都是一樣,這也是Spring Cloud做了封裝后的好處所在慢洋。

@RestController
@Slf4j
public class TestController {

    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        log.info("invoked name = {}", name);
        return "hello " + name;
    }
}

第四步:配置服務(wù)器名稱和Nacos服務(wù)器地址, application.yml

server:
  port: 9001 #服務(wù)端口
spring:
  application:
    # 服務(wù)名稱盡量用 -陆盘,不用用 _普筹,不用用特殊字符
    name: alibaba-nacos-discovery-server 
  cloud:
    nacos:
      discovery:
        # nacos server 地址
        server-addr: localhost:8848 

第五步:啟動上面的應(yīng)用。這里為了方便測試使用命令行方式啟動在啟動時(shí)添加 -Dserver.port=9002的形式在本機(jī)的不同端口啟動多個實(shí)例隘马。

pom.xml添加maven打包插件:

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

打包:mvn clean package
運(yùn)行:
java -jar -Dserver.port=9001 alibaba-nacos-discovery-server-1.0-SNAPSHOT.jar
java -jar -Dserver.port=9002 alibaba-nacos-discovery-server-1.0-SNAPSHOT.jar

啟動完畢后看到下面日志太防,證明注冊完畢:

2019-07-09 15:19:32.234  INFO 11988 --- [           main] o.s.c.a.n.registry.NacosServiceRegistry  : nacos registry, alibaba-nacos-discovery-server 10.10.50.9:9002 register finished

實(shí)例全部啟動完畢后,就可以在Nacos管理頁面http://127.0.0.1:8848/nacos/ 來查看服務(wù)列表:

這里會顯示當(dāng)前注冊的所有服務(wù)酸员,以及每個服務(wù)集群數(shù)目蜒车、實(shí)例數(shù)、健康實(shí)例數(shù)幔嗦。單擊詳情酿愧,我們還能看到每個服務(wù)具體的實(shí)例信息,如圖所示:

服務(wù)消費(fèi)者

接下來邀泉,實(shí)現(xiàn)一個應(yīng)用來消費(fèi)上已經(jīng)注冊到Nacos的服務(wù)嬉挡。

第一步: 創(chuàng)建一個Spring Boot應(yīng)用,命名為:alibaba-nacos-discovery-client

第二步: 編輯pom.xml文件中的依賴內(nèi)容汇恤,同上面服務(wù)提供者一樣即可庞钢。

第三步: 創(chuàng)建應(yīng)用主類,編寫一個消費(fèi)者HTTP接口因谎,在該接口中調(diào)用服務(wù)提供者提供的接口服務(wù)基括。

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryClientApplication.class, args);
    }
}
@Slf4j
@RestController
public class TestController {

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/test")
    public String test() {
        // 通過spring cloud common中的負(fù)載均衡接口選取服務(wù)提供節(jié)點(diǎn)實(shí)現(xiàn)接口調(diào)用
        ServiceInstance serviceInstance = loadBalancerClient.choose("alibaba-nacos-discovery-server");
        String url = serviceInstance.getUri() + "/hello?name=" + "wolf";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        return "Invoke : " + url + ", return : " + result;
    }
}

這里使用了Spring Cloud Common中的 LoadBalancerClient 接口來實(shí)現(xiàn)服務(wù)實(shí)例的負(fù)載均衡調(diào)用。使用實(shí)例名稱獲取可方案的URI财岔,拼接上服務(wù)提供方的接口規(guī)則來發(fā)起調(diào)用风皿。

第四步: 配置服務(wù)名稱和Nacos地址饭冬,讓服務(wù)消費(fèi)者可以發(fā)現(xiàn)已經(jīng)注冊到Nacos的服務(wù)實(shí)例。

server:
  port: 9003 #服務(wù)端口
spring:
  application:
    name: alibaba-nacos-discovery-client #服務(wù)實(shí)例名稱
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服務(wù)器地址

第五步: 啟動消費(fèi)者揪阶,通過curl或postman工具發(fā)起調(diào)用測試昌抠,下面以postman為例:

通過測試發(fā)現(xiàn),兩次不同的請求鲁僚,真正調(diào)用的服務(wù)提供方實(shí)例是不同的炊苫,也就是說,通過 LoadBalancerClient接口在獲取服務(wù)實(shí)例的時(shí)候冰沙,已經(jīng)實(shí)現(xiàn)了服務(wù)提供方實(shí)例的負(fù)載均衡侨艾。

但是這樣的實(shí)現(xiàn)還是很繁瑣,后面的文章我們會講解其它更方便優(yōu)雅的調(diào)用方式拓挥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唠梨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侥啤,更是在濱河造成了極大的恐慌当叭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盖灸,死亡現(xiàn)場離奇詭異蚁鳖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赁炎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門醉箕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人徙垫,你說我怎么就攤上這事讥裤。” “怎么了姻报?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵己英,是天一觀的道長。 經(jīng)常有香客問我逗抑,道長剧辐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任邮府,我火速辦了婚禮荧关,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褂傀。我一直安慰自己忍啤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著同波,像睡著了一般鳄梅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上未檩,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天戴尸,我揣著相機(jī)與錄音,去河邊找鬼冤狡。 笑死孙蒙,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悲雳。 我是一名探鬼主播挎峦,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼合瓢!你這毒婦竟也來了坦胶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤晴楔,失蹤者是張志新(化名)和其女友劉穎顿苇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滥崩,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岖圈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钙皮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顽决,死狀恐怖短条,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情才菠,我是刑警寧澤茸时,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站赋访,受9級特大地震影響可都,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚓耽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一渠牲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧步悠,春花似錦签杈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铣除。三九已至,卻和暖如春鹦付,著一層夾襖步出監(jiān)牢的瞬間尚粘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工敲长, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郎嫁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓潘明,卻偏偏與公主長得像行剂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钳降,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354