Eureka服務註冊與發現

在最初開始構建微服務系統的時候可能服務並不多, 我們可以通過做一些靜態配置來完成服務的調用。 比如,有兩個服務 A 和 B, 其中服務 A 需要調用服務 B 來完成一個業務操作時, 爲了實現服務 B 的高可用, 不論採用服務端負載均衡還是客戶端負載均衡, 都需要手工維護服務 B 的具體實例清單。 但是隨着業務的發展, 系統功能越來越複雜, 相應的微服務應用也不斷增加, 我們的靜態配置就會變得越來越難以維護。 並且面對不斷髮展的業務, 我們的集羣規模、 服務的位置 、 服務的命名等都有可能發生變化, 如果還是通過手工維護的方式, 那麼極易發生錯誤或是命名衝突等問題。 同時, 對於這類靜態內容的維護必將消耗大量的人力

  • 服務註冊
    即服務註冊中心,每個服務單元向註冊中心登記自己提供的服務,將主機與端口號、版本號、通信協議等一些附加信息告知註冊中心,註冊中心按照服務名分類組織服務清單。如
    圖片引用自書籍

  • 服務發現
    由於在服務治理框架下運作,服務間的調用不再通過指定具體的實例地址來實現,而是通過向服務名發起請求調用實現。如服務C希望調用服務A,服務C需要向註冊中心發起諮詢服務請求,服務註冊中心將A服務的位置清單返回C,如按上例服務A的情況,C便獲得了服務A的兩個可用位置192.168.0.100:8000和192.168.0.101:8000。當服務C要發起調用的時候, 便從該清單中以某種輪詢策略取出一 個位置來進行服務調用。

    Eukeka包含了客戶端和服務器端。Eureka服務器端就是服務註冊中心。Eureka客戶端主要處理服務的註冊與發現。

搭建Eureka Server框架
這裏寫圖片描述
下面給出Eureka Server端pom文件內容(包含了Spring Boot版本和Spring Cloud版本):

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Dalston.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <!--Eureka服務器端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</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>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

通過@EnableEurekaServer註解啓動一個服務註冊中心,如下

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

通常application.properties中需要配置如下:

#應用啓動端口
server.port=1111
#Eureka服務器端實例名
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

默認情況下,服務註冊中心會將自己作爲客戶端來嘗試註冊自己,所以eureka.client.register-with-eureka設置爲false

  • eureka.client.fetch-registry:由於註冊中心的職責是維護服務實例,並不需要去檢索服務,所以設置爲false

    網頁訪問項目:
    這裏寫圖片描述
    可以看到此時applications並沒有任何服務。因爲我們此時就一個Eureka Server服務,而且規定其不能註冊自己。

Eureka Client 客戶端框架搭建
下面給出Eureka Client端pom文件內容(包含了Spring Boot版本和Spring Cloud版本):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

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

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

通過@EnableDiscoveryClient將應用設置爲服務提供者

@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

然後在application.properties中將服務註冊到服務中心

server.port=8010
server.context-path=/
spring.application.name=eureka-client01
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
  • spring.application.name 表示該spring boot應用的名稱
  • eureka.client.service-url.defaultZone 表示將服務註冊到哪個服務註冊中心
    這裏寫圖片描述
    可以看到eureka-client01服務已經被註冊到Eureka Server中

至此一個簡單的服務註冊與發現框架即搭建完成,後續會介紹當客戶端有多個服務調用時的客戶端負載均衡工具rabbion
參考書籍
Spring Cloud微服務實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章