前言
- 前面的文章已經(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)用方式拓挥。