二、Eureka 服務端
1、新建一個 maven module 子項目 microservicecloud-eureka-server
2、pom.xml
<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.atguigu.springcloud</groupId> <artifactId>microservicecloud</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>microservicecloud-config-eureka-client-7001</artifactId> <dependencies> <!-- SpringCloudConfig配置 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- 熱部署插件 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> </project>
3、application.yml
server:
port: 7001
eureka: instance: hostname: localhost #eureka 服務端實例名稱
client: register-with-eureka: false #false 表示不向注冊中心中注冊自己
fetch-registry: false #false 表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與 Eureka Server 交互的地址查詢服務和注冊服務都需要依賴這個地址(服務暴露的地址)
4、主啟動類
@SpringBootApplication @EnableEurekaServer public class EurekaServer7001_application { public static void main(String[] args) { SpringApplication.run(EurekaServer7001_application.class, args); } }
5、運行結果
三、Eureka 客戶端 (將服務注冊到 Eureka)
1、pom.xml 添加以下內容
<!-- 將微服務provider側注冊進eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2、application.yml
eureka: client: #客戶端注冊進eureka服務列表內
service-url: defaultZone: http://localhost:7001/eureka #這個地址就是在 Eureka 服務端的 application.yml 上暴露出的服務地址(這行后面加注釋,可能會報錯)
3、主啟動類
@SpringBootApplication @EnableEurekaClient //本服務啟動后,會自動注冊到 Eureka 服務中 public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class, args); } }
4、測試
四、actuator 與注冊微服務信息完善
1、主機名稱:服務名稱的修改
2、訪問信息提示 IP 信息
3、微服務 info 內容詳細信息
在總父工程的 pom.xml 文件中添加以下內容
<build> <!-- 父工程的名稱 --> <finalName>microservicecloud</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <!-- 讀取 src/main/resources 資源目錄下,以 $ 開頭和 $ 符號結尾的配置文件信息--> <delimiters> <delimit>$</delimit> </delimiters> </configuration> </plugin> </plugins> </build>
在每個服務提供者的 pom.xml 文件中添加以下內容
<!-- actuator監控信息完善 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在每個服務提供者的 application.yml 文件中添加以下內容 ( 其實是 添加對該服務的描述信息 )
info:
app.name: fw-microservicecloud
company.name: www.fw.com
build.artifactId: $project.artifactId$
build.version: $project.version$
五、Eurake 自我保護機制
一、是什么
某時某刻一個微服務不可用了,Eurake 不會立即清理,依舊會對該微服務的信息進行保存
二、導致原因
默認情況下,如果 EurakeServer 在一定時間內沒有接收到某個服務實例的心跳,EurakeServer 將會注銷實例(默認90秒)。但是當網絡分區故障發生時,微服務與 EurakeServer 之間無法正常通信,以上行為可能變的非常危險,因為微服務本身是健康的,此時本不應該注銷這個服務。Eurake 通過“自我保護”來解決這個問題,當 EurakeServer 節點在短時間內丟失過多客戶時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,EurakeServer 就會保護服務注冊表中的信息,不在刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當故障恢復后,該 EurakeServer 節點會自動退出自我保護模式。
六、服務的發現
七、Eurake 集群配置
Eurake 服務端的 application.yml 修改如下內容
server: port: 7001
eureka: instance: hostname: eureka7001.com #eureka服務端的實例名稱
client: register-with-eureka: false #false表示不向注冊中心注冊自己。
fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址(單機)。
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ # 將 7001 和 7002 和 7003 配置成集群環境
Eurake 客戶端(服務的提供者)的 application.yml 修改如下內容
eureka: client: #客戶端注冊進eureka服務列表內
service-url: #defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ #連接集群環境
八、Eureka 比 Zookeeper 好在哪里
傳統關系型數據庫 ACID
A:原子性:事務里面的所有操作,要么全部做完,要么都不做,只要有一個失敗,整個事務都失敗,需要回滾
C:一致性:以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論並發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性
I:隔離性:並發的事務之間互不影響
D:持久性:事務一旦提交,數據將永久保存在數據庫上
NoSQL 數據庫 CAP
C:強一致性:在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)
A:可用性:在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)
P:分區容錯性:以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇。(在分布式環境下,這個 p ,一定要實現)
zookeeper 保證 CP
當向注冊中心查詢服務列表時,我們可以容忍注冊中心返回的是幾分鍾以前的信息,但不能就收服務直接 down 掉不可用。也就是說服務注冊的可用性要高於一致性
當時 zk 會出現這么一個情況,當 mastr 節點因網絡故障和其他節點失去聯系時,剩余節點會重新進行選舉。問題在於,選舉時間比較長,30s~120s,且選舉期間,整個 zk 是不可用的。這就導致了在選舉期間,注冊服務的癱瘓。在雲部署的環境下,因網絡問題使 zk 集群時區 master 節點是交大概率會發生的事情,雖然服務能夠最終恢復,但是漫長的選舉時間導致的注冊服務長期不可用是不能容忍的。
Eureka 保證 AP
Eureka 明白這一點,因此在設計時,就優先保證可用性.Eureka 各個節點是平等的,幾個節點掛掉不會影響正常工作,只要有一台 Eureka 存在,就可以保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka 還有一種自我保護機制,如果在 15 分鍾內超過 85% 的節點沒有正常的心跳,那么 Eureka 就會認為客戶端與注冊中心出現了故障,此時會出現以下幾種情況:
1、Eureka 不再從注冊列表中移出因長時間沒收到心跳而應該過期的服務
2、Eureka 仍然能夠接受新服務的注冊和查詢要求,但是不會被同步到其他節點上(即保證當前節點依然可用)
3、當網絡穩定時,當前實例新的注冊信息會被同步到其他節點中
結論
Eureka 可以很好的應對因網絡故障導致部分節點失去聯系的情況,而不會像 zookeeper 那樣使整個祖冊服務癱瘓