白話SpringCloud | 第二章:服務註冊與發現(Eureka)-上

前言

從本章節開始,正式進入SpringCloud的基礎教程。從第一章《什麼是SpringCloud》中咱們能夠知道,一個微服務框架覆蓋的東西是不少的,而如何去管理這些服務或者說API接口,就顯得異常重要了。因此本章節,主要介紹下SpringCloud中使用Eureka實現服務的註冊與發現。html

服務治理

服務治理是微服務架構中最爲核心和基礎的模塊。它主要用來實現各個微服務實例的自動化註冊與發現。java

來一張經典的圖:git

服務關係

能夠知道,隨着服務的愈來愈多,愈來愈雜,服務之間的調用會愈來愈複雜,愈來愈難以管理。而當某個服務發生了變化,或者因爲壓力性能問題,多部署了幾臺服務,怎麼讓服務的消費者知曉變化,就顯得很重要了。否則就會存在調用的服務其實已經下線了,但調用者不知道等異常狀況。github

這個時候有個服務組件去統一治理就至關重要了。簡單來講,一個服務治理組件應該具有如下幾個功能:web

服務註冊表spring

服務治理組件的核心,它用來記錄各個微服務的信息,好比說微服務的名稱、IP、端口等。服務註冊組件提供查詢API和管理API,查詢API用來查詢可用的微服務實例,管理API用於服務的註冊和註銷。api

服務註冊與發現緩存

  • 服務註冊是指微服務在啓動時,將本身的信息註冊到服務治理組件上的過程。
  • 服務發現是指查詢可用微服務列表及其網絡地址的機制。

服務檢查安全

服務治理組件使用必定機制定時檢測已註冊的服務,是否在線,或者是否沒法鏈接等,若發現沒法訪問,就會從服務註冊表中移除該實例,進行下線操做。微信

Eureka實踐

Eureka簡單介紹

EurekaNetflix開源的服務發現組件,自己是一個基於REST的服務。它包含ServerClient兩部分。Spring Cloud將它集成在子項目Spring Cloud Netflix中,從而實現微服務的註冊與發現。

題外話:有興趣的同窗,能夠搜索看看這家在線影片租賃提供商:Netflix。全家桶裏面大部分接觸的都是這家公司開源的,老牛逼了!

Netflix官方github地址瞭解下:https://github.com/Netflix

Eureka服務端

也稱爲註冊中心,用於提供服務的註冊與發現。支持高可用配置,依託與強一致性提供良好的服務實例可用性,能夠應對多種不一樣的故障場景。

Eureka客戶端

主要處理服務的註冊與發現。客戶端服務經過註解和參數配置方式,嵌入在客戶端的應用程序代碼中,在應用程序啓動時,向註冊中心註冊自身提供的服務並週期性地發送心跳來更新它的服務租約。同時,它也能從服務端查詢當前註冊的服務信息並把它們緩存到本地並週期性地刷新服務狀態。

簡單看下,Eureka整體架構:

Eureka整體架構

從這個簡圖中,能夠看出,Eureka有三部分組成:

  • Service Provider: 暴露服務的提供方。
  • Service Consumer:調用遠程服務的服務消費方。
  • EureKa Server: 服務註冊中心和服務發現中心

而咱們使用Eureka主要是實現服務治理功能,經過下圖咱們來大體瞭解下其治理體系:

治理體系

簡單來講,客戶端經過註冊中心,獲取服務端服務的地址信息,再根據地址進行服務調用,而註冊中心來維護各服務的狀態,好比發送心跳驗證健康狀態,判斷是否在線,同時記錄其服務地址,以供查詢。

開始講解實例前,先說明下爲了版本可統一管理,本系列教程建立了一個父類pom文件,利用MavendependencyManagement對模塊版本進行了統一管理。後續如果升級版本時,正常就更新此父類pom版本便可。

建立Eureka服務端

建立一個Eureka服務端很簡單,咱們只須要簡單幾步便可完成。

建立個名爲spring-cloud-eureka-serverSpringBoot項目。

0.加入pom依賴。

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

這裏注意,和E版不一樣,E版是引入:spring-cloud-starter-eureka-server

1.添加配置文件配置。

spring.application.name=eureka-service
# 修改端口
server.port=1000

# 實例的主機名稱
eureka.instance.hostname=127.0.0.1

## 不要向註冊中心註冊本身
eureka.client.register-with-eureka=false
## 表示不去檢索其餘的服務,由於服務註冊中心自己的職責就是維護服務實例,它也不須要去檢索其餘服務
eureka.client.fetch-registry=false

# 指定服務註冊中心地址 這裏直接指向了本服務
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

友情提示:因爲eureka.client.service-url在配置類org.springframework.cloud.netflix.eureka.EurekaClientConfigBean是個map對象,因此呢,使用IDE的提示功能是不會出現的,並且要注意map對象的值,大小寫要一致,和其餘對象不同,這個要注意。

EurekaClientConfigBean

因此從源碼能夠看出,默認不寫時,是註冊至:DEFAULT_URL中,默認就是http://localhost:8761/eureka

DEFAULT_URL

2.啓動類,添加註解@EnableEurekaServer。

/**
 * Eureka服務端
 * @author oKong
 *
 */
@SpringBootApplication
@EnableEurekaServer
@Slf4j
public class EureakServiceApplication {
    
    public static void main(String[] args) throws Exception {
        SpringApplication.run(EureakServiceApplication.class, args);
        log.info("spring-cloud-eureka-service啓動!");
    }
}

3.啓動應用,訪問:http://127.0.0.1:1000/,

eureka界面

目前爲止一個單機Eureka服務端就搭建完畢了。是否是很簡單,基本就幾行代碼。從上圖也能夠看出,目前尚未服務註冊上去,因此應用列表是空的。接下來,建立個客戶端同時註冊到此註冊中心下。

建立Eureka客戶端

Eureka客戶端,其實就是服務的提供方,對外提供服務的應用。

建立個spring-cloud-eureka-client工程項目。

0.加入pom依賴

<!-- 客戶端依賴 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <!-- 引入web,提供一個簡單的api接口 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

1.配置文件添加註冊中心配置。

spring.application.name=eureka-client
server.port=2000

# 註冊中心地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka
# 啓用ip配置 這樣在註冊中心列表中看見的是以ip+端口呈現的
eureka.instance.prefer-ip-address=true
# 實例名稱  最後呈現地址:ip:2000
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

友情提示:這裏有個坑,變量spring.cloud.client.ipAaddress在F版中應該寫成spring.cloud.client.ip-address。具體緣由就是字段名修改了。

org.springframework.cloud.client.HostInfoEnvironmentPostProcessor類:

HostInfoEnvironmentPostProcessor

2.啓動類加入註解EnableDiscoveryClient。

/**
 * 服務提供者示例-eureka客戶端
 * @author oKong
 *
 */
@SpringBootApplication
//注意這裏也可以使用@EnableEurekaClient
//但因爲springcloud是靈活的,註冊中心支持eureka、consul、zookeeper等
//若寫了具體的註冊中心註解,則當替換成其餘註冊中心時,又須要替換成對應的註解了。
//因此 直接使用@EnableDiscoveryClient 啓動發現。
//這樣在替換註冊中心時,只須要替換相關依賴便可。
@EnableDiscoveryClient
@Slf4j
public class EurekaClientApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(EurekaClientApplication.class, args);
        log.info("spring-cloud-eureka-client啓動!");
    }

}

注意:這裏也可以使用@EnableEurekaClient註解,但通常不這麼用,直接使用@EnableDiscoveryClient實現自動發現。由於SpringCloud自己支持EurekaConsulzookeeper等實現註冊中心功能,若寫死了某個註冊中心的相關注解,以後替換時,還須要修改註解類。

3.編寫一個簡單的api接口。

/**
 * 簡單api示例
 * @author oKong
 *
 */
@RestController
public class DemoController {

    @GetMapping("/")
    public String index() {
        return "spring-cloud-eureka-client!";
    }
}

4.啓動應用,再次訪問:http://127.0.0.1:1000/ ,能夠看見服務被註冊上去了。

加入註冊中心

Eureka自我保護模式

在開發階段,很常常會出現如下文字:

默認狀況下,若是Eureka Server在必定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會註銷該實例(默認90秒)。可是當網絡分區故障發生時,微服務與Eureka Server之間沒法正常通訊,這就可能變得很是危險了,由於微服務自己是健康的,此時本不該該註銷這個微服務。

Eureka Server經過「自我保護模式」來解決這個問題,當Eureka Server節點在短期內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務註冊表中的信息,再也不刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。

自我保護模式是一種對網絡異常的安全保護措施。使用自我保護模式,而讓Eureka集羣更加的健壯、穩定。

開發階段能夠經過配置:eureka.server.enable-self-preservation=false關閉自我保護模式。

生產階段,理應以默認值進行配置。

至於具體具體的配置參數,可至官網查看:http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#_appendix_compendium_of_configuration_properties

或者直接查看EurekaClientConfigBeanEurekaInstanceConfigBean類相關默認配置:

默認配置類

至於字段中文說明,你們可查看網站:微服務架構:Eureka參數配置項詳解,裏面很詳細的說明了。

「你說,英語很差連字段啥意思都不知道,多尷尬,學好英語很重要,(┬_┬)」

參考資料

  1. http://cloud.spring.io/spring-cloud-static/Finchley.RELEASE/single/spring-cloud.html#spring-cloud-eureka-server

  2. http://www.javashuo.com/article/p-djzxaiku-kt.html

  3. https://www.areatao.com/article/5b45718d7ab07c574d5888d0

總結

本文主要講解了如何搭建Eureka註冊中心,及使用Eureka客戶端註冊服務至註冊中心。配置和使用都相對來講很簡單的,主要仍是要理解下Eureka爲咱們作了什麼,提供了什麼服務治理策略。目前咱們搭建的是單機版的註冊中心,原本想繼續寫Eureka的高可用和其訪問安全的。奈何今天又出差了,晚上回酒店遲了。寫完本章最後一個章節以爲困了,就分爲上下章節吧。諒解,諒解呀,(┬_┬)

最後

目前互聯網上大佬都有分享SpringCloud系列教程,內容可能會相似,望多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有錯誤之處,還望提出,謝謝。

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

公衆號

我的博客:http://blog.lqdev.cn

源碼示例:https://github.com/xie19900123/spring-cloud-learning

原文地址:http://blog.lqdev.cn/2018/09/06/SpringCloud/chapter-two/

相關文章
相關標籤/搜索