2018-06-16-Spring cloud(2)-服務發(fā)現(xiàn)(Eureka昨悼,Consul)

在分布式系統(tǒng)領(lǐng)域有個著名的CAP定理C-數(shù)據(jù)一致性蝗锥;A-服務可用性P-服務對網(wǎng)絡分區(qū)故障的容錯性率触,這三個特性在任何分布式系統(tǒng)中不能同時滿足终议,最多同時滿足兩個);
eureka是AP,zookeeper是CP葱蝗。對于服務發(fā)現(xiàn)而言穴张,可用性數(shù)據(jù)一致性更加重要——AP勝過CP

Consul zookeeper euerka etcd
服務健康檢查 服務狀態(tài),內(nèi)存两曼,硬盤等 (弱)長連接皂甘,keepalive 可配支持 連接心跳
多數(shù)據(jù)中心 支持
kv存儲服務 支持 支持 支持
一致性 raft paxos raft
CAP ca cp ap cp
使用接口(多語言能力) 支持http和dns 客戶端 http(sidecar) http/grpc
watch支持(客戶端觀察到服務提供者變化) 全量/支持long polling 支持 支持long polling/大部分增量 支持long polling
自身監(jiān)控 metrics metrics metrics
安全 acl /https acl https支持(弱)
spring cloud集成 已支持 已支持 已支持 已支持
  • raft:Raft強依賴 Leader 節(jié)點的可用性來確保集群數(shù)據(jù)的一致性。

    raft

  • paxos: 第一次由提交者Leader向所有其他服務器發(fā)出prepare消息請求準備悼凑,所有服務器中大多數(shù)如果回復諾言承諾就表示準備好了偿枕,可以接受寫入;第二次提交者向所有服務器發(fā)出正式建議propose户辫,所有服務器中大多數(shù)如果回復已經(jīng)接收就表示成功了渐夸。

  • long polling:長輪詢,客戶端向服務器發(fā)送Ajax請求渔欢,服務器接到請求后hold住連接墓塌,直到有新消息才返回響應信息并關(guān)閉連接,客戶端處理完響應信息后再向服務器發(fā)送新的請求奥额。

  • metrics:作為一款監(jiān)控指標的度量類庫苫幢,它提供了很多模塊可以為第三方庫或者應用提供輔助統(tǒng)計信息, 它還可以將度量數(shù)據(jù)發(fā)送給Ganglia和Graphite以提供圖形化的監(jiān)控

  • Eureka的自我保護模式
    Eureka Server在運行期間垫挨,會統(tǒng)計心跳失敗的比例在15分鐘之內(nèi)是否
    低于85%态坦,如果出現(xiàn)低于的情況(實際在
    生產(chǎn)環(huán)境上通常是由于網(wǎng)
    絡不穩(wěn)定導致),Eureka Server會將當前的實例注冊信息保護起來棒拂,同時提
    示警告伞梯。保護模式主要用于一組客戶端和Eureka Server之間存在網(wǎng)絡分
    區(qū)場景下的保護玫氢。一旦進入保護模式,Eureka Server將會嘗試保護其服務注
    冊表中的信息谜诫,不再刪除服務注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務)漾峡。
    所以Eureka的哲學是,同時保留”好數(shù)據(jù)“”壞數(shù)據(jù)“總比丟掉任何”好數(shù)據(jù)“要更好喻旷,所以這種模式在實踐中非常有效生逸。,

為啥不使用zookeeper做發(fā)現(xiàn)服務呢且预?

  1. ZooKeeper是分布式協(xié)調(diào)服務槽袄,它的職責是保證數(shù)據(jù)(注:配置數(shù)據(jù),狀態(tài)數(shù)據(jù))在其管轄下的所有服務之間保持同步锋谐、一致遍尺;(強一致性)
  2. 發(fā)現(xiàn)服務的核心應該是需要強調(diào)服務的高可用
  3. ZooKeeper使用單一主進程Leader用于處理客戶端所有事務請求,采用ZAB協(xié)議將服務器數(shù)狀態(tài)以事務形式廣播到所有Follower上涮拗;如果三臺服務掛了兩臺怎么選出leader乾戏;1 不大于 (3/2)=1的
  4. 正確的設置與維護ZooKeeper服務就非常的困難
  5. 集群中出現(xiàn)了網(wǎng)絡分割的故障(交換機故障導致交換機底下的子網(wǎng)間不能互訪)ZooKeeper會將它們都從自己管理范圍中剔除出去三热,外界就不能訪問到這些節(jié)點了鼓择,本身這些節(jié)點是“健康”的,能提供服務的
  6. 發(fā)現(xiàn)服務就算是返回了包含不實的信息的結(jié)果也比什么都不返回要好(因為暫時的網(wǎng)絡故障而找不到可用的服務器)

因此就漾, Eureka可以很好的應對因網(wǎng)絡故障導致部分節(jié)點失去聯(lián)系的情況呐能,而不會像zookeeper那樣使整個注冊服務癱瘓。

Spring Cloud Eureka(服務注冊)

  • 添加依賴
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
  • 開啟服務注冊

通過 @EnableEurekaServer注解啟動一個服務注冊中心提供給其他應用進行對話,這個注解需要在springboot工程的啟動application類上加

    package io.ymq.example.eureka.server;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServerApplication.class, args);
        }
    }

Spring Cloud Service Provider(服務提供者)

  • 服務提供方
  • 將自身服務注冊到 Eureka 注冊中心抑堡,從而使服務消費方能夠找到
  • 添加依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
  • 開啟服務注冊
    在應用主類中通過加上 @EnableEurekaClient摆出,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient夷野。需要配置才能找到Eureka注冊中心服務器
    discovery service有許多種實現(xiàn)(eureka、consul荣倾、zookeeper等)
    @EnableDiscoveryClient基于spring-cloud-commons,
    @EnableEurekaClient基于spring-cloud-netflix悯搔。
    就是如果選用的注冊中心是eureka,那么就推薦@EnableEurekaClient舌仍,
    如果是其他的注冊中心妒貌,那么推薦使用@EnableDiscoveryClient
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }
}
  • 添加配置 application.yml
    添加配置找到Eureka服務器
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
spring:
  application:
    name: eureka-provider
server:
  port: 8081

Spring Cloud Service Consumer(服務消費者)

Eureka注冊服務铸豁,消費者使用Ribbon開啟負載均衡

Ribbon是什么灌曙?

RibbonNetflix發(fā)布的開源項目,主要功能是提供客戶端的軟件負載均衡算法节芥,將Netflix的中間層服務連接在一起在刺。Ribbon客戶端組件提供一系列完善的配置項如連接超時逆害,重試等。簡單的說蚣驼,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器魄幕,Ribbon會自動的幫助你基于某種規(guī)則(如簡單輪詢,隨即連接等)去連接這些機器颖杏。我們也很容易使用Ribbon實現(xiàn)自定義的負載均衡算法纯陨。

Ribbon的核心組件

Ribbon在工作時首選會通過ServerList來獲取所有可用的服務列表,然后通過ServerListFilter過慮掉一部分地址留储,最后在剩下的地址中通過IRule選擇出一臺服務器作為最終結(jié)果翼抠。

  • ServerList:用于獲取地址列表。它既可以是靜態(tài)的(提供一組固定的地址)获讳,也可以是動態(tài)的(從注冊中心中定期查詢地址列表)阴颖。
  • ServerListFilter:僅當使用動態(tài)ServerList時使用,用于在原始的服務列表中使用一定策略過慮掉一部分地址赔嚎。
  • IRule:選擇一個最終的服務地址作為LB結(jié)果膘盖。選擇策略有輪詢、根據(jù)響應時間加權(quán)尤误、斷路器(當Hystrix可用時)等侠畔。

Ribbon提供的主要負載均衡策略

  • 簡單輪詢負載均衡(RoundRobin) 以輪詢的方式依次將請求調(diào)度不同的服務器,即每次調(diào)度執(zhí)行i = (i + 1) mod n损晤,并選出第i臺服務器软棺。
  • 隨機負載均衡 (Random) 隨機選擇狀態(tài)為UP的Server
  • 加權(quán)響應時間負載均衡 (WeightedResponseTime) 根據(jù)相應時間分配一個weight,相應時間越長尤勋,weight越小喘落,被選中的可能性越低。
  • 區(qū)域感知輪詢負載均衡(ZoneAvoidanceRule) :復合判斷server所在區(qū)域的性能和server的可用性選擇server

服務提供者(提供服務)

  • 開啟服務注冊
    注冊三臺
@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {
    @Value("${server.port}")
    String port;
    @RequestMapping("/")
    public String home() {
        return "Hello world ,port:" + port;
    }
    public static void main(String[] args) {
        SpringApplication.run(EurekaProviderApplication.class, args);
    }
}
  • 添加配置 application.yml
    端口依次為8081,8082,8083
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: eureka-provider

server:
  port: 8081

服務消費者(依賴于其它服務)

  • pom.xml添加依賴
<!-- 客戶端負載均衡 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<!-- eureka客戶端 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
  • 開啟服務負載均衡
    通過@EnableDiscoveryClient向服務注冊中心注冊最冰;并且向程序的ioc注入一個bean: restTemplate并通過@LoadBalanced注解表明這個restRemplate開啟負載均衡的功能
@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {
    @LoadBalanced
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(RibbonConsumerApplication.class, args);
    }
}
  • 消費提供者方法
/**
 * 描述:調(diào)用提供者的 `home` 方法
 **/
@RestController
public class ConsumerController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping(value = "/hello")
    public String hello() {
        return restTemplate.getForEntity("http://eureka-provider/", String.class).getBody();
    }
}
  • 添加配置 application.yml
    指定服務的注冊中心地址瘦棋,配置自己的服務端口,服務名稱
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: ribbon-consumer

server:
  port: 9000

依次啟動服務(Eureka服務暖哨,三臺service provider和service Consumer)赌朋,查看ribbon是否開啟負載均衡

Spring Cloud Consul(針對Consul的服務治理實現(xiàn))

由于Consul自身提供了服務端,所以我們不需要像之前實現(xiàn)Eureka的時候創(chuàng)建服務注冊中心篇裁,直接通過下載consul的服務端程序就可以使用沛慢。
Consul內(nèi)置了服務注冊發(fā)現(xiàn)框架(一站式)、具有以下性質(zhì)(參考上面列表):

  • 分布一致性協(xié)議實現(xiàn)
  • 健康檢查
  • Key/Value存儲
  • 多數(shù)據(jù)中心方案

Consul的優(yōu)勢

  • 使用 Raft 算法來保證一致性, 比復雜的 Paxos 算法更直接
  • 支持多數(shù)據(jù)中心达布,內(nèi)外網(wǎng)的服務采用不同的端口進行監(jiān)聽
  • 多數(shù)據(jù)中心集群可以避免單數(shù)據(jù)中心的單點故障,而其部署則需要考慮網(wǎng)絡延遲, 分片等情況等
  • 支持健康檢查
  • 支持 http 和 dns 協(xié)議接口
  • 官方提供web管理界面

Consul的角色

  • client:客戶端, 無狀態(tài), 將 HTTP 和 DNS 接口請求轉(zhuǎn)發(fā)給局域網(wǎng)內(nèi)的服務端集群团甲,所有注冊到當前節(jié)點的服務會被轉(zhuǎn)發(fā)到server,本身是不持久化這些信息
  • server:服務端, 保存配置信息, 高可用集群, 在局域網(wǎng)內(nèi)與本地客戶端通訊,功能和client都一樣黍聂,唯一不同的是躺苦,它會把所有的信息持久化的本地身腻,這樣遇到故障,信息是可以被保留的圾另。 通過廣域網(wǎng)與其他數(shù)據(jù)中心通訊. 每個數(shù)據(jù)中心的 server 數(shù)量推薦為 3 個或是 5 個.
  • server-leader:表明這個server是它們的老大霸株,它和其它server不一樣的一點是,它需要負責同步注冊的信息給其它的server集乔,同時也要負責各個節(jié)點的健康監(jiān)測去件。
  • raft:server節(jié)點之間的數(shù)據(jù)一致性保證,一致性協(xié)議使用的是raft扰路,而zookeeper用的paxos尤溜,etcd采用的也是taft。
  • 服務發(fā)現(xiàn)協(xié)議:consul采用http和dns協(xié)議汗唱,etcd只支持http
  • 服務注冊:支持兩種方式實現(xiàn)服務注冊宫莱,consul官方建議使用第二種方式。
  1. 一種是通過consul的服務注冊http API哩罪,由服務自己調(diào)用API實現(xiàn)注冊授霸,
  2. 另一種方式是通過json個是的配置文件實現(xiàn)注冊,將需要注冊的服務以json格式的配置文件給出际插。
  • 服務發(fā)現(xiàn):支持兩種方式實現(xiàn)服務發(fā)現(xiàn)碘耳,
  1. 一種是通過http API來查詢有哪些服務,
  2. 另外一種是通過consul agent 自帶的DNS(8600端口)框弛,域名是以NAME.service.consul的形式給出辛辨,NAME即在定義的服務配置文件中,服務的名稱瑟枫。DNS方式可以通過check的方式檢查服務斗搞。
  • 服務間的通信協(xié)議:Consul使用gossip協(xié)議管理成員關(guān)系、廣播消息到整個集群

結(jié)語

關(guān)于consul的環(huán)境搭建以及應用后續(xù)再補充吧~
github上有關(guān)于Spring Cloud完整的部署慷妙。
其它相關(guān)文章
Spring cloud(1)-簡介以及選擇
Spring cloud(2)-服務發(fā)現(xiàn)(Eureka僻焚,Consul)
Spring cloud(3)-負載均衡(Feign,Ribbon)
Spring cloud(4)-熔斷(Hystrix)
Spring cloud(5)-路由網(wǎng)關(guān)(Zuul)
Spring cloud(6)-配置管理及刷新(Config膝擂,Bus)
最后虑啤,給個 star 吧~
個人博客~
簡書~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猿挚,隨后出現(xiàn)的幾起案子咐旧,更是在濱河造成了極大的恐慌驶鹉,老刑警劉巖绩蜻,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異室埋,居然都是意外死亡办绝,警方通過查閱死者的電腦和手機伊约,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孕蝉,“玉大人屡律,你說我怎么就攤上這事〗祷矗” “怎么了超埋?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佳鳖。 經(jīng)常有香客問我霍殴,道長,這世上最難降的妖魔是什么系吩? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任来庭,我火速辦了婚禮,結(jié)果婚禮上穿挨,老公的妹妹穿的比我還像新娘月弛。我一直安慰自己,他們只是感情好科盛,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布帽衙。 她就那樣靜靜地躺著,像睡著了一般土涝。 火紅的嫁衣襯著肌膚如雪佛寿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天但壮,我揣著相機與錄音冀泻,去河邊找鬼。 笑死蜡饵,一個胖子當著我的面吹牛弹渔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溯祸,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼肢专,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焦辅?” 一聲冷哼從身側(cè)響起博杖,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筷登,沒想到半個月后剃根,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年蒂萎,在試婚紗的時候發(fā)現(xiàn)自己被綠了架专。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸氮。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡膝蜈,死狀恐怖熬甫,靈堂內(nèi)的尸體忽然破棺而出粟耻,到底是詐尸還是另有隱情夕冲,我是刑警寧澤渣慕,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布嘶炭,位于F島的核電站,受9級特大地震影響逊桦,放射性物質(zhì)發(fā)生泄漏旱物。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一卫袒、第九天 我趴在偏房一處隱蔽的房頂上張望宵呛。 院中可真熱鬧,春花似錦夕凝、人聲如沸宝穗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逮矛。三九已至,卻和暖如春转砖,著一層夾襖步出監(jiān)牢的瞬間须鼎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工府蔗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晋控,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓姓赤,卻偏偏與公主長得像赡译,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子不铆,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容