Spring Cloud 服務註冊與發現(一)
簡介:
Spring Cloud是一個基於Spring Boot實現雲應用的開發工具。Spring Cloud 是Pivotal提供的用於簡化分散式系統構建的工具集。Spring Cloud引入了雲平
臺聯結器(Cloud Connector)和服務聯結器(Service Connector)的概念。雲平臺聯結器是一個介面,需要由雲平臺提供者進行實現,以便庫中的其他模組可以與該雲
平臺協同工作。 Spring Cloud 為開發者提供了在分散式系統(如配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、一次性 Token、全域性鎖、決策競
選、分散式會話和叢集狀態)操作的開發工具。使用 Spring Cloud 開發者可以快速實現上述這些模式。
Spring Boot:
Spring Cloud最重要的一點是它可以和Spring Boot一起工作,Spring Boot可以幫助開發者更容易地建立基於Spring的應用程式和服務。
從Spring Boot專案名稱中的Boot就可以看出來,Spring Boot的作用在於建立和啟動新的基於Spring框架的專案。Spring Boot會選擇最適合的Spring子專案和第三
方開源庫進行整合。大部分Spring Boot應用只需要非常少的配置就可以快速執行起來。
Spring Cloud整合相關專案:
Spring Cloud Config:配置管理工具包。 Spring Cloud Bus:事件、訊息匯流排、叢集(例如,配置變化時間)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。 Eureka:雲端服務發現,一個基於Rest的服務,用於定位服務,以顯示雲端中間層服務發現和故障轉移。 Hystrix:熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。、 Zuul:Zuul是在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架;Zuul相當於是裝置和Netflix流應用的Web網站後端所有請求的前門。 Archaius:配置管理API,包含一系列配置管理API,提供動態型別化屬性、執行緒安全配置操作、輪詢框架、回撥機制等功能。 Consul:封裝了Consul操作,consul是一個服務發現與配置工具,與Docker容器可以無縫整合。 Spring Cloud for Cloud Foundry:通過Oauth2協議繫結服務到CloudFoundry,CloudFoundry是VMware推出的開源PaaS雲平臺。 Spring Cloud Sleuth:日誌收集工具包,封裝了Dapper和log-based追蹤以及Zipkin和HTrace操作,為SpringCloud應用實現了一種分散式追蹤解決方案。 Spring Cloud Data Flow:大資料操作工具,作為Spring XD的替代產品,它是一個混合計算模型,結合了流資料與批量資料的處理方式。 Spring Cloud Security:基於spring security的安全工具包,為你的應用程式新增安全控制。 Spring Cloud Zookeeper(操作Zookeeper的工具包,用於使用zookeeper方式的服務發現和配置管理。 Spring Cloud Stream:資料流操作開發包,封裝了與Redis,Rabbit、Kafka等傳送接收訊息。 Spring Cloud CLI:基於 Spring Boot CLI,可以讓你以命令列方式快速建立雲元件。 Ribbon:提供雲端負載均衡,有多種負載均衡策略可供選擇,可配合服務發現和斷路器使用。 Turbine:Turbine是聚合伺服器傳送事件流資料的一個工具,用來監控叢集下hystrix的metrics情況。 Feign:Feign是一種宣告式、模板化的HTTP客戶端。 Spring Cloud Task:提供雲端計劃任務管理、任務排程。 Spring Cloud Connectors:便於雲端應用程式在各種PaaS平臺連線到後端,如:資料庫和訊息代理服務。 Spring Cloud Cluster:提供Leadership選舉,如:Zookeeper, Redis, Hazelcast, Consul等常見狀態模式的抽象和實現。 Spring Cloud Starters:Spring Boot式的啟動專案,為Spring Cloud提供開箱即用的依賴管理。
接下來,我們建立一個以Spring Boot為基礎的專案的“服務註冊中心“”,Pom.xml檔案依賴如下:
org.springframework.boot
spring-boot-starter-parent
1.3.8.RELEASE
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Brixton.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
如下程式碼;@EnableEurekaServer註解啟動一個服務註冊中心提供給其它應用進行對話。:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
//SpringApplication.run(EurekaServerApplication.class, args);
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}
}
在預設設定下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以需要禁用它的客戶端註冊行為,application.properties中問增加如下配置:
server.port=2888
#eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
通過EurekaServerApplication 類,啟動工程後,訪問:http://localhost:2888/
建立“服務提供方”:
建立提供服務的客戶端,並向服務註冊中心註冊自己。
假設我們有一個提供計算功能的微服務模組,我們實現一個Restful API,通過傳入兩個引數a和b,最後返回a + b的結果。
首先,建立一個基於Spring Boot應用的專案,在pom.xml配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
我們建立一個Controller的類,來實現add請求處理介面,通過DiscoveryClient物件,在日誌中打印出服務例項的相關內容。程式碼如下:
@RestController
public class ComputeController {
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/add",method = RequestMethod.GET)
public Integer add(@RequestParam Integer a,@RequestParam Integer b){
final ServiceInstance instance = client.getLocalServiceInstance();
Integer i = a + b;
System.out.println("/add host:" + instance.getHost() + "\tport:"+instance.getPort()+"\tserver_id:" + instance.getServiceId() + "result:" + i);
return i;
}
}
最後,在啟動類上中通過加上@EnableDiscoveryClient註解,該註解能啟用Eureka中的DiscoveryClient實現,才能實現Controller中對服務資訊的輸出。程式碼如下:
@EnableDiscoveryClient
@SpringBootApplication
public class ComputeServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ComputeServiceApplication.class, args);
//new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);
}
}
以上服務註冊中心和服務的提供方實現了之後,還有一件事需要我們去做對application.properties新增如下配置,程式碼如下:
spring.application.name=compute-service
server.port=2222
eureka.client.serviceUrl.defaultZone=http://localhost:2888/eureka/
通過spring.application.name屬性,我們可以指定微服務的名稱,後續在呼叫的時候只需要使用該名稱就即可進行服務的訪問。
eureka.client.serviceUrl.defaultZone屬性對應服務註冊中心的配置內容,指定服務註冊中心的位置。
為了在本機測試的時候區分服務提供方和服務註冊中心,使用server.port屬性設定不同的埠。