Spring Cloud微服務學習筆記之服務治理 Eureka

一、Spring Cloud Eureka的使用

服務治理組件Spring Cloud Eureka是微服務架構最基礎的模塊。爲什麼要有服務治理組件?在服務數量較少時,我們可以通過靜態配置來完成服務間的相互調用。隨着系統越來越複雜,服務數量越來越多,且可能數量在不斷頻繁變化,手工維護的靜態配置將越來越難,需要一個組件來完成自動化的服務註冊與發現功能。Eureka由Eureka Server與Eureka Client兩個組件組成。

1.1 Eureka Server的使用

首先,在IDEA中通過Spring Initializr選擇Spring Cloud Discovery 中的Eureka Server組件(將自動在pom.xml添加Eureka Server相關的依賴),創建一個Spring Boot項目添加pom依賴(之後項目都要添加)

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 直接運行該程序,啓動後在瀏覽器訪問localhost:1111,結果如圖所示

error

  1. 在原程序上只添加一個Eureka Server的註解,運行程序訪問localhost:1111結果如圖
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

在這裏插入圖片描述

  1. 在application.yml中修改相應的配置
server:
  port: 1111
eureka:
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://localhost:1111/eureka/
  server:
    enable-self-preservation: false
spring:
  application:
    name: eureka

server.port 用來指定該服務運行時所佔用的端口號(內置Tomcat容器運行時的端口號)

eureka.client.register-with-eureka 用來指定註冊中心是否註冊自己的微務

神坑:server.port與eureka.client.register-with-eureka端口號一定要相同,否則自身是無法註冊在註冊中心的,其他client也無法註冊

eureka.client.fetch-registry 用來指定是否需要檢索服務,即服務發現

eureka.client.service-url 用來指定註冊中心的地址,其他服務註冊時要註冊在這個地址上

eureka.server.enable-self-preservation 用來指定註冊中心的健康檢查機制,開發狀態下默認是寧可信其有不可信其無的模式,與生產環境保持一致則設爲false

spring.application.name 用來指定該服務的名稱

1.2 Eureka Client的使用

同server,在IDEA中通過Spring Initializr選擇Spring Cloud Discovery 中的Eureka Discovery Client 組件,創建一個Spring Boot項目

  1. 在原程序上添加一個@EnableEurekaClient的註解

@EnableDiscoveryClient與@EnableEurekaClient區別:
如果選用的註冊中心是eureka,那麼就推薦@EnableEurekaClient,
如果選用其他的註冊中心,那麼推薦使用@EnableDiscoveryClient,
源碼中@EnableEurekaClient註解包含@EnableDiscoveryClient註解。

  1. 在application.yml中修改相應的配置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:1111/eureka/
  instance:
    hostname: ClientName
spring:
  application:
    name: client

eureka.instance.hostname 用來指定該服務實例後來訪問時的域名,即替代下圖紅框中的內容

  1. 在已啓動註冊中心的情況下,運行Client 程序,然後訪問localhost:1111結果如圖

在這裏插入圖片描述
可見client端已註冊在註冊中心上

1.3 Eureka的高可用

爲什麼要Eureka高可用? 所有的服務都註冊在註冊中心上,若註冊中心宕機,整個微服務框架將不可用,那麼此時服務拆分與單體架構並無區別,不能達到高可用的目的。

  1. 在原有項目的基礎上,註釋掉server.port=1111的配置,在啓動配置中複製一份服務,並在啓動配置中配置server.port

    EurekaApplication1服務運行端口爲1112,註冊在EurekaApplication2的地址http://localhost:1111/eureka/上;

    EurekaApplication2服務運行端口爲1111,註冊在EurekaApplication1的地址http://localhost:1112/eureka/上;

在這裏插入圖片描述
在這裏插入圖片描述

  1. Eureka Client 服務不變(註冊在EurekaApplication1上),此時運行兩個Eureka server服務,訪問localhost:1111即EurekaApplication2服務,發現Eureka Client 服務也註冊在了EurekaApplication2上。

  2. 若此時EurekaApplication1宕機,client 仍註冊在EurekaApplication2上,保障了Eureka Server的高可用;但如若此時又將client 重啓,將無法註冊在EurekaApplication2上,所以應該將client 在EurekaApplication1、EurekaApplication2都要註冊,即defaultZone= http://localhost:1111/eureka/, http://localhost:1112/eureka/。邏輯圖如下:

在這裏插入圖片描述
4. 3個Eureka Server的高可用邏輯圖如圖

在這裏插入圖片描述

二、Eureka在分佈式中的地位與原理

2.1 服務發現的兩種方式

  1. 客戶端發現

    Eureka Client就是這種方式,Client(A) 在 Eureka Server上獲取要消費的多個服務實例(B1、B2、B3…)並緩存在本地,通過負載均衡算法(輪詢、隨機、哈希等)選擇一個實例去消費。該方式簡單直接,但需要每個Client實現一套選擇機制。Spring Cloud全系列實現方式

  2. 服務端發現(代理)

    Eureka Server與要消費的多個服務實例(B1、B2、B3…)對Client(A)透明不可見,A只需訪問代理,由代理選擇一個B供消費。Ngnix、Zookeeper、K8S都可以作爲服務發現的負載均衡器。阿里系實現方式

    Ngnix不僅可以作爲HTTP反向代理服務器也可以做服務發現的負載均衡器

2.2 服務實現語言的兩種方式

  1. 相同語言(Java)

    Eureka Server與Eureka Client 均是由Java實現的。Spring Cloud全系列框架主要適於Java實現的分佈式系統,或者與JVM兼容的語言構建的系統。如若其他語言想應用Eureka,需自己實現客戶端,如.NET的Steeltoe、Node.js的eureka-js-client。服務間調用方式爲Restful。

  2. 不同語言

    不同語言是微服務的特點之一即異構(不同語言、不同數據庫),此時最好使用阿里系的dubbo,效率會更高。服務間調用方式爲RPC。

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