Spring Cloud簡介
Spring Cloud是一個基于Spring Boot實現(xiàn)的云應(yīng)用開發(fā)工具,它為基于JVM的云應(yīng)用開發(fā)中涉及的配置管理沼填、服務(wù)發(fā)現(xiàn)桅咆、斷路器、智能路由坞笙、微代理岩饼、控制總線、全局鎖薛夜、決策競選籍茧、分布式會話和集群狀態(tài)管理等操作提供了一種簡單的開發(fā)方式。
Spring Cloud包含了多個子項目(針對分布式系統(tǒng)中涉及的多個不同開源產(chǎn)品)却邓,比如:Spring Cloud Config硕糊、Spring Cloud Netflix院水、Spring Cloud0 CloudFoundry腊徙、Spring Cloud AWS简十、Spring Cloud Security、Spring Cloud Commons撬腾、Spring Cloud Zookeeper螟蝙、Spring Cloud CLI等項目。
“微服務(wù)架構(gòu)”在這幾年非常的火熱民傻,以至于關(guān)于微服務(wù)架構(gòu)相關(guān)的開源產(chǎn)品被反復(fù)的提及(比如:netflix胰默、dubbo),Spring Cloud也因Spring社區(qū)的強大知名度和影響力也被廣大架構(gòu)師與開發(fā)者備受關(guān)注漓踢。
那么什么是“微服務(wù)架構(gòu)”呢牵署?簡單的說,微服務(wù)架構(gòu)就是將一個完整的應(yīng)用從數(shù)據(jù)存儲開始垂直拆分成多個不同的服務(wù)喧半,每個服務(wù)都能獨立部署奴迅、獨立維護、獨立擴展挺据,服務(wù)與服務(wù)間通過諸如RESTful API的方式互相調(diào)用取具。
對于“微服務(wù)架構(gòu)”,大家在互聯(lián)網(wǎng)可以搜索到很多相關(guān)的介紹和研究文章來進行學(xué)習(xí)和了解扁耐。也可以閱讀始祖Martin Fowler的《Microservices》(中文版翻譯點擊查看)暇检,本文不做更多的介紹和描述。
在簡單介紹了Spring Cloud和微服務(wù)架構(gòu)之后婉称,下面回歸本文的主旨內(nèi)容块仆,如何使用Spring Cloud來實現(xiàn)服務(wù)治理。
由于Spring Cloud為服務(wù)治理做了一層抽象接口王暗,所以在Spring Cloud應(yīng)用中可以支持多種不同的服務(wù)治理框架榨乎,比如:Netflix Eureka、Consul瘫筐、Zookeeper蜜暑。在Spring Cloud服務(wù)治理抽象層的作用下,我們可以無縫地切換服務(wù)治理實現(xiàn)策肝,并且不影響任何其他的服務(wù)注冊肛捍、服務(wù)發(fā)現(xiàn)、服務(wù)調(diào)用等邏輯之众。
所以拙毫,下面我們通過介紹兩種服務(wù)治理的實現(xiàn)來體會Spring Cloud這一層抽象所帶來的好處。
首先棺禾,我們來嘗試使用Spring Cloud Eureka來實現(xiàn)服務(wù)治理缀蹄。
Spring Cloud Eureka是Spring Cloud Netflix項目下的服務(wù)治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內(nèi)容是對Netflix公司一系列開源產(chǎn)品的包裝缺前,它為Spring Boot應(yīng)用提供了自配置的Netflix OSS整合蛀醉。通過一些簡單的注解,開發(fā)者就可以快速的在應(yīng)用中配置一下常用模塊并構(gòu)建龐大的分布式系統(tǒng)衅码。它主要提供的模塊包括:服務(wù)發(fā)現(xiàn)(Eureka)拯刁,斷路器(Hystrix),智能路由(Zuul)逝段,客戶端負(fù)載均衡(Ribbon)等垛玻。
下面,就來具體看看如何使用Spring Cloud Eureka實現(xiàn)服務(wù)治理奶躯。
創(chuàng)建一個基礎(chǔ)的Spring Boot工程帚桩,命名為eureka-server,并在pom.xml中引入需要的依賴內(nèi)容:
org.springframework.boot
spring-boot-starter-parent
1.5.4.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
通過@EnableEurekaServer注解啟動一個服務(wù)注冊中心提供給其他應(yīng)用進行對話嘹黔。這一步非常的簡單朗儒,只需要在一個普通的Spring Boot應(yīng)用中添加這個注解就能開啟此功能,比如下面的例子:
@EnableEurekaServer
@SpringBootApplication
publicclassApplication{
publicstaticvoidmain(String[] args){
newSpringApplicationBuilder(Application.class)
.web(true).run(args);
? ? }
}
在默認(rèn)設(shè)置下参淹,該服務(wù)注冊中心也會將自己作為客戶端來嘗試注冊它自己醉锄,所以我們需要禁用它的客戶端注冊行為,只需要在application.properties配置文件中增加如下信息:
spring.application.name=eureka-server
server.port=1001
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
為了與后續(xù)要進行注冊的服務(wù)區(qū)分浙值,這里將服務(wù)注冊中心的端口通過server.port屬性設(shè)置為1001恳不。啟動工程后,訪問:http://localhost:1001/开呐,可以看到下面的頁面烟勋,其中還沒有發(fā)現(xiàn)任何服務(wù)。
下面我們創(chuàng)建提供服務(wù)的客戶端筐付,并向服務(wù)注冊中心注冊自己卵惦。本文我們主要介紹服務(wù)的注冊與發(fā)現(xiàn),所以我們不妨在服務(wù)提供方中嘗試著提供一個接口來獲取當(dāng)前所有的服務(wù)信息瓦戚。
首先沮尿,創(chuàng)建一個基本的Spring Boot應(yīng)用。命名為eureka-client较解,在pom.xml中畜疾,加入如下配置:
org.springframework.boot
spring-boot-starter-parent
1.5.4.RELEASE
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR1
pom
import
其次,實現(xiàn)/dc請求處理接口印衔,通過DiscoveryClient對象啡捶,在日志中打印出服務(wù)實例的相關(guān)內(nèi)容。
@RestController
publicclassDcController{
@Autowired
? ? DiscoveryClient discoveryClient;
@GetMapping("/dc")
publicStringdc(){
String services ="Services: "+ discoveryClient.getServices();
? ? ? ? System.out.println(services);
returnservices;
? ? }
}
最后在應(yīng)用主類中通過加上@EnableDiscoveryClient注解奸焙,該注解能激活Eureka中的DiscoveryClient實現(xiàn)瞎暑,這樣才能實現(xiàn)Controller中對服務(wù)信息的輸出彤敛。
@EnableDiscoveryClient
@SpringBootApplication
publicclassApplication{
publicstaticvoidmain(String[] args){
newSpringApplicationBuilder(
? ? ? ? ? ? ComputeServiceApplication.class)
.web(true).run(args);
? ? }
}
我們在完成了服務(wù)內(nèi)容的實現(xiàn)之后,再繼續(xù)對application.properties做一些配置工作了赌,具體如下:
spring.application.name=eureka-client
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
通過spring.application.name屬性墨榄,我們可以指定微服務(wù)的名稱后續(xù)在調(diào)用的時候只需要使用該名稱就可以進行服務(wù)的訪問。eureka.client.serviceUrl.defaultZone屬性對應(yīng)服務(wù)注冊中心的配置內(nèi)容揍拆,指定服務(wù)注冊中心的位置渠概。為了在本機上測試區(qū)分服務(wù)提供方和服務(wù)注冊中心茶凳,使用server.port屬性設(shè)置不同的端口嫂拴。
啟動該工程后,再次訪問:http://localhost:1001/贮喧⊥埠荩可以如下圖內(nèi)容,我們定義的服務(wù)被成功注冊了箱沦。
當(dāng)然辩恼,我們也可以通過直接訪問eureka-client服務(wù)提供的/dc接口來獲取當(dāng)前的服務(wù)清單,只需要訪問:http://localhost:2001/dc谓形,我們可以得到如下輸出返回:
Services: [eureka-client]
其中灶伊,方括號中的eureka-client就是通過Spring Cloud定義的DiscoveryClient接口在eureka的實現(xiàn)中獲取到的所有服務(wù)清單。由于Spring Cloud在服務(wù)發(fā)現(xiàn)這一層做了非常好的抽象寒跳,所以聘萨,對于上面的程序,我們可以無縫的從eureka的服務(wù)治理體系切換到consul的服務(wù)治理體系中區(qū)童太。