SpringCloud註冊中心Eureka

本篇概論

在上一篇中咱們介紹了微服務相關的內容。微服務的本質就是讓服務與服務之間進行互相調用。那麼在調用以前須要有一個前提。就是不一樣的服務與服務之間怎麼知道彼此的存在的呢?由於服務都是獨立部署的,根本沒有任何關聯。若是都不知道要調用的服務地址,那還怎麼進行互相調用呢?爲了解決這樣的問題,因而SrpingCloud提供了註冊中心的組件。咱們在開發項目時,都向註冊中心註冊,在進行服務調用時,註冊中心返回要調用服務的地址,這樣就解決了上述問題了。java


建立Eureka服務端步驟

在SrpingCloud中Eureka是註冊中心的組件,經過Eureka咱們能夠很方便的搭建一個註冊中心。在SrpingCloud中Eureka組件分爲服務端和客戶端。若是有Dubbo項目開發經驗的人能夠理解爲Eureka中的服務端,就至關於zokeerper服務,也就是記錄服務地址的。而Eureka中的客戶端,便是咱們Dubbo項目中真真正正的服務。下面咱們來詳細介紹一下,怎麼搭建一個Eureka服務端。git


搭建一個Eureka服務端很是的簡單,和建立一個SpringBoot的項目差很少,不一樣之處,就是添加依賴不同。下面咱們來詳細介紹一下。github

  1. 在IDEA中選擇Spring Initializr選項。也就是以下圖所示:

title

  1. 設置項目的相關參數,在這一點和建立SpringBoot的項目沒有任何區別。

title

  1. 這一塊是最重要的,也就是惟一和建立SpringBoot項目不一樣的地方。

title

  1. 這一步仍是和SpringBoot項目同樣,直接點擊完成就能夠了。

title

  1. 下圖就是項目的架構圖,比較簡單和SpringBoot同樣,惟一的區別就是pom.xml中的不一樣,也就是依賴不一樣。

title

下面我啓動直接啓動項目看一下運行結果。啓動日誌:web

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.8.jar:1.9.8]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

2019-03-09 18:20:09.617  INFO 1752 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 18:20:09.618  INFO 1752 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080

咱們發現和SpringBoot啓動有一些不一樣,咱們什麼都沒有改,也就是都是用默認的配置,啓動的時候,竟然拋出異常了。而在SpringBoot的項目中是能夠正常啓動的。雖然項目拋出了異常,但項目已經啓動成功了,由於日誌已經正確的輸出了項目的端口了。下面咱們直接訪問這個端口,看看會返回什麼信息。訪問地址:spring

http://127.0.0.1:8080

title

@EnableEurekaServer註解

看上面的返回結果咱們應該很熟悉,這是由於咱們沒有寫Controller致使的,在SpringBoot的文章中咱們介紹過,這裏就不詳細介紹了。但這顯然是不對的,由於剛剛咱們介紹過SpringCloud中是使用Eureka來提供註冊中心服務的,而且Eureka有客戶端和服務端之分,因此咱們只在項目添加了Eureka的依賴仍是不夠的,咱們還要在項目的代碼中添加註解,來標識當前的Eureka服務是客戶端服務仍是服務端服務。這也就是本篇介紹的第一個註解。也就是@EnableEurekaServer註解。咱們只要將該註解添加到SpringCloud項目中的啓動類中便可。具體代碼以下:tomcat

package com.jilinwula.eureka;

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

@SpringBootApplication
@EnableEurekaServer
public class JilinwulaSpringcloudEurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(JilinwulaSpringcloudEurekaServerApplication.class, args);
    }

}

而後咱們繼續啓動項目。在訪問地址:http://127.0.0.1:8080看一下項目返回的結果。項目啓動日誌以下:架構

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121) ~[eureka-client-1.9.8.jar:1.9.8]
    at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101) [eureka-client-1.9.8.jar:1.9.8]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_191]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_191]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_191]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_191]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_191]

2019-03-09 18:42:29.427  INFO 1837 --- [      Thread-19] o.s.c.n.e.server.EurekaServerBootstrap   : isAws returned false
2019-03-09 18:42:29.428  INFO 1837 --- [      Thread-19] o.s.c.n.e.server.EurekaServerBootstrap   : Initialized server context
2019-03-09 18:42:29.461  INFO 1837 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 18:42:29.461  INFO 1837 --- [           main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080

看上述日誌,項目啓動時仍是會拋出異常,咱們先不用考慮,在後續的內容中咱們在解釋爲何啓動時會拋出異常。仍是和第一次啓動同樣,雖然啓動拋出異常了,但項目仍是啓動成功了。下面咱們繼續訪問如下地址,看一下訪問結果。app

http://127.0.0.1:8080

返回結果:spring-boot

title

自定義註冊中心地址

咱們看這回返回的不是默認的錯誤頁面了,而是返回了一個管理界面。這個管理界面就是SpringCloud中Eureka組建爲咱們提供的註冊中心的管理界面,經過這個界面,咱們能夠很是方便的,來管理哪些服務註冊成功、哪些註冊失敗以及服務其它狀態等。看上圖中的界面顯示,如今沒有任何一個服務註冊成功。下面咱們看一下剛剛項目啓動時,拋出的異常。若是咱們如今觀察項目的啓動日誌,咱們會發現,日誌是每隔一段時間,就會拋出和啓動時同樣的異常。這是爲何呢?這是由於Eureka服務端和客戶端是經過心跳方式檢測的服務狀態。剛剛咱們經過@EnableEurekaServer註解啓動了Eureka的服務端。實際上@EnableEurekaServer註解在底層實現時,除了標識項目爲Eureka的服務端外,還會默認標識項目爲Eureka的客戶端。也就是經過@EnableEurekaServer註解標識的項目,默認便是Eureka的客戶端仍是Eureka的服務端。因此上述報錯的緣由就是Eureka的客戶端與找到Eureka的服務端才拋出的異常。那怎麼解決呢?既然咱們知道了異常的根本緣由,那咱們解決就比較簡單了,咱們只要在項目中正確的配置Eureka的服務端的地址就能夠解決上述的問題。具體配置以下。咱們知道在建立SpringClourd項目默認會爲咱們建立application.properties文件,咱們首先將該文件修改成yml文件(緣由在以前的文章中已經介紹過了)。具體配置以下。application.yml配置:微服務

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/

配置完上述參數後,咱們從新啓動項目,而後在觀察一下日誌,看看是否是還會拋出異常?(第一次啓動項目時,還會是拋出異常的,由於咱們的Eureka服務端尚未啓動成功呢,因此仍是會拋出異常的,咱們只要看心跳以後,會不會拋出異常便可。)下面爲啓動後的日誌:

2019-03-09 21:00:27.909 INFO 1930 --- [ Thread-21] o.s.c.n.e.server.EurekaServerBootstrap : isAws returned false
2019-03-09 21:00:27.909 INFO 1930 --- [ Thread-21] o.s.c.n.e.server.EurekaServerBootstrap : Initialized server context
2019-03-09 21:00:27.949 INFO 1930 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-03-09 21:00:27.949 INFO 1930 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2019-03-09 21:00:27.952 INFO 1930 --- [ main] inwulaSpringcloudEurekaServerApplication : Started JilinwulaSpringcloudEurekaServerApplication in 4.318 seconds (JVM running for 4.816)
2019-03-09 21:00:28.288 INFO 1930 --- [(1)-192.168.0.3] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-03-09 21:00:28.288 INFO 1930 --- [(1)-192.168.0.3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-03-09 21:00:28.295 INFO 1930 --- [(1)-192.168.0.3] o.s.web.servlet.DispatcherServlet : Completed initialization in 6 ms2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Disable delta property : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Single vip registry refresh property : null
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Force full registry fetch : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Application is null : false
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Registered Applications size is zero : true
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Application version is -1: true
2019-03-09 21:00:57.662 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : Getting all instance registry info from the eureka server
2019-03-09 21:00:57.745 WARN 1930 --- [nio-8080-exec-1] c.n.e.registry.AbstractInstanceRegistry : DS: Registry: lease doesn't exist, registering resource: UNKNOWN - 192.168.0.3
2019-03-09 21:00:57.745 WARN 1930 --- [nio-8080-exec-1] c.n.eureka.resources.InstanceResource : Not Found (Renew): UNKNOWN - 192.168.0.3
2019-03-09 21:00:57.763 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3 - Re-registering apps/UNKNOWN
2019-03-09 21:00:57.763 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3: registering service...
2019-03-09 21:00:57.770 INFO 1930 --- [freshExecutor-0] com.netflix.discovery.DiscoveryClient : The response status is 200
2019-03-09 21:00:57.807 INFO 1930 --- [nio-8080-exec-3] c.n.e.registry.AbstractInstanceRegistry : Registered instance UNKNOWN/192.168.0.3 with status UP (replication=false)
2019-03-09 21:00:57.809 INFO 1930 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/192.168.0.3 - registration status: 204
2019-03-09 21:00:58.329 INFO 1930 --- [nio-8080-exec-4] c.n.e.registry.AbstractInstanceRegistry : Registered instance UNKNOWN/192.168.0.3 with status UP (replication=true)

咱們看項目這時已經不會拋出異常了,而且經過觀察發現,每隔一段時間就會有日誌輸出,這也就是上面介紹的Eureka的服務端和Eureka的客戶端的心跳機制。下面咱們繼續訪問http://127.0.0.1:8080地址來看看此時的註冊中心和剛剛相比,是否有不同的地方。

title

修改默認項目名

咱們看這時的註冊中心已經檢測到了有服務註冊了,只不過這個服務就是Eureka的服務端本身,而且名字爲UNKNOWN。若是有強迫者的人若是看到UNKNOWN那必定會感受不舒服,不瞭解了Eureka組件的還覺得註冊中心出錯了呢。下面咱們修改一下項目參數,將UNKNOWN改爲咱們指定的名字。具體配置以下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-server

咱們在看一下注冊中的的變化,看看仍是不是已經成功的將UNKNOWN修改成咱們指定的項目名字了。

title

register-with-eureka配置

咱們看註冊中心已經成功的顯示咱們配置文件中的項目名字了。在實際的開發中,咱們基本不會讓註冊中心顯示Eureka的服務端本身的服務,這樣可能會致使和Eureka的客戶端相混淆。因此一般的作法是讓註冊中心將Eureka的服務端屏蔽掉,說是屏蔽其實是讓Eureka的服務端不向註冊中心註冊。具體配置以下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8080/eureka/
    register-with-eureka: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server

咱們在觀察一下注冊中心看看仍是否能夠檢測到Eureka服務端本身。

title

咱們發現這時註冊中心已經檢測到不任何服務了。下面咱們將Eureka服務端的端口設置爲默認的端口8761,由於8080端口可能會被佔用。具體配置以下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

建立Eureka客戶端步驟

這時咱們Eureka服務端的基本配置就介紹完了,下面咱們介紹一下Eureka組件的客戶端。下面咱們仍是向Eureka服務端同樣從建立項目開始。具體步驟以下:

  1. 咱們仍是在IDEA中選擇Spring Initializr選項。也就是以下圖所示:

title

  1. 設置項目的相關參數,和Eureka服務端沒有任何區別。

title

  1. 這一步很是關鍵,由於它和Eureka服務端和SpringBoot都是不同的。

title

備註:爲了保證Eureka服務端和客戶端能夠註冊成功,咱們要特別注意保證兩個項目中SpringBoot及其SpringCloud的版本一致。因爲剩下的步驟和Eureka服務端同樣,咱們就不作過多的介紹了。下面咱們仍是和Eureka服務端同樣,配置註冊中心的服務地址。具體配置以下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

@EnableEurekaClient註解

若是隻修改上面的配置,註冊中心是不會檢測到Eureka客戶端的,由於咱們尚未在該項目的啓動類上添加Eureka客戶端的註解。具體配置以下:

package com.jilinwula.jilinwulaspringcloudeurekaclient;

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

@SpringBootApplication
@EnableEurekaClient
public class JilinwulaSpringcloudEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(JilinwulaSpringcloudEurekaClientApplication.class, args);
    }

}

@EnableEurekaClient註解與@EnableDiscoveryClient註解區別

也就是添加@EnableEurekaClient註解。實際上除了該註解外,咱們還能夠用@EnableDiscoveryClient註解來達到一樣的做用。它們兩個註解的區別是註冊中心的實現方式有不少種,若是是採用的是Eureka服務的話,那客戶端直接使用@EnableEurekaClient註解和@EnableDiscoveryClient註解均可以。若是註冊中心採用的是zookeeper或者其它服務時,那咱們註冊中心客戶端就不能採用@EnableEurekaClient註解了,而是要使用@EnableDiscoveryClient註解。因此在實際的開發中咱們推薦使用@EnableDiscoveryClient註解,這樣當咱們更換註冊中心實現時,就不用修改代碼了。上述代碼中咱們爲了和Eureka服務端一致,因此咱們採用@EnableDiscoveryClient註解。下面咱們啓動一下項目看看註冊中心是否能夠成功的檢測Eureka客戶端的存在。當咱們按照上面的配置啓動Eureka客戶端時,咱們發現日誌竟然報錯了,而且項目自動中止運行了。具體日誌以下:

2019-03-09 23:00:55.844  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081: registering service...
2019-03-09 23:00:55.852  INFO 2082 --- [           main] inwulaSpringcloudEurekaClientApplication : Started JilinwulaSpringcloudEurekaClientApplication in 2.115 seconds (JVM running for 2.567)
2019-03-09 23:00:55.866  INFO 2082 --- [       Thread-8] o.s.c.n.e.s.EurekaServiceRegistry        : Unregistering application JILINWULA-SPRINGCLOUD-EUREKA-CLIENT with eureka with status DOWN
2019-03-09 23:00:55.866  WARN 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Saw local status change event StatusChangeEvent [timestamp=1552143655866, current=DOWN, previous=UP]
2019-03-09 23:00:55.869  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Shutting down DiscoveryClient ...
2019-03-09 23:00:55.883  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - registration status: 204
2019-03-09 23:00:55.883  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081: registering service...
2019-03-09 23:00:55.888  INFO 2082 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - registration status: 204
2019-03-09 23:00:55.889  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Unregistering ...
2019-03-09 23:00:55.893  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_JILINWULA-SPRINGCLOUD-EUREKA-CLIENT/192.168.0.3:jilinwula-springcloud-eureka-client:8081 - deregister  status: 200
2019-03-09 23:00:55.902  INFO 2082 --- [       Thread-8] com.netflix.discovery.DiscoveryClient    : Completed shut down of DiscoveryClient

這是爲何呢?這個問題的緣由是由於版本不一樣致使的,也就是有的Eureka版本有BUG致使的,少了一個依賴咱們只要把缺乏的依賴添加上便可。缺乏的依賴以下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

下面咱們繼續啓動Eureka客戶端,而後看看註冊中心是否能夠檢測到Eureka客戶端。

title

這時咱們發現註冊中心已經成功的檢測到了Eureka客戶端的服務了。除此以外,咱們發現此時的註冊中心和以往相比有了其它的不一樣,咱們發現註冊中心顯示警告信息了。這是爲何呢?這是由於註冊中心有預警機制,由於我爲了掩飾項目,會頻繁的啓動重啓項目,這樣註冊中心的心跳就會時常檢測不到Eureka客戶端的心跳,因此就會認爲該服務已下線。因此Eureka註冊中心當服務下線少於必定比率時,就會顯示警告信息,以此來表示有的服務運行不穩定。固然咱們仍是能夠經過配置參數來消除上面的警告。具體參數以下:

register-with-eureka配置

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

該參數的是意思是默認認爲服務均在線,而且還有一點要注意,該參數是在Eureka服務端配置的。咱們從新啓動完Eureka服務端後,在看一下注冊中心中的變化。

title

Eureka服務端雙註冊中心配置

這時咱們發現警告信息又變了,這說明咱們的配置參數啓做用了。那爲何還會提示警告呢?這是由於咱們配置了改參數,因此註冊中心就不會準確的檢查服務上下線狀態了。因此提示了另外一個警告。下面咱們將Eureka服務端配置成多節點,在實際的項目開發中,咱們知道一個節點可能會出現問題,若是Eureka服務端出現了問題,那麼就至關於整個服務都不能調用了,因此爲了保證高可用,一般會將Eureka服務端配置成多個節點,下面咱們先嚐試將Eureka服務端配置成雙節點。既然是雙節點,那固然是有兩個Eureka服務端項目了,因爲建立Eureka服務端的步驟,咱們已經很熟悉了,因此咱們只介紹它們配置文件的不一樣。首先咱們先看一下第一個Eureka服務端註冊中心配置:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8762/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

第二個Eureka服務端註冊中心配置:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8762

咱們發現這兩個配置基本相同,惟一的不一樣就是配置註冊中地方,它們彼此配置的是對方的服務地址。也就是讓兩個Eureka服務端彼此註冊,這樣就只要咱們Eureka客戶端註冊任意一個註冊中心,這兩個註冊中心均可以檢測到Eureka客戶端的存在,由於底層它們會進行數據同步。下面咱們看一下如今的註冊中心的變化。

8761註冊中心:

title

8762註冊中心:

title

咱們看咱們的Eureka客戶端只配置了一個註冊中心,但兩個註冊中心都檢測到了Eureka客戶端的存在。這就是剛剛提到過的當兩個註冊中心彼此註冊時,就會進行數據通訊,因此8762註冊中心也檢測到了該Eureka客戶端的存在。下面咱們將8761註冊中心中止服務,而後在觀察一下8762的註冊中心,看看是否有何變化。

8762註冊中心:

title

咱們發現雖然咱們將8761註冊中心中止了服務,但8762註冊中心依然檢測到了Eureka客戶端的存在。下面咱們從新啓動一下Eureka客戶端而後在看一下8762註冊中心仍是否能夠檢測到Eureka客戶端的存在。

title

這時咱們發現8762註冊中心已經檢測不到Eureka客戶端的服務了。那應該怎麼辦呢?解決的辦法很簡單,那就是讓咱們的Eureka客戶端註冊兩個註冊中心。具體配置以下:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

這時咱們在訪問一下注冊中心,看一下服務是否能夠檢測到。

title

Eureka服務端三註冊中心配置

這時咱們的註冊中心已經成功的檢測到了Eureka客戶端了。下面咱們介紹一下怎麼部署Eureka服務端3節點。既然2節點咱們已經知道了要彼此註冊,那麼3節點,咱們應該已經猜到了,那就是讓每個節點都註冊另外兩個節點的服務。具體配置以下:

8761註冊中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8761

8762註冊中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8763/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8762

8763註冊中心:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/
    register-with-eureka: false
  server:
    enable-self-preservation: false
spring:
  application:
    name: jilinwula-springcloud-eureka-server
server:
  port: 8763

Eureka客戶端:

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
spring:
  application:
    name: jilinwula-springcloud-eureka-client
server:
  port: 8081

下面咱們看一下訪問任何一個註冊中心,來看一下注冊中心是否能夠檢測到Eureka客戶端的服務,及其它註冊中心的存在。

title

咱們看註冊中心已經成功的檢測到了Eureka客戶端的服務了,而且紅色標識的地方已經檢測到了其它兩個註冊中心的地址了,因此咱們在訪問註冊中心時,就能夠經過下面紅色標識的地方,來了解項目中的Eureka服務端有幾個註冊中心。


上述內容就是SpringClould中Eureka組件的詳細介紹,若有不正確或者須要交流的歡迎留言,下一篇咱們將介紹怎麼在SpringClould中進行不一樣的服務與服務之間的調用。謝謝。
  


項目源碼

https://github.com/jilinwula/jilinwula-springcloud-eureka.git


原文連接

http://jilinwula.com/article/24342  

相關文章
相關標籤/搜索