javascript
eureka java_SpringCloud注册中心Eureka
本篇概論
在上一篇中我們介紹了微服務相關的內容。微服務的本質就是讓服務與服務之間進行互相調用。那么在調用之前需要有一個前提。就是不同的服務與服務之間怎么知道彼此的存在的呢?因為服務都是獨立部署的,根本沒有任何關聯。如果都不知道要調用的服務地址,那還怎么進行互相調用呢?為了解決這樣的問題,于是SrpingCloud提供了注冊中心的組件。我們在開發項目時,都向注冊中心注冊,在進行服務調用時,注冊中心返回要調用服務的地址,這樣就解決了上述問題了。
創建Eureka服務端步驟
在SrpingCloud中Eureka是注冊中心的組件,通過Eureka我們可以很方便的搭建一個注冊中心。在SrpingCloud中Eureka組件分為服務端和客戶端。如果有Dubbo項目開發經驗的人可以理解為Eureka中的服務端,就相當于zokeerper服務,也就是記錄服務地址的。而Eureka中的客戶端,即是我們Dubbo項目中真真正正的服務。下面我們來詳細介紹一下,怎么搭建一個Eureka服務端。
搭建一個Eureka服務端非常的簡單,和創建一個SpringBoot的項目差不多,不同之處,就是添加依賴不一樣。下面我們來詳細介紹一下。
在IDEA中選擇Spring Initializr選項。也就是如下圖所示:
設置項目的相關參數,在這一點和創建SpringBoot的項目沒有任何區別。
這一塊是最重要的,也就是唯一和創建SpringBoot項目不同的地方。
這一步還是和SpringBoot項目一樣,直接點擊完成就可以了。
下圖就是項目的架構圖,比較簡單和SpringBoot一樣,唯一的區別就是pom.xml中的不同,也就是依賴不同。
下面我啟動直接啟動項目看一下運行結果。啟動日志:
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的項目中是可以正常啟動的。雖然項目拋出了異常,但項目已經啟動成功了,因為日志已經正確的輸出了項目的端口了。下面我們直接訪問這個端口,看看會返回什么信息。訪問地址:
@EnableEurekaServer注解
看上面的返回結果我們應該很熟悉,這是因為我們沒有寫Controller導致的,在SpringBoot的文章中我們介紹過,這里就不詳細介紹了。但這顯然是不對的,因為剛剛我們介紹過SpringCloud中是使用Eureka來提供注冊中心服務的,并且Eureka有客戶端和服務端之分,所以我們只在項目添加了Eureka的依賴還是不夠的,我們還要在項目的代碼中添加注解,來標識當前的Eureka服務是客戶端服務還是服務端服務。這也就是本篇介紹的第一個注解。也就是@EnableEurekaServer注解。我們只要將該注解添加到SpringCloud項目中的啟動類中即可。具體代碼如下:
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
看上述日志,項目啟動時還是會拋出異常,我們先不用考慮,在后續的內容中我們在解釋為什么啟動時會拋出異常。還是和第一次啟動一樣,雖然啟動拋出異常了,但項目還是啟動成功了。下面我們繼續訪問以下地址,看一下訪問結果。
返回結果:
自定義注冊中心地址
我們看這回返回的不是默認的錯誤頁面了,而是返回了一個管理界面。這個管理界面就是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地址來看看此時的注冊中心和剛剛相比,是否有不一樣的地方。
修改默認項目名
我們看這時的注冊中心已經檢測到了有服務注冊了,只不過這個服務就是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修改為我們指定的項目名字了。
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服務端自己。
我們發現這時注冊中心已經檢測到不任何服務了。下面我們將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服務端一樣從創建項目開始。具體步驟如下:
我們還是在IDEA中選擇Spring Initializr選項。也就是如下圖所示:
設置項目的相關參數,和Eureka服務端沒有任何區別。
這一步非常關鍵,因為它和Eureka服務端和SpringBoot都是不一樣的。
備注:為了保證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導致的,少了一個依賴我們只要把缺少的依賴添加上即可。缺少的依賴如下:
org.springframework.boot
spring-boot-starter-web
下面我們繼續啟動Eureka客戶端,然后看看注冊中心是否可以檢測到Eureka客戶端。
這時我們發現注冊中心已經成功的檢測到了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服務端后,在看一下注冊中心中的變化。
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注冊中心:
8762注冊中心:
我們看我們的Eureka客戶端只配置了一個注冊中心,但兩個注冊中心都檢測到了Eureka客戶端的存在。這就是剛剛提到過的當兩個注冊中心彼此注冊時,就會進行數據通信,所以8762注冊中心也檢測到了該Eureka客戶端的存在。下面我們將8761注冊中心停止服務,然后在觀察一下8762的注冊中心,看看是否有何變化。
8762注冊中心:
我們發現雖然我們將8761注冊中心停止了服務,但8762注冊中心依然檢測到了Eureka客戶端的存在。下面我們重新啟動一下Eureka客戶端然后在看一下8762注冊中心還是否可以檢測到Eureka客戶端的存在。
這時我們發現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
這時我們在訪問一下注冊中心,看一下服務是否可以檢測到。
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客戶端的服務,及其它注冊中心的存在。
我們看注冊中心已經成功的檢測到了Eureka客戶端的服務了,并且紅色標識的地方已經檢測到了其它兩個注冊中心的地址了,所以我們在訪問注冊中心時,就可以通過下面紅色標識的地方,來了解項目中的Eureka服務端有幾個注冊中心。
上述內容就是SpringClould中Eureka組件的詳細介紹,如有不正確或者需要交流的歡迎留言,下一篇我們將介紹怎么在SpringClould中進行不同的服務與服務之間的調用。謝謝。
項目源碼
原文鏈接
總結
以上是生活随笔為你收集整理的eureka java_SpringCloud注册中心Eureka的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python机器学习笔记:ID3决策树算
- 下一篇: 面对如今互联网时代,孩子需要什么样的教育