1. 程式人生 > 程式設計 >SpringCloud實踐分享 Eureka註冊中心

SpringCloud實踐分享 Eureka註冊中心

隨著業務需求增加,眾多企業面臨程式碼耦合嚴重、效率低下的問題。在Netflix開源了一套自己的微服務架構後,Spring隨即也基於此推出SpringCloud。 目前來說,SpringCloud的門檻相對較低,在瞭解大致SpringCloud後即可上手,更多的是配置,或者是套路上的東西。當然我這麼說只是對於希望快速上手的同學而言,原始碼博大精深,有興趣可以多多研究。自己做微服務的也做了半年了,現在寫一個demo,總結一下springcloud的基本用法,讓我們的 微服務的小車先開起來。

spring-cloud-microservice程式碼

專案構成

專案採用module的形式,一個專案下分多個module,匯入專案比較方便。

  • []Eureka註冊中心
  • []Config配置中心
  • []Oauth2認證中心
  • []Zuul閘道器
  • []api-admin服務

註冊中心Eureka

Eureka作為服務的註冊中心,服務間的互相呼叫都是通過Eureka來完成,所有的服務都將自己註冊到eureka中。當A服務希望呼叫B服務時,A只需使用B的instanceId,而不是ip,即可完成呼叫。在分散式應用中,服務隨機部署在各個伺服器中,根據ip去呼叫服務極其低效,你再寫程式碼。當服務啟動多個例項時候,一般使用ribbon和feign,則會自動負載均衡,無需幹預。

想啟動一個Eureka服務註冊中心,配置上也十分簡單。首先在pom.xml中加入spring-cloud-starter-eureka-server

依賴,再在入口類中加入 註解@EnableEurekaServer即可。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
複製程式碼
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
}
複製程式碼

如果Eureka只希望standalone模式(只啟動一個例項),事實上在配置檔案application.yml無需配置內容,配置上基本資訊以及埠即可。 如果希望啟動HighAvailability模式(即啟動多個例項),則可以參考一下配置。

在部署的時候,使用編譯後同一個jar包,在啟動後輸入不同引數。例如使用命令java -jar -Dspring.profiles.active=master your_jar_name.jar, 則啟動配置spring.profiles為配置master下的內容。而最上面一塊的內容為公共配置,啟動master配置時,實際的配置時公共配置+master配置;如果有些配置 兩邊都有,則master配置會覆蓋公共配置內容。

#公共配置
server:
  port: 8080
spring:
  application:
    name: eureka-server
eureka:
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 5
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true

---
# 配置master
spring:
  profiles: master
eureka:
  instance:
    hostname: master
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup1:8080/eureka/,http://backup2:8080/eureka/


---
# 配置backup1
spring:
  profiles: backup1
eureka:
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup2:8080/eureka/

---
# 配置backup2
spring:
  profiles: backup2
eureka:
  client:
    service-url:
      defaultZone: http://master:8080/eureka/,http://backup2:8080/eureka/

複製程式碼

下面來說一個幾個重點配置

eureka.client.registry-fetch-interval-seconds表示服務間隔多久去Eureka中獲取註冊資訊,預設為30s。

eureka.instance.lease-renewal-interval-in-seconds表示服務給Eureka傳送心跳間隔,預設為30s。如果該instance實現了HealthCheckCallback,並決定讓自己unavailable的話,則該instance也不會接收到流量。

eureka.instance.lease-expiration-duration-in-seconds表示Eureka上次收到服務的心跳後,等待下一次心跳的時間,如果超時則移除例項,預設為90s。

eureka.server.enable-self-preservation表示是否開啟自我保護模式,預設為true。預設情況下,如果Eureka Server在一定時間內沒有接收到某個微服務例項的心跳,Eureka Server將會登出該例項(預設90秒)。但是當網路分割槽故障發生時,微服務與Eureka Server之間無法正常通訊,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。 Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務登入檔中的資訊,不再刪除服務登入檔中的資料(也就是不會登出任何微服務)。當網路故障恢復後,該Eureka Server節點會自動退出自我保護模式。 綜上,自我保護模式是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。

eureka.server.eviction-interval-timer-in-ms表示Eureka清理無效節點的時間間隔,預設為60,000ms。

eureka.client.register-with-eureka表示是否將Eureka註冊到自身,多例項中一邊選擇true。

eureka.client.fetch-registry表示是否拉去註冊的服務。假設,服務A只註冊到master節點的Eureka,但是開啟該選項,所有的Eureka節點都會註冊該服務。

eureka.client.defaultZone表示希望註冊到Eureka的地址,格式為http://ip:port/eureka/,如果部署環境有dns,也可以將ip換成域名,如果有是ha模式,配置多個地址用逗號隔開。

以上為Eureka配置相對重要的配置。