Spring Cloud Eureka整合使用和配置

遵循SpringBoot三板斧

服務(wù)端

第一步加依賴

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

第二步加注解

//在啟動(dòng)類上加注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

第三步寫配置

spring:
  application:
    name: eureka
# 詳見EurekaServerConfigBean,需要注意與Client和Instance在client的jar包不同,Server是在server的jar包。
# eureka的各項(xiàng)配置可見EurekaXXXConfigBean。
eureka:
  datacenter: cloud           # 修改Eureka監(jiān)控頁面的System Status Data center
  environment: test            # 修改Eureka監(jiān)控頁面的System Status Environment
  instance:
    hostname: localhost
    prefer-ip-address: true
    leaseRenewalIntervalInSeconds:  5 # 心跳間隔,5秒
    leaseExpirationDurationInSeconds: 10  # 沒有心跳的淘汰時(shí)間,10秒
    instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}} #SpringCloud 2.0 已經(jīng)改成 ${spring.cloud.client.ip-address} 了,于是修改
  client:
    healthcheck:
      enabled: true
    # 默認(rèn)情況下,eureka server同時(shí)也是eureka client,用于相互注冊(cè)形成高可用eureka服務(wù)。
    # 單點(diǎn)時(shí),如果registerWithEureka配置為true,則eureka server會(huì)報(bào)錯(cuò)Cannot execute request on any known server
    registerWithEureka: false # 是否注冊(cè)到eureka服務(wù),默認(rèn)為true,當(dāng)前已為eureka server,且單點(diǎn)eureka,故配置為false
    fetchRegistry: false # eureka之間如果網(wǎng)絡(luò)不穩(wěn)定,客戶端一般也會(huì)緩存了注冊(cè)列表,因此eureka服務(wù)可以不緩存,我覺得更能確保eureka之間的一致。
    serviceUrl:
      # registerWithEureka關(guān)閉后,defaultZone沒有配置的必要。如果打開,即使配置為本機(jī)一樣報(bào)錯(cuò)。
      # 也就是說defaultZone任何時(shí)候都沒有配置為localhost的必要。這點(diǎn)上John的配置更好,永超和周立包括志朋的配置有點(diǎn)多余。
      # 但是周立說的對(duì),這個(gè)屬性默認(rèn)配置是http://localhost:8761/eureka,也就是當(dāng)你沒有用戶名密碼安全認(rèn)證時(shí),本機(jī)調(diào)試時(shí),客戶端可以不配置,
      # 但對(duì)于server來說,這個(gè)默認(rèn)沒有什么作用。對(duì)于client來說,也只有調(diào)試的時(shí)候有點(diǎn)作用。
      # 但有一點(diǎn)很奇怪,既然默認(rèn)了8761端口,為什么eureka server的默認(rèn)端口要用8080而不是8761呢?
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #應(yīng)用的主機(jī)名稱
  #      defaultZone: http://${security.user.name}:${security.user.password}@localhost:${server.port}/eureka # 本配置應(yīng)刪除。
  server:
    # 自我保護(hù)機(jī)制,默認(rèn)true。打開后,心跳失敗在15分鐘內(nèi)低于85%(renewalPercentThreshold)的服務(wù),也不進(jìn)行剔除。
    # 關(guān)閉后,主頁提示:RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.
    # THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
    enableSelfPreservation: true # 本地調(diào)試時(shí)可fasle關(guān)閉。但生產(chǎn)建議打開,可防止因網(wǎng)絡(luò)不穩(wěn)定等原因?qū)е抡`剔除服務(wù)。
    renewalPercentThreshold: 0.85 # 默認(rèn)85%
    # 在服務(wù)器接收請(qǐng)求之前等待的初始時(shí)間,默認(rèn)等待5min(John Carnell)
    waitTimeInMsWhenSyncEmpty: 5 # John說開發(fā)時(shí)最好注釋此配置,服務(wù)注冊(cè)需要3次心跳,每次10s,也就是30s才能顯示在eureka。但是為什么我這里馬上就顯示呢?
    # eureka server刷新readCacheMap的時(shí)間,注意,client讀取的是readCacheMap,這個(gè)時(shí)間決定了多久會(huì)把readWriteCacheMap的緩存更新到readCacheMap上
    # 默認(rèn)30秒,eclipse提示默認(rèn)0應(yīng)該是錯(cuò)誤的,源代碼中responseCacheUpdateIntervalMs = 30 * 1000。
    response-cache-update-interval-ms: 3000 # 網(wǎng)上很多專家的博客錯(cuò)誤寫成responseCacheUpdateInvervalMs,請(qǐng)注意。這里配置為3秒。
    # eureka server緩存readWriteCacheMap失效時(shí)間,這個(gè)只有在這個(gè)時(shí)間過去后緩存才會(huì)失效,失效前不會(huì)更新,
    # 過期后從registry重新讀取注冊(cè)服務(wù)信息,registry是一個(gè)ConcurrentHashMap。
    # 由于啟用了evict其實(shí)就用不太上改這個(gè)配置了,默認(rèn)180s
    responseCacheAutoExpirationInSeconds: 180
    # 啟用主動(dòng)失效,并且每次主動(dòng)失效檢測(cè)間隔為3s。源碼evictionIntervalTimerInMs = 60 * 1000,默認(rèn)一分鐘。
    # 需要注意的是該配置會(huì)打印INFO日志,增加info日志量,修改后從每60秒打印一次變成3秒打印一次。
    evictionIntervalTimerInMs: 3000 # 注意不要寫成EvictionIntervalTimerInMs,yml大小寫敏感。

如果是多實(shí)例高可用修改下列配置

eureka:
  client:
    registerWithEureka: true # 是否注冊(cè)到eureka服務(wù)
    serviceUrl:
      defaultZone: http://peer2:1112/eureka/,http://peer3:1112/eureka/ #應(yīng)用的主機(jī)名稱

客戶端

第一步加依賴

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

第二步加注解

//@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

第三步寫配置

eureka:
  instance:
#    ip-address: #指定ip地址
    # 是否以IP注冊(cè)到Eureka Server上,如果false則不是IP而是服務(wù)器名稱
    # 但我設(shè)置了false,eureka主頁仍顯示192.168.100.16:client-microservice:8010
    preferIpAddress: true # 將IP注冊(cè)到Eureka Server上,而如果不配置就是機(jī)器的主機(jī)名。默認(rèn)false。應(yīng)該始終設(shè)置為true。如果基于Docker等容器的部署,容器會(huì)生成一個(gè)隨機(jī)的主機(jī)名,此時(shí)DNS不存在該名,無法解析 - John Carnell
    # 實(shí)例名。SpringCloud體系里的,服務(wù)實(shí)體向eureka注冊(cè)時(shí),注冊(cè)名默認(rèn)是“IP名:應(yīng)用名:應(yīng)用端口名”${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${random.int}}
    # 如果服務(wù)名,ip,端口都一致的話,eureka只顯示一個(gè)服務(wù)
    instance-id: ${spring.cloud.client.hostname}:${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${random.int[1,9]}}-@project.version@
    # 服務(wù)續(xù)約的兩個(gè)重要屬性
    leaseRenewalIntervalInSeconds: 30 # 服務(wù)續(xù)約間隔時(shí)間。默認(rèn)每隔30秒,客戶端會(huì)向服務(wù)端發(fā)送心跳。見DiscoveryClient.initScheduledTasks
    leaseExpirationDurationInSeconds: 90 # 服務(wù)失效時(shí)間。缺省為90秒服務(wù)端接收不到客戶端的心跳,則剔除該客戶端服務(wù)實(shí)例。
    # 端點(diǎn)配置。若配置了context-path,actuator的監(jiān)控端點(diǎn)會(huì)增加前綴,此時(shí)eureka也需要相應(yīng)增加
    #status-page-url-path: ${server.servlet.context-path}/actuator/info
    #health-check-url-path: ${server.servlet.context-path}/actuator/health

    #    Eureka 的元數(shù)據(jù)
    metadata-map:
      zc-data: Current services are goods services  # 不會(huì)影響客戶端
      zone: ABD               # Eureka可以理解的元數(shù)據(jù),可以影響客戶端
#    appname: AAAAA            # 填坑 Swagger:配置和spring.application.name 沖突
  client:
    # eureka服務(wù)的位置,如配置錯(cuò)誤,則:Cannot execute request on any known server
    # 詳見:com.netflix.discovery.endpoint.EndpointUtils
    service-url:
      defaultZone: http://localhost:8761/eureka/ #應(yīng)用的主機(jī)名稱
    # 是否啟用eureka客戶端。默認(rèn)true
    enabled: true # 本地調(diào)試時(shí),若不想啟動(dòng)eureka,可配置false即可,而不需要注釋掉@EnableDiscoveryClient這么麻煩。感謝永超,從他的書知道這個(gè)屬性。
    # 支持registerWithEureka(John、周立)和register-with-eureka(翟永超)兩種寫法,eclipse的STS默認(rèn)使用后者。
    # 基本所有配置使用橫杠或者駝峰都可以,鼠標(biāo)放在上面,eclipse都可以顯示詳細(xì)注解和默認(rèn)值(如果有)。
    registerWithEureka: true # 默認(rèn)true,因此也可省略。
    fetchRegistry: true # 默認(rèn)true,此處可不配置。
    # 緩存清單更新時(shí)間,默認(rèn)30秒。見EurekaClientConfigBean,其中DefaultEurekaClientConfig可不看(前者spring實(shí)現(xiàn),后者Netflix實(shí)現(xiàn))
    registry-fetch-interval-seconds: 30 # 如果想eureka server剔除服務(wù)后盡快在client體現(xiàn),我覺得可縮短此時(shí)間。
    # 周立在Camden SR4(對(duì)應(yīng)eureka-client.jar1.2.6)中說有該屬性,但我在SR6(對(duì)應(yīng)1.2.4)和SR4中都找不到;
    # 又查找了Brixton SR7(對(duì)應(yīng)1.1.7,其實(shí)不光eureka-client,整個(gè)spring-cloud-netflix都是這個(gè)版本),也是沒有。
    # 這是因?yàn)樵搶傩訧DE確實(shí)不能提示,但寫法是正確的。作用是修改eureka的健康檢查方式(心跳),改為用actuator,詳見HealthCheckHandler HealthIndicator。
    # 周立寫的不是太詳細(xì),可詳見這博客:https://blog.csdn.net/xiao_jun_0820/article/details/77991963
    # 若配置healthcheck,需引入actuator。
    healthcheck:
      enabled: true # 我建議配置為true。心跳機(jī)制有個(gè)問題,如當(dāng)客戶端的數(shù)據(jù)庫連接出現(xiàn)問題導(dǎo)致不可用時(shí),心跳機(jī)制不能反映,但actuator的health可以。

最后可以通過DiscoveryClient對(duì)象,在日志中打印出服務(wù)實(shí)例的相關(guān)內(nèi)容。

@Slf4j
@RestController
public class TestController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/getDiscoveryClient")
    public List<ServiceInstance> getDiscoveryClient() {
        return discoveryClient.getInstances("server-1");//獲取客戶端實(shí)例服務(wù)
    }

    @GetMapping("/getServices")
    public List<String> getServices() {
        return discoveryClient.getServices();
    }
}

趙小胖個(gè)人博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Feign的組成 Feign的日記級(jí)別 首先如何整合Feign 遵循SpringBoot的三板斧第一步:加依賴 第...
    最怕的其實(shí)是孤單閱讀 316評(píng)論 0 0
  • 基于Eureka的Spring Cloud微服務(wù)治理框架 框架調(diào)用關(guān)系說明: 服務(wù)生產(chǎn)者啟動(dòng)時(shí),向服務(wù)注冊(cè)中心注冊(cè)...
    BenjaminY閱讀 1,026評(píng)論 0 0
  • 上次我們講了Spring Cloud Eureka服務(wù)端,這次來說下客戶端??蛻舳撕?jiǎn)單來說就是把服務(wù)注冊(cè)到服務(wù)端 ...
    意識(shí)流丶閱讀 7,053評(píng)論 0 4
  • 1.月色融融夜,花蔭寂寂春。 2.有心爭(zhēng)似無心好,多情卻被無情惱。 3.花落水流紅,閑愁萬種,無語怨東風(fēng)。 4.碧...
    幽巖下閱讀 1,371評(píng)論 0 3
  • 單例模式大概是設(shè)計(jì)模式中最簡(jiǎn)單的一個(gè)。本來沒什么好說的,但是實(shí)踐過程中還是有一些坑。所以本文小結(jié)一下在iOS開發(fā)中...
    qiushuitian閱讀 3,802評(píng)論 1 21

友情鏈接更多精彩內(nèi)容