Spring cloud 系列之 服務註冊與發現 Eureka

Spring Cloud簡介

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它爲基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操做提供了一種簡單的開發方式。web

Spring Cloud包含了多個子項目(針對分佈式系統中涉及的多個不一樣開源產品),好比:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。spring

Spring Cloud Eureka

首先,咱們來嘗試使用Spring Cloud Eureka來實現服務治理。app

Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內容是對Netflix公司一系列開源產品的包裝,它爲Spring Boot應用提供了自配置的Netflix OSS整合。經過一些簡單的註解,開發者就能夠快速的在應用中配置一下經常使用模塊並構建龐大的分佈式系統。它主要提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。負載均衡

下面,就來具體看看如何使用Spring Cloud Eureka實現服務治理。分佈式

建立「服務註冊中心」

建立一個基礎的Spring Boot工程,命名爲eureka-server,並在pom.xml中引入須要的依賴內容:spring-boot

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
</dependencies>

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

經過@EnableEurekaServer註解啓動一個服務註冊中心提供給其餘應用進行對話。這一步很是的簡單,只須要在一個普通的Spring Boot應用中添加這個註解就能開啓此功能,好比下面的例子:微服務

@EnableEurekaServer
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
                    .web(true).run(args);
    }
}

在默認設置下,該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們須要禁用它的客戶端註冊行爲,只須要在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

爲了與後續要進行註冊的服務區分,這裏將服務註冊中心的端口經過server.port屬性設置爲1001。啓動工程後,訪問:http://localhost:1001/,能夠看到下面的頁面,其中尚未發現任何服務。開發工具

建立「服務提供方」

下面咱們建立提供服務的客戶端,並向服務註冊中心註冊本身。本文咱們主要介紹服務的註冊與發現,因此咱們不妨在服務提供方中嘗試着提供一個接口來獲取當前全部的服務信息。測試

首先,建立一個基本的Spring Boot應用。命名爲eureka-client,在pom.xml中,加入以下配置:

<parent> 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.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-web</artifactId>
    </dependency>
</dependencies>

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

其次,實現/dc請求處理接口,經過DiscoveryClient對象,在日誌中打印出服務實例的相關內容。

@RestController
public class DcController {

    @Autowired
    DiscoveryClient discoveryClient;

    @GetMapping("/dc")
    public String dc() {
        String services = "Services: " + discoveryClient.getServices();
        System.out.println(services);
        return services;
    }

}

最後在應用主類中經過加上@EnableDiscoveryClient註解,該註解能激活Eureka中的DiscoveryClient實現,這樣才能實現Controller中對服務信息的輸出。

@EnableDiscoveryClient
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(
            ComputeServiceApplication.class)
            .web(true).run(args);
    }
}

咱們在完成了服務內容的實現以後,再繼續對application.properties作一些配置工做,具體以下

spring.application.name=eureka-client
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

經過spring.application.name屬性,咱們能夠指定微服務的名稱後續在調用的時候只須要使用該名稱就能夠進行服務的訪問。eureka.client.serviceUrl.defaultZone屬性對應服務註冊中心的配置內容,指定服務註冊中心的位置。爲了在本機上測試區分服務提供方和服務註冊中心,使用server.port屬性設置不一樣的端口。

啓動該工程後,再次訪問:http://localhost:1001/。能夠以下圖內容,咱們定義的服務被成功註冊了。

固然,咱們也能夠經過直接訪問eureka-client服務提供的/dc接口來獲取當前的服務清單,只須要訪問:http://localhost:2001/dc,咱們能夠獲得以下輸出返回:

Services: [eureka-client]

其中,方括號中的eureka-client就是經過Spring Cloud定義的DiscoveryClient接口在eureka的實現中獲取到的全部服務清單。因爲Spring Cloud在服務發現這一層作了很是好的抽象,因此,對於上面的程序,咱們能夠無縫的從eureka的服務治理體系切換到consul的服務治理體系中區。

相關文章
相關標籤/搜索