Eureka

單節點Eureka搭建

啓動類git

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

添加依賴,官方地址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-servergithub

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

application.ymlweb

eureka:
    client:
        register-with-eureka:false
        fetch-registry:false
        service-url:
            defaultZone:http://localhost:7900/eureka/

Eureka多結點

eureka全部操做調用, 所有是基於Restful協議的spring

application-euk1.ymlapi

eureka:
    client:
        register-with-eureka:false
        fetch-registry:false
        service-url:
            defaultZone:http://euk2.com:7002/eureka/
    instance:
        hostname:euk1.com
server:
     port:7001

application-euk2.yml跨域

eureka:
    client:
        register-with-eureka:false
        fetch-registry:false
        service-url:
            defaultZone:http://euk1.com:7001/eureka/
    instance:
        hostname:euk2.com
server:
     port:7002

application.yml緩存

spring:
    profiles:
        active:euk1

Register

服務註冊安全

想要參與服務註冊發現的實例首先須要向Eureka服務器註冊信息springboot

註冊在第一次心跳發生時提交服務器

Renew

續租(模型概念),心跳(實現方式)

Eureka客戶須要每30秒發送一次心跳來續租

10:00 00 第一次

10:00 30

10:01

10:01 30 最後

更新通知Eureka服務器實例仍然是活動的。若是服務器在90秒內沒有看到更新,它將從其註冊表中刪除實例

Fetch Registry

Eureka客戶端從服務器獲取註冊表信息並將其緩存在本地。

以後,客戶端使用這些信息來查找其餘服務。

經過獲取上一個獲取週期和當前獲取週期之間的增量更新,能夠按期(每30秒)更新此信息。

節點信息在服務器中保存的時間更長(大約3分鐘),所以獲取節點信息時可能會再次返回相同的實例。Eureka客戶端自動處理重複的信息。

在得到增量以後,Eureka客戶機經過比較服務器返回的實例計數來與服務器協調信息,若是因爲某種緣由信息不匹配,則再次獲取整個註冊表信息。

Cancel

Eureka客戶端在關閉時向Eureka服務器發送取消請求。這將從服務器的實例註冊表中刪除實例,從而有效地將實例從通訊量中取出。

Time Lag

同步時間延遲

來自Eureka客戶端的全部操做可能須要一段時間才能反映到Eureka服務器上,而後反映到其餘Eureka客戶端上。這是由於eureka服務器上的有效負載緩存,它會按期刷新以反映新信息。Eureka客戶端還按期地獲取增量。所以,更改傳播到全部Eureka客戶機可能須要2分鐘。

Communication mechanism

通信機制

Http協議下的Rest請求

默認狀況下Eureka使用Jersey和Jackson以及JSON完成節點間的通信

服務註冊

新建一個web項目,引入starter spring-cloud-starter-netflix-eureka-client

客戶端配置選項

#續約發送間隔默認30秒,心跳間隔
eureka.instance.lease-renewal-interval-in-seconds=5
#表示eureka client間隔多久去拉取服務註冊信息,默認爲30秒,對於api-gateway,若是要迅速獲取服務註冊狀態,能夠縮小該值,好比5秒
eureka.client.registry-fetch-interval-seconds=5
# 續約到期時間(默認90秒)
eureka.instance.lease-expiration-duration-in-seconds=60

服務端配置選項

#關閉自我保護模式
eureka.server.enable-self-preservation=false
#失效服務間隔
eureka.server.eviction-interval-timer-in-ms=3000

Rest風格協議

官方地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations

Eureka元數據

application.yml

eureka:
    instance:
        metadata-map:
            dalao:test

Eureka的元數據有兩種:標準元數據和自定義元數據。
標準元數據:主機名、IP地址、端口號、狀態頁和健康檢查等信息,這些信息都會被髮布在服務註冊表中,用於服務之間的調用。
自定義元數據:可使用eureka.instance.metadata-map配置,這些元數據能夠在遠程客戶端中訪問,可是通常不改變客戶端行爲,除非客戶端知道該元數據的含義。
能夠在配置文件中對當前服務設置自定義元數據,可後期用戶個性化使用
元數據能夠配置在eureka服務器和eureka的客戶端上

EurekaClient

EurekaClient 能夠在客戶端獲取eureka服務器上的註冊者信息

org.springframework.cloud.client.discovery與com.netflix.discovery.DiscoveryClient

  • org.springframework.cloud.client.discovery是SpringCloud對註冊中心client的抽象封裝,提供公用功能
  • org.springframework.cloud.client.discovery定義用來服務發現的客戶端接口。
  • 是客戶端進行服務發現的核心接口是spring cloud用來進行服務發現的頂級接口,在common中能夠看到其地位。
  • 在Netflix Eureka和Consul中都有具體的實現類。

表明通用於服務發現的讀操做,例如在 eureka或consul中。

String description();//獲取實現類的描述。
List<String> getServices();//獲取全部服務實例id。
List<ServiceInstance> getInstances(String serviceId);//經過服務id查詢服務實例信息列表。

com.netflix.discovery.DiscoveryClient爲Eureka註冊中心客戶端的接口,功能更豐富

自我保護機制

Eureka在CAP理論當中是屬於AP , 也就說當產生網絡分區時,Eureka保證系統的可用性,但不保證系統裏面數據的一致性
默認開啓,服務器端容錯的一種方式,即短期心跳不到達仍不剔除服務列表裏的節點
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.
默認狀況下,Eureka Server在必定時間內,沒有接收到某個微服務心跳,會將某個微服務註銷(90S)

可是當網絡故障時,微服務與Server之間沒法正常通訊,上述行爲就很是危險,由於微服務正常,不該該註銷
Eureka Server經過自我保護模式來解決整個問題,當Server在短期內丟失過多客戶端時,那麼Server會進入自我保護模式,會保護註冊表中的微服務不被註銷掉。

當網絡故障恢復後,退出自我保護模式。
思想:寧肯保留健康的和不健康的,也不盲目註銷任何健康的服務。

自我保護觸發

客戶端每分鐘續約數量小於客戶端總數的85%時會觸發保護機制
自我保護機制的觸發條件:

  • 每分鐘心跳次數( renewsLastMin ) 小於 numberOfRenewsPerMinThreshold 時
  • 而且開啓自動保護模式開關( eureka.server.enable-self-preservation = true ) 時,觸發自我保護機制,再也不自動過時租約
  • numberOfRenewsPerMinThreshold = expectedNumberOfRenewsPerMin * 續租百分比
  • ( eureka.server.renewalPercentThreshold, 默認0.85 )

expectedNumberOfRenewsPerMin = 當前註冊的應用實例數 x 2
爲何乘以 2:
默認狀況下,註冊的應用實例每半分鐘續租一次,那麼一分鐘心跳兩次,所以 x2
服務實例數:10個,指望每分鐘續約數:10 * 2=20,指望閾值:20*0.85=17,自我保護少於17時觸發

Actuator監控應用

添加依賴,官方地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

默認端點

springboot2.0只暴露了health和info端點,提供的監控信息沒法知足需求

application.yml

management:
    endpoints:
        web:
            exposure:
                include:*

Eureka 健康檢查

因爲server和client經過心跳保持 服務狀態,而只有狀態爲UP的服務才能被訪問

看eureka界面中的status

  • 好比心跳一直正常,服務一直UP,可是此服務DB連不上了,沒法正常提供服務,咱們須要將微服務的健康狀態也同步到server
  • 只須要啓動eureka的健康檢查就行,這樣微服務就會將本身的健康狀態同步到eureka

添加依賴,官方地址:

application.yml

eureka:
  client:
    healthcheck:
      enabled: true 

HealthStatusService

@Service
public class HealthStatusService implements HealthIndicator{

    private Boolean status = true;

    public void setStatus(Boolean status) {
        this.status  = status;
    }

    @Override
    public Health health() {
        // TODO Auto-generated method stub
        if(status)
        return new Health.Builder().up().build();
        return new Health.Builder().down().build();
    }

    public String getStatus() {
        // TODO Auto-generated method stub
        return this.status.toString();
    }
}

Controller

@GetMapping("/health")
public String health(@RequestParam("status") Boolean status) {
    healthStatusSrv.setStatus(status);
    return healthStatusSrv.getStatus();
}

開啓Eureka安全鏈接,application.yml

spring:
    security:
        user:
            name:test
            password:test

若是服務註冊報錯
Root name 'timestamp' does not match expected ('instance') for type [simple
是默認開啓了防止跨域攻擊
手動關閉
在服務端增長配置類

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub
        http.csrf().disable();
        super.configure(http);
    }
}
相關文章
相關標籤/搜索