1. 程式人生 > >Spring Cloud 服務註冊與發現(一)

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屬性設定不同的埠。