1、 什么是注冊中心
注冊中心可以說是微服務架構中的”通訊錄“,它記錄了服務和服務地址的映射關系。在分布式架構中,服務會注冊到這里,當服務需要調(diào)用其它服務時,就到這里找到服務的地址,進行調(diào)用。
服務提供者provider: 啟動的時候向注冊中心上報自己的網(wǎng)絡信息。
服務消費者consumer: 啟動的時候向注冊中心上報自己的網(wǎng)絡信息,拉取provider的相關網(wǎng)絡信息。
2 、為什么需要注冊中心
微服務應用和機器越來越多,調(diào)用方需要知道接口的網(wǎng)絡地址,如果靠配置文件的方式去控制網(wǎng)絡地址,對于動態(tài)新增機器,維護帶來很大問題。
- 主流的注冊中心:zookeeper、Eureka、consul、etcd 等
3、分布式應用知識CAP定理
CAP定理:指的是在一個分布式系統(tǒng)中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯性),三者不可同時獲得。
- 一致性(C):在分布式系統(tǒng)中的所有數(shù)據(jù)備份,在同一時刻是否同樣的值。(所有節(jié)點在同一時間的數(shù)據(jù)完全一致,越多節(jié)點,數(shù)據(jù)同步越耗時)。
- 可用性(A):負載過大后,集群整體是否還能響應客戶端的讀寫請求。(服務一直可用,而且是正常響應時間)。
- 分區(qū)容錯性(P):分區(qū)容忍性,就是高可用性,一個節(jié)點崩了,并不影響其它的節(jié)點(100個節(jié)點,掛了幾個,不影響服務,越多機器越好)。
4、分布式系統(tǒng)CAP注冊中心選擇
CAP三者不可同時獲得的原因:
- C A 滿足的情況下,P不能滿足的原因:
數(shù)據(jù)同步(C)需要時間,也要正常的時間內(nèi)響應(A),那么機器數(shù)量就要少,所以P就不滿足。 - CP 滿足的情況下,A不能滿足的原因:
數(shù)據(jù)同步(C)需要時間, 機器數(shù)量也多(P),但是同步數(shù)據(jù)需要時間,所以不能再正常時間內(nèi)響應,所以A就不滿足。 - AP 滿足的情況下,C不能滿足的原因:
機器數(shù)量也多(P),正常的時間內(nèi)響應(A),那么數(shù)據(jù)就不能及時同步到其他節(jié)點,所以C不滿足。
注冊中心選擇:
- Zookeeper:CP設計,保證了一致性,集群搭建的時候,某個節(jié)點失效,則會進行選舉行的leader,或者半數(shù)以上節(jié)點不可用,則無法提供服務,因此可用性沒法滿足
-
Eureka:AP原則,無主從節(jié)點,一個節(jié)點掛了,自動切換其他節(jié)點可以使用,去中心化
注冊中心對比圖:
結論:沒有最好的選擇,最好是根據(jù)業(yè)務場景來進行架構設計
注冊中心對比圖
5、注冊中心搭建(使用IDEA)
File --> New -->Project
-
拉取項目
打開項目在啟動類添加注解@EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 增加配置application.yml
(配置文件默認是application.properties格式,如需修改為yml直接重命名即可)
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
#聲明自己是個服務端
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 啟動項目 訪問注冊中心頁面
http:// localhost:8761
6、創(chuàng)建服務提供者向注冊中心上報
-
如上所示創(chuàng)建注冊中心一樣創(chuàng)建項目,不同的是選擇依賴如下:
-
開發(fā)接口
- 增加配置application.yml
server:
port: 8771
#服務的名稱
spring:
application:
name: product-service
#指定注冊中心地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- 啟動服務
此時訪問注冊中心地址:http:// localhost:8761 就可以看到如下注冊的服務了
7、Eureka服務注冊中心配置控制臺問題
-
eureka管理后臺出現(xiàn)一串紅色字體:是警告,說明有服務上線率低
由于自我保護模式默認是開啟狀態(tài)
關閉檢查方法:eureka服務端配置文件加入
server:
enable-self-preservation: false
注意:不建議關閉,因為關閉會導致如若因為網(wǎng)絡問題沒上報至注冊中心的服務也會被認為掛掉而清除掉了此服務。
- 為什么只加一個注冊中心地址,就可以注冊,而且很多資料顯示啟動類加注解@EnableEurekaClient
查閱官網(wǎng),給出解釋如下:官方文檔:http://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html#spring-cloud-eureka-server








