1. 程式人生 > 實用技巧 >SpringCloud--Eureka註冊中心

SpringCloud--Eureka註冊中心

SpringCloud微服務實戰系列教程

SpringCloud中文官網

----------------------目錄------------------------------

一、主流伺服器中心對比

二、Eureka服務

  1、單例Eureka Server服務註冊中心

  2、高可用叢集服務註冊中心

三、Eureka客戶端註冊服務提供者

四、Eureka客戶端消費(呼叫)服務

五、Eureka配置優化

----------------------目錄------------------------------

一、主流服務中⼼對⽐

1、Zookeeper

  Zookeeper它是⼀個分散式服務框架,是Apache Hadoop 的⼀個⼦項⽬,它主要是⽤來解決分散式應 ⽤中經常遇到的⼀些資料管理問題,如:統⼀命名服務、狀態同步服務、叢集管理、分散式應⽤配置項的管理等。簡單來說zookeeper本質=儲存+監聽通知

  Zookeeper ⽤來做服務註冊中⼼,主要是因為它具有節點變更通知功能,只要客戶端監聽相關服務節點,服務節點的所有變更,都能及時的通知到監聽客戶端,這樣作為調⽤⽅只要使⽤Zookeeper 的客戶端就能實現服務節點的訂閱和變更通知功能了,⾮常⽅便。另外,Zookeeper可⽤性也可以,因為只要半數以上的選舉節點存活,整個叢集就是可⽤的。

2、Eureka

  由Netflflix開源,並被Pivatal整合到SpringCloud體系中,它是基於 RestfulAPI ⻛格開發的服務註冊與發現元件。

3、Consul

  Consul是由HashiCorp基於Go語⾔開發的⽀持多資料中⼼分散式⾼可⽤的服務釋出和註冊服務軟體, 採⽤Raft演算法保證服務的⼀致性,且⽀持健康檢查。

4、Nacos

  Nacos是⼀個更易於構建雲原⽣應⽤的動態服務發現、配置管理和服務管理平臺。簡單來說 Nacos就是註冊中⼼ + 配置中⼼的組合,幫助我們解決微服務開發必會涉及到的服務註冊 與發現,服務配置,服務管理等問題。Nacos 是 Spring Cloud Alibaba 核⼼元件之⼀,負責服務註冊與發現, C(資料⼀致性)A(⾼可⽤)P(分割槽容錯性)不可能同時滿⾜三個,要麼是AP,要麼是C二、Eureka服務

  Eureka 包含兩個元件:Eureka Server 和 Eureka Client,Eureka Client是⼀個Java客戶端,⽤於簡化與Eureka Server的互動;Eureka Server提供服務發現的能⼒,各個微服務啟動時,會通過Eureka Client向Eureka Server 進⾏註冊⾃⼰的資訊(例如⽹絡資訊),Eureka Server會儲存該服務的資訊;

  1)圖中us-east-1c、us-east-1d,us-east-1e代表不同的區也就是不同的機房   2)圖中每⼀個Eureka Server都是⼀個叢集。   3)圖中Application Service作為服務提供者向Eureka Server中註冊服務,Eureka Server接受到註冊事件會在叢集和分割槽中進⾏資料同步,Application Client作為消費端(服務消費者)可以從Eureka Server中獲取到服務註冊資訊,進⾏服務調⽤。   4)微服務啟動後,會週期性地向Eureka Server傳送⼼跳(預設週期為30秒)以續約⾃⼰的資訊   5)Eureka Server在⼀定時間內沒有接收到某個微服務節點的⼼跳,Eureka Server將會登出該微服務節點(預設90秒)   6)每個Eureka Server同時也是Eureka Client,多個Eureka Server之間通過複製的⽅式完成服務註冊列表的同步   7)Eureka Client會快取Eureka Server中的資訊。即使所有的Eureka Server節點都宕掉,服務消費者依然可以使⽤快取中的資訊找到服務提供者Eureka通過⼼跳檢測、健康檢查和客戶端快取等機制,提⾼系統的靈活性、可伸縮性和可⽤性。

1、單例Eureka Server服務註冊中心

  第一步、建立父專案,在專案中引入一下依賴,目的是統一Springboot的版本管理,子專案引用不需要指定版本號,注意官方的springcloud與springboot版本的關係。
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

  第二步、檢測Jdk版本,jdk9版本以後需要在父專案pom中引入jaxb的依賴jar,原因是jdk9以後預設不載入jaxb模組,EurekaServer啟動使用到該依賴,否則報錯

 <!--引⼊Jaxb,開始-->
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.2.11</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.2.10-b140310.1920</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--引⼊Jaxb,結束-->
View Code

  第三步、在EurekaServer專案中配置依賴

    <dependencies>
        <!--Eureka server依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

  第四步、配置application.yml或者application.properties配置檔案,以下為yml版本配置

#Eureka server服務端⼝
server:
  port: 8761
spring:
  application:
    #應⽤名稱,會在Eureka中作為服務的id標識(serviceId)
    name: lagou-cloud-eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    #客戶端與EurekaServer互動的地址,如果是叢集,也需要寫其它Server的地址
    service-url:
        defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    # ⾃⼰就是服務不需要註冊⾃⼰
    register-with-eureka: false
    #⾃⼰就是服務不需要從Eureka Server獲取服務資訊,預設為true,置為false
    fetch-registry: false

  第五步、啟動程式碼中新增@EnableEurekaServer註解

package city.albert;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @author niunafei
 * @function
 * @email [email protected]
 * @date 2020/9/3  4:42 PM
 * <b></>
 * @EnableEurekaServer 宣告本項⽬是⼀個Eureka服務
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

  第六步、啟動專案訪問http://127.0.0.1:8761

注意:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

  如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳時,EurekaServer將會登出該例項(預設90s)。但是當網路發生故障時,微服務與EurekaServer之間無法通訊,這樣就會很危險了,因為微服務本身是很健康的,此時就不應該登出這個微服務,而Eureka通過自我保護機制來預防這種情況,當網路健康後,該EurekaServer節點就會自動退出自我保護模式;

eureka:
  server:
     enable-self-preservation: false # 關閉⾃我保護模式(預設為開啟),生產環境建議開啟

2、高可用叢集服務註冊中心

  高可用叢集服務中Eureka相對來說比較簡單,僅僅需要修改配置檔案即可,注意配置如下:
#Eureka server服務端⼝
server:
  port: 8761
spring:
  application:
    #應⽤名稱,會在Eureka中作為服務的id標識)叢集中需要保持相同
    name: lagou-cloud-eureka-server
eureka:
  instance:
  #在叢集模式中hostname要保持唯一
hostname: 唯一服務名 client: #客戶端與EurekaServer互動的地址,叢集模式下,也需要寫其它 http://Server其他服務地址:其他服務埠/eureka,如果多個服務需要使用逗號分隔 service-url: defaultZone: http://其他服務ip或域名:其他服務埠/eureka/,http://其他服務ip或域名:其他服務埠/eureka/
     # 叢集模式下需要向euraka進行註冊,應為true 
   register
-with-eureka: true
   #叢集模式下需要從伺服器獲取註冊服務的資訊,應該為true
   fetch
-registry: true

三、Eureka客戶端註冊服務提供者

第一步:在父pom中引入下面依賴

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

第二步:在服務提供者中新增eureka客戶端依賴

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

第三步:配置服務提供者配置檔案

eureka:
  client:
    #eureka server的路徑
    serviceUrl:
      #註冊單例項只需要寫一臺伺服器即可
      #叢集模式下,也需要寫其它 http://Server其他服務地址:其他服務埠/eureka,如果多個服務需要使用逗號分隔
      defaultZone: http://127.0.0.1:8761/eureka/
  instance:
    #使⽤ip註冊,否則會使⽤主機名註冊了(此處考慮到對⽼版本的相容,新版本經過實驗都是ip)
    prefer-ip-address: true
    #⾃定義例項顯示格式,加上版本號,便於多版本管理,注意是ip-address,早期版本是ipAddress
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@

第四步:在啟動類上新增服務註解

注意以下註解可以不新增,也可以同時新增,推薦新增@EnableDiscoveryClient註解即可
@EnableDiscoveryClient (推薦)//開啟註冊中心客戶端
@EnableEurekaClient //開啟eureka客戶端,eureka獨有客戶端

第五步:啟動觀察註冊成功

四、Eureka客戶端消費(呼叫)服務

 前四步與“三、Eureka客戶端註冊服務提供者”中的相同,  

 第五步是注入DiscoveryClient客戶端物件,然後進行操作獲取客戶端調取方式極客

其中ServiceInstance物件中的元資料為一下資訊

五、Eureka配置優化

1、Eureka的元資料

Eureka的元資料有兩種:標準元資料和⾃定義元資料。上面配圖為標準的元資料,下面自定義元資料為Key-Value形式(在服務提供端進行配置

ServiceInstance物件中的metadata中展現形式如下

2、心跳修改,同步資料修改