不一樣節點Eureka Server經過Replicate(複製)進行數據同步,服務啓動後向Eureka註冊,Eureka Server會將註冊信息向其餘Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務註冊中心獲取服務提供者地址(即:服務應用名,spring.application.name參數配置),而後會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。java
當服務註冊中心Eureka Server檢測到服務提供者由於宕機、網絡緣由不可用時,則在服務註冊中心將服務置爲DOWN狀態,並把當前服務提供者狀態向訂閱者發佈,訂閱過的服務消費者更新本地緩存。spring
服務提供者在啓動後,週期性(默認30秒)向Eureka Server發送心跳,以證實當前服務是可用狀態。Eureka Server在必定的時間(默認90秒)未收到客戶端的心跳,則認爲服務宕機,註銷該實例。apache
(1)因爲服務消費者本地緩存了服務提供者的地址,即便Eureka Server宕機,也不會影響服務之間的調用,可是一但新服務上線,已經在緩存在本地的服務提供者不可用了,服務消費者也沒法知道。
(2)當有成千上萬個服務向服務註冊中心註冊的時候,註冊中心的負載是很是高的。
(3)在分佈式系統中,任何地方存在單點故障,整個系統就不是高可用的。segmentfault
1.基於SpringCloud 服務註冊與發現(Eureka)建立一個mode工程緩存
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.definesys</groupId> <artifactId>my_cloud</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.definesys</groupId> <artifactId>eureka-server3</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server3</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.在resources目錄下建立application.yml網絡
spring: application: name: eureka-server3 profiles: active: server1 --- server: port: 11111 spring: profiles: server1 eureka: instance: hostname: server1 client: #register-with-eureka: false #fetch-registry: false serviceUrl: defaultZone: http://server2:11112/eureka/ --- server: port: 11112 spring: profiles: server2 eureka: instance: hostname: server2 client: #register-with-eureka: false #fetch-registry: false serviceUrl: defaultZone: http://server1:11111/eureka/
3.修改host文件添加對application.yml配置文件中hostname的映射app
10.60.52.40 server1 10.60.52.40 server2
4.修改啓動類maven
@SpringBootApplication @EnableEurekaServer public class EurekaServer3Application { public static void main(String[] args) { SpringApplication.run(EurekaServer3Application.class, args); } }
5.啓動項目
在idea中把項目的Single instance only給去掉,這樣一個項目就能夠啓動多個實例。啓動項目,在啓動項目的時候回發現控制檯報錯,由於如今只啓動了一個節點,向server2註冊時鏈接拒絕(java.net.ConnectException: Connection refused: connect)等第二個實例啓動後就不會再報錯。而後修改配置文件中profiles:active: server1,修改成server2,再次啓動項目。
訪問http://localhost:11111/
訪問:http://localhost:11112/
能夠看出兩個註冊中心分別註冊了對方。分佈式
1.建立Eureka Client
修改sayHello項目中的配置文件,向註冊中心中註冊。通常在eureka.client.service-url.defaultZone中會把全部註冊中心的地址寫上,雖說註冊中心能夠經過複製的方式進行數據同步。把全部地址都寫上能夠保證若是第一個註冊中心不可用時會選擇其餘的註冊中心進行註冊。ide
server.port=2222 spring.application.name=say-hello eureka.client.service-url.defaultZone=http://server2:11112/eureka/,http://server1:11111/eureka/
2.啓動client
訪問http://localhost:11111/
訪問http://localhost:11112/
發現say-hello已經註冊到這兩個註冊中心中了
3.關閉eureka server1
訪問http://localhost:11111/
訪問http://localhost:11112/
發現say-hello的實例還在在eureka server2中。
這時候會發現eureka server2控制檯一直在報錯,server2開啓自我保護機制。4.重啓eureka server1後,控制檯報錯中止,eureka server2關閉自我保護。同時eureka server1會同步eureka server2的實例。