Spring Cloud Eureka Consul使用和對比

Spring Cloud簡介

最大的區別是Eureka保證AP, Consul為CP。

Consul強一致性(C)帶來的是:

服務注冊相比Eureka會稍慢一些。因為Consul的raft協議要求必須過半數的節點都寫入成功才認為注冊成功
Leader掛掉時,重新選舉期間整個consul不可用。保證了強一致性但犧牲了可用性。
Eureka保證高可用(A)和最終一致性:

服務注冊相對要快,因為不需要等注冊信息replicate到其他節點,也不保證注冊信息是否replicate成功
當數據出現不一致時,雖然A, B上的注冊信息不完全相同,但每個Eureka節點依然能夠正常對外提供服務,這會出現查詢服務信息時如果請求A查不到,但請求B就能查到。如此保證了可用性但犧牲了一致性。
其他方面,eureka就是個servlet程序,跑在servlet容器中; Consul則是go編寫而成。

這里就平時經常用到的服務發現的產品進行下特性的對比,首先看下結論:
?

服務的健康檢查
Euraka 使用時需要顯式配置健康檢查支持;Zookeeper,Etcd 則在失去了和服務進程的連接情況下任務不健康,而 Consul 相對更為詳細點,比如內存是否已使用了90%,文件系統的空間是不是快不足了。

多數據中心支持
Consul 通過 WAN 的 Gossip 協議,完成跨數據中心的同步;而且其他的產品則需要額外的開發工作來實現;

KV 存儲服務
除了 Eureka ,其他幾款都能夠對外支持 k-v 的存儲服務,所以后面會講到這幾款產品追求高一致性的重要原因。而提供存儲服務,也能夠較好的轉化為動態配置服務哦。

產品設計中 CAP 理論的取舍
Eureka 典型的 AP,作為分布式場景下的服務發現的產品較為合適,服務發現場景的可用性優先級較高,一致性并不是特別致命。其次 CA 類型的場景 Consul,也能提供較高的可用性,并能 k-v store 服務保證一致性。 而Zookeeper,Etcd則是CP類型 犧牲可用性,在服務發現場景并沒太大優勢;

多語言能力與對外提供服務的接入協議
Zookeeper的跨語言支持較弱,其他幾款支持 http11 提供接入的可能。Euraka 一般通過 sidecar的方式提供多語言客戶端的接入支持。Etcd 還提供了Grpc的支持。 Consul除了標準的Rest服務api,還提供了DNS的支持。

Watch的支持(客戶端觀察到服務提供者變化)
Zookeeper 支持服務器端推送變化,Eureka 2.0(正在開發中)也計劃支持。 Eureka 1,Consul,Etcd則都通過長輪詢的方式來實現變化的感知;

自身集群的監控
除了 Zookeeper ,其他幾款都默認支持 metrics,運維者可以搜集并報警這些度量信息達到監控目的;

安全
Consul,Zookeeper 支持ACL,另外 Consul,Etcd 支持安全通道https.

Spring Cloud的集成
目前都有相對應的 boot starter,提供了集成能力。

總的來看,目前Consul 自身功能,和 spring cloud 對其集成的支持都相對較為完善,而且運維的復雜度較為簡單(沒有詳細列出討論),Eureka 設計上比較符合場景,但還需持續的完善。?

Spring Cloud是一個基于Spring Boot實現的云應用開發工具,它為基于JVM的云應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和集群狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud包含了多個子項目(針對分布式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。

微服務架構

“微服務架構”在這幾年非常的火熱,以至于關于微服務架構相關的開源產品被反復的提及(比如:netflix、dubbo),Spring Cloud也因Spring社區的強大知名度和影響力也被廣大架構師與開發者備受關注。

那么什么是“微服務架構”呢?簡單的說,微服務架構就是將一個完整的應用從數據存儲開始垂直拆分成多個不同的服務,每個服務都能獨立部署、獨立維護、獨立擴展,服務與服務間通過諸如RESTful API的方式互相調用。

對于“微服務架構”,大家在互聯網可以搜索到很多相關的介紹和研究文章來進行學習和了解。也可以閱讀始祖Martin Fowler的《Microservices》(中文版翻譯點擊查看),本文不做更多的介紹和描述。

服務治理

在簡單介紹了Spring Cloud和微服務架構之后,下面回歸本文的主旨內容,如何使用Spring Cloud來實現服務治理。

由于Spring Cloud為服務治理做了一層抽象接口,所以在Spring Cloud應用中可以支持多種不同的服務治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實現,并且不影響任何其他的服務注冊、服務發現、服務調用等邏輯。

所以,下面我們通過介紹兩種服務治理的實現來體會Spring Cloud這一層抽象所帶來的好處。

Spring Cloud Eureka

首先,我們來嘗試使用Spring Cloud Eureka來實現服務治理。

Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理模塊。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的注解,開發者就可以快速的在應用中配置一下常用模塊并構建龐大的分布式系統。它主要提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等。

下面,就來具體看看如何使用Spring Cloud Eureka實現服務治理。

創建“服務注冊中心”

創建一個基礎的Spring Boot工程,命名為eureka-server,并在pom.xml中引入需要的依賴內容:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.4.RELEASE</version><relativePath/>
</parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

通過@EnableEurekaServer注解啟動一個服務注冊中心提供給其他應用進行對話。這一步非常的簡單,只需要在一個普通的Spring Boot應用中添加這個注解就能開啟此功能,比如下面的例子:

@EnableEurekaServer
@SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(Application.class).web(true).run(args);}
}

在默認設置下,該服務注冊中心也會將自己作為客戶端來嘗試注冊它自己,所以我們需要禁用它的客戶端注冊行為,只需要在application.properties配置文件中增加如下信息:

spring.application.name=eureka-server
server.port=1001eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

為了與后續要進行注冊的服務區分,這里將服務注冊中心的端口通過server.port屬性設置為1001。啟動工程后,訪問:http://localhost:1001/,可以看到下面的頁面,其中還沒有發現任何服務。

創建“服務提供方”

下面我們創建提供服務的客戶端,并向服務注冊中心注冊自己。本文我們主要介紹服務的注冊與發現,所以我們不妨在服務提供方中嘗試著提供一個接口來獲取當前所有的服務信息。

首先,創建一個基本的Spring Boot應用。命名為eureka-client,在pom.xml中,加入如下配置:

<parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.4.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

其次,實現/dc請求處理接口,通過DiscoveryClient對象,在日志中打印出服務實例的相關內容。

@RestController
public class DcController {@AutowiredDiscoveryClient discoveryClient;@GetMapping("/dc")public String dc() {String services = "Services: " + discoveryClient.getServices();System.out.println(services);return services;}}

最后在應用主類中通過加上@EnableDiscoveryClient注解,該注解能激活Eureka中的DiscoveryClient實現,這樣才能實現Controller中對服務信息的輸出。

@EnableDiscoveryClient
@SpringBootApplication
public class Application {public static void main(String[] args) {new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);}
}

我們在完成了服務內容的實現之后,再繼續對application.properties做一些配置工作,具體如下:

spring.application.name=eureka-client
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

通過spring.application.name屬性,我們可以指定微服務的名稱后續在調用的時候只需要使用該名稱就可以進行服務的訪問。eureka.client.serviceUrl.defaultZone屬性對應服務注冊中心的配置內容,指定服務注冊中心的位置。為了在本機上測試區分服務提供方和服務注冊中心,使用server.port屬性設置不同的端口。

啟動該工程后,再次訪問:http://localhost:1001/。可以如下圖內容,我們定義的服務被成功注冊了。

當然,我們也可以通過直接訪問eureka-client服務提供的/dc接口來獲取當前的服務清單,只需要訪問:http://localhost:2001/dc,我們可以得到如下輸出返回:

Services: [eureka-client]

其中,方括號中的eureka-client就是通過Spring Cloud定義的DiscoveryClient接口在eureka的實現中獲取到的所有服務清單。由于Spring Cloud在服務發現這一層做了非常好的抽象,所以,對于上面的程序,我們可以無縫的從eureka的服務治理體系切換到consul的服務治理體系中區。

Spring Cloud Consul

Spring Cloud Consul項目是針對Consul的服務治理實現。Consul是一個分布式高可用的系統,它包含多個組件,但是作為一個整體,在微服務架構中為我們的基礎設施提供服務發現和服務配置的工具。它包含了下面幾個特性:

  • 服務發現
  • 健康檢查
  • Key/Value存儲
  • 多數據中心

由于Spring Cloud Consul項目的實現,我們可以輕松的將基于Spring Boot的微服務應用注冊到Consul上,并通過此實現微服務架構中的服務治理。

以之前實現的基于Eureka的示例(eureka-client)為基礎,我們如何將之前實現的服務提供者注冊到Consul上呢?方法非常簡單,我們只需要在pom.xml中將eureka的依賴修改為如下依賴:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

接下來再修改一下application.properites,將consul需要的配置信息加入即可,比如:(下面配置是默認值)

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

到此為止,我們將eureka-client轉換為基于consul服務治理的服務提供者就完成了。前文我們已經有提到過服務發現的接口DiscoveryClient是Spring Cloud對服務治理做的一層抽象,所以可以屏蔽Eureka和Consul服務治理的實現細節,我們的程序不需要做任何改變,只需要引入不同的服務治理依賴,并配置相關的配置屬性就能輕松的將微服務納入Spring Cloud的各個服務治理框架中。

下面可以嘗試讓consul的服務提供者運行起來。這里可能讀者會問,不需要創建類似eureka-server的服務端嗎?由于Consul自身提供了服務端,所以我們不需要像之前實現Eureka的時候創建服務注冊中心,直接通過下載consul的服務端程序就可以使用。

我們可以用下面的命令啟動consul的開發模式:

$consul agent -dev
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!Version: 'v0.7.2'Node name: 'Lenovo-zhaiyc'Datacenter: 'dc1'Server: true (bootstrap: false)Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: falseAtlas: <disabled>==> Log data will now stream in as it occurs:2017/06/22 07:50:54 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]2017/06/22 07:50:54 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc 127.0.0.12017/06/22 07:50:54 [INFO] consul: Adding LAN server Lenovo-zhaiyc (Addr: tcp/127.0.0.1:8300) (DC: dc1)2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc.dc1 127.0.0.12017/06/22 07:50:54 [INFO] consul: Adding WAN server Lenovo-zhaiyc.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)2017/06/22 07:51:01 [ERR] agent: failed to sync remote state: No cluster leader2017/06/22 07:51:02 [WARN] raft: Heartbeat timeout from "" reached, starting election2017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 22017/06/22 07:51:02 [DEBUG] raft: Votes needed: 12017/06/22 07:51:02 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 12017/06/22 07:51:02 [INFO] raft: Election won. Tally: 12017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state2017/06/22 07:51:02 [INFO] consul: cluster leadership acquired2017/06/22 07:51:02 [INFO] consul: New leader elected: Lenovo-zhaiyc2017/06/22 07:51:02 [DEBUG] consul: reset tombstone GC to index 32017/06/22 07:51:02 [INFO] consul: member 'Lenovo-zhaiyc' joined, marking health alive2017/06/22 07:51:02 [INFO] agent: Synced service 'consul'2017/06/22 07:51:02 [DEBUG] agent: Node info in sync

consul服務端啟動完成之后,我們再將之前改造后的consul服務提供者啟動起來。consul與eureka一樣,都提供了簡單的ui界面來查看服務的注冊情況:

更多關于Consul的使用指南,讀者可查看官方文檔:https://www.consul.io/

更多Spring Cloud內容請持續關注我的博客更新或在《Spring Cloud微服務實戰》中獲取。

代碼示例

樣例工程將沿用之前在碼云和GitHub上創建的SpringCloud-Learning項目,重新做了一下整理。通過不同目錄來區分Brixton和Dalston的示例。

  • 碼云:點擊查看
  • GitHub:點擊查看

具體工程說明如下:

  • eureka的服務注冊中心:eureka-server
  • eureka的服務提供方:eureka-client
  • consul的服務提供方:consul-client

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

符號 RUNOOB python練習題 51

用來練手的python練習題&#xff0c;原題鏈接: python練習實例51 python中的 & 和 | 使用過程中&#xff0c;變量類型不同&#xff0c;這兩個符號的作用也不同。 1. 對于數字變量&#xff0c;&\&& 和 ∣|∣ 用于逐位運算 # 二進制逐位邏輯與門運算 a 0b110…

Eclipse里的快捷鍵

MyEclipse 快捷鍵1(CTRL) ------------------------------------- Ctrl1 快速修復 CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類的繼承結構 CtrlW 關閉當前Editer CtrlK 快速定位到下一個 CtrlE 快…

Python打印楊輝三角形 RUNOOB python練習題61

用來練手的python練習題&#xff0c;原題鏈接: python練習實例61 題干: 打印出楊輝三角形 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 實現代碼如下: import numpy as nptable…

使用Docker快速搭建Tensorflow開發環境

當我剛開始學習使用scikit-learn時&#xff0c;總是會出現各種各樣的包依賴問題&#xff0c;兜兜轉轉了一遍才全部安裝好&#xff0c;現在的機器學習算法開發者大都使用tensorflow、pytorch來實現自己的想法&#xff0c;但依然會面臨各種包版本和依賴的問題&#xff0c;有一段時…

Java服務GC參數調優案例

這段時間在整理jvm系列的文章&#xff0c;無意中發現本文&#xff0c;作者思路清晰通過步步分析最終解決問題。我個人特別喜歡這種實戰類的內容&#xff0c;經原作者的授權同意&#xff0c;將文章分享于此。原文鏈接&#xff1a;Java服務GC參數調優案例&#xff0c;下面為轉載此…

RUNOOB python 67 數組的元素互換

用來練手的Python練習題&#xff0c;原題鏈接:python練習實例67 題干: 輸入數組&#xff0c;最大的與第一個元素交換&#xff0c;最小的與最后一個元素交換&#xff0c;輸出數組 代碼如下: import numpy as nptable np.array([10,4,9,3,11,25,37,15,2,231,672,22]) #定義sw…

11.13 ethtool:查詢網卡參數

ethtool命令用于查詢或設置網卡參數。ethtool [devname][rootlinuxprobe ~]# ethtool eth0Settings for eth0:Supported ports: [ TP ]Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supported pause frame use: NoSupports au…

微信小程序、微信公眾號、H5之間相互跳轉

一、小程序和公眾號 答案是&#xff1a;可以相互關聯。 在微信公眾號里可以添加小程序。 圖片有點小&#xff0c;我把文字打出來吧&#xff1a; 可關聯已有的小程序或快速創建小程序。已關聯的小程序可被使用在自定義菜單和模版消息等場景中。 公眾號可關聯同主體的10個小程…

數組元素前移后移 RUNOOB python練習題 68

用來練手的python練習題&#xff0c;原題鏈接: python練習實例68 題干: 有 n 個整數&#xff0c;使其前面各數順序向后移 m 個位置&#xff0c;最后 m 個數變成最前面的 m 個數 代碼如下: import numpy as np # 構造一個儲存了n個整數的numpy數組 def numbers_input(n):a n…

LRU緩存簡單實現

緩存接口定義 /*** 緩存接口* * author zhi**/ public interface ICache<K, V> {/*** 添加緩存數據* * param key* param value*/void put(K key, V value);/*** 獲取緩存數據* * param key* return*/V get(K key);/*** 刪除緩存數據* * param key* return*/V remove(K k…

Mac Eclipse安裝lombok

Lombok是一個可以通過注解的形式可以幫助消除一些必須但是顯得很臃腫的Java代碼的工具&#xff0c;通過使用對應的注解&#xff0c;可以在進行編譯源碼的時候生成對應的方法&#xff0c;比如類屬性的get/set/toString()/類的構造方法等. 下面記錄一下在Mac Eclipse是如何安裝Lo…

tf.reduce_sum()方法深度解析

首先看一下reduce_sum及其參數的注釋 : def tf.reduce_sum(input_tensor, axisNone, keepdimsFalse, nameNone) Computes the sum of elements across dimensions of a tensor. Reduces input_tensor along the dimensions given in axis. Unless keepdims is true, the rank o…

主成分分析(PCA)原理詳解_轉載

一、PCA簡介 1. 相關背景 在許多領域的研究與應用中&#xff0c;往往需要對反映事物的多個變量進行大量的觀測&#xff0c;收集大量數據以便進行分析尋找規律。多變量大樣本無疑會為研究和應用提供了豐富的信息&#xff0c;但也在一定程度上增加了數據采集的工作量&#xff0c;…

Mac cnpm裝包時提示Error: EACCES: permission denied解決辦法

Cnpm裝包時提示Error: EACCES: permission denied解決辦法 2018年03月04日 09:31:51 miniminixu 閱讀數&#xff1a;1598 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/miniminixu/article/details/79434609 只需在cnpm …

特征點檢測 FAST算法及代碼詳解

本文著重介紹了用于圖像特征點檢測的算法&#xff0c;FAST算法&#xff0c;以及使用matlab的實現。 FAST算法是一種拐點檢測算法&#xff0c;其主要應用于提取圖像中的特征點&#xff0c;在動態成像的一系列圖像中追蹤定位對象。眾所周知&#xff0c;我們生活的世界是動態化的…

Python Email發送,通知業務完成

Email 發送 #!/usr/bin/python # -*- coding: UTF-8 -*- import base64 import smtplib from email.mime.text import MIMEText from email.header import Header from email.utils import formataddrdef crypt(source, key):from itertools import cycleresulttempcycle(key)f…

基于SpringCloud的分布式事務框架(LCN)

框架特點 支持各種基于spring的db框架 兼容springcloud、dubbo 使用簡單&#xff0c;代碼完全開源 基于切面的強一致性事務框架 高可用&#xff0c;模塊可以依賴dubbo或springcloud的集群方式做集群化&#xff0c;TxManager也可以做集群化 使用示例 分布式事務發起方&#xf…

一文看懂計算機神經網絡與梯度下降

1. 計算機神經網絡與神經元 要理解神經網絡中的梯度下降算法&#xff0c;首先我們必須清楚神經元的定義。如下圖所示&#xff0c;每一個神經元可以由關系式yf(∑i1nwixib)y f(\sum_{i1}^nw_ix_i b)yf(∑i1n?wi?xi?b)來描述&#xff0c;其中X[x1,x2,...,xn]X [x_1,x_2,..…

vs2015web項目無法加載64位c++的dll,提示試圖加載不正確的格式

vs2015無法加載64位c的dll&#xff0c;提示試圖加載不正確的格式&#xff01; 開始用winform引用64位的c的dll&#xff0c;在項目的屬性設置生成里面選擇any cpu或者x64都可以成功! 但在web項目和接口里面運行就提示試圖加載不正確的格式&#xff0c;想辦法找了一天也沒處理掉&…

使用Rancher搭建K8S測試環境

環境準備&#xff08;4臺主機&#xff0c;Ubuntu16.04Docker1.12.6 SSH&#xff09;&#xff1a; rancher1 192.168.3.160 只做管理節點 node1 192.168.3.161 K8S的節點1 node2 192.168.3.162 K8S的節點2 node3 192.168.3.163 K8S的節點3 此時如…