Spring Cloud Consul 之Greenwich版本全攻略

      網友投稿 1027 2025-03-31

      什么是Consul


      Consul是HashiCorp公司推出的開源軟件,使用GO語言編寫,提供了分布式系統的服務注冊和發現、配置等功能,這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建全方位的服務網格。Consul不僅具有服務治理的功能,而且使用分布式一致協議RAFT算法實現,有多數據中心的高可用方案,并且很容易和spring Cloud等微服務框架集成,使用起來非常的簡單,具有簡單、易用、可插排等特點。使用簡而言之,Consul提供了一種完整的服務網格解決方案 。

      Consul具有以下的特點和功能

      服務發現:Consul的客戶端可以向Consul注冊服務,例如api服務或者mysql服務,其他客戶端可以使用Consul來發現服務的提供者。Consul支持使用DNS或HTTP來注冊和發現服務。

      運行時健康檢查:Consul客戶端可以提供任意數量的運行狀況檢查機制,這些檢查機制可以是給定服務(“是Web服務器返回200 OK”)或本地節點(“內存利用率低于90%”)相關聯。這些信息可以用來監控群集的運行狀況,服務發現組件可以使用這些監控信息來路由流量,可以使流量遠離不健康的服務。

      KV存儲:應用程序可以將Consul的鍵/值存儲用于任何需求,包括動態配置,功能標記,協調,領導者選舉等。它采用HTTP API使其易于使用。

      安全服務通信:Consul可以為服務生成和分發TLS證書,以建立相互的TLS連接。

      多數據中心:Consul支持多個數據中心。這意味著Consul的用戶不必擔心構建額外的抽象層以擴展到多個區域。

      Consul原理

      每個提供服務的節點都運行了Consul的代理,運行代理不需要服務發現和獲取配置的KV鍵值對,代理只負責監控檢查。代理節點可以和一個或者多個Consul server通訊。 Consul服務器是存儲和復制數據的地方。服務器本身選出了領導者。雖然Consul可以在一臺服務器上運行,但建議使用3到5,以避免導致數據丟失的故障情況。建議為每個數據中心使用一組Consul服務器。 如果你的組件需要發現服務,可以查詢任何Consul Server或任何Consul客戶端,Consul客戶端會自動將查詢轉發給Consul Server。 需要發現其他服務或節點的基礎架構組件可以查詢任何Consul服務器或任何Consul代理。代理會自動將查詢轉發給服務器。每個數據中心都運行Consul服務器集群。發生跨數據中心服務發現或配置請求時,本地Consul服務器會將請求轉發到遠程數據中心并返回結果。

      術語

      Agent agent是一直運行在Consul集群中每個成員上的守護進程。通過運行 consul agent 來啟動。agent可以運行在client或者server模式。指定節點作為client或者server是非常簡單的,除非有其他agent實例。所有的agent都能運行DNS或者HTTP接口,并負責運行時檢查和保持服務同步。

      Client 一個Client是一個轉發所有RPC到server的代理。這個client是相對無狀態的。client唯一執行的后臺活動是加入LAN gossip池。這有一個最低的資源開銷并且僅消耗少量的網絡帶寬。

      Server 一個server是一個有一組擴展功能的代理,這些功能包括參與Raft選舉,維護集群狀態,響應RPC查詢,與其他數據中心交互WAN gossip和轉發查詢給leader或者遠程數據中心。

      DataCenter 雖然數據中心的定義是顯而易見的,但是有一些細微的細節必須考慮。例如,在EC2中,多個可用區域被認為組成一個數據中心?我們定義數據中心為一個私有的,低延遲和高帶寬的一個網絡環境。這不包括訪問公共網絡,但是對于我們而言,同一個EC2中的多個可用區域可以被認為是一個數據中心的一部分。

      Consensus 在我們的文檔中,我們使用Consensus來表明就leader選舉和事務的順序達成一致。由于這些事務都被應用到有限狀態機上,Consensus暗示復制狀態機的一致性。

      Gossip Consul建立在Serf的基礎之上,它提供了一個用于多播目的的完整的gossip協議。Serf提供成員關系,故障檢測和事件廣播。更多的信息在gossip文檔中描述。這足以知道gossip使用基于UDP的隨機的點到點通信。

      LAN Gossip 它包含所有位于同一個局域網或者數據中心的所有節點。

      WAN Gossip 它只包含Server。這些server主要分布在不同的數據中心并且通常通過因特網或者廣域網通信。

      RPC 遠程過程調用。這是一個允許client請求server的請求/響應機制。

      讓我們分解這張圖并描述每個部分。首先,我們能看到有兩個數據中心,標記為“1”和“2”。Consul對多數據中心有一流的支持并且希望這是一個常見的情況。

      在每個數據中心,client和server是混合的。一般建議有3-5臺server。這是基于有故障情況下的可用性和性能之間的權衡結果,因為越多的機器加入達成共識越慢。然而,并不限制client的數量,它們可以很容易的擴展到數千或者數萬臺。

      同一個數據中心的所有節點都必須加入gossip協議。這意味著gossip協議包含一個給定數據中心的所有節點。這服務于幾個目的:第一,不需要在client上配置server地址。發現都是自動完成的。第二,檢測節點故障的工作不是放在server上,而是分布式的。這是的故障檢測相比心跳機制有更高的可擴展性。第三:它用來作為一個消息層來通知事件,比如leader選舉發生時。

      每個數據中心的server都是Raft節點集合的一部分。這意味著它們一起工作并選出一個leader,一個有額外工作的server。leader負責處理所有的查詢和事務。作為一致性協議的一部分,事務也必須被復制到所有其他的節點。因為這一要求,當一個非leader得server收到一個RPC請求時,它將請求轉發給集群leader。

      server節點也作為WAN gossip Pool的一部分。這個Pool不同于LAN Pool,因為它是為了優化互聯網更高的延遲,并且它只包含其他Consul server節點。這個Pool的目的是為了允許數據中心能夠以low-touch的方式發現彼此。這使得一個新的數據中心可以很容易的加入現存的WAN gossip。因為server都運行在這個pool中,它也支持跨數據中心請求。當一個server收到來自另一個數據中心的請求時,它隨即轉發給正確數據中想一個server。該server再轉發給本地leader。

      這使得數據中心之間只有一個很低的耦合,但是由于故障檢測,連接緩存和復用,跨數據中心的請求都是相對快速和可靠的。

      Consul 服務注冊發現流程

      Consul在業界最廣泛的用途就是作為服務注冊中心,同Eureka類型,consul作為服務注冊中心,它的注冊和發現過程如下圖:

      在上面的流程圖上有三個角色,分別為服務注冊中心、服務提供者、服務消費者。

      服務提供者Provider啟動的時候,會向Consul發送一個請求,將自己的host、ip、應用名、健康檢查等元數據信息發送給Consul

      Consul 接收到 Provider 的注冊后,定期向 Provider 發送健康檢查的請求,檢驗Provider是否健康

      服務消費者Consumer會從注冊中心Consul中獲取服務注冊列表,當服務消費者消費服務時,根據應用名從服務注冊列表獲取到具體服務的實例(1個或者多個),從而完成服務的調用。

      Consul VS Eureka

      Eureka是一種服務發現工具。 該體系結構主要是客戶端/服務器,每個數據中心有一組Eureka服務器,通常每個可用區域一個。 通常,Eureka的客戶使用嵌入式SDK來注冊和發現服務。 對于非本地集成的客戶端,使用Ribbon等邊車通過Eureka透明地發現服務。

      Eureka使用盡力而為的復制提供弱一致的服務視圖。 當客戶端向服務器注冊時,該服務器將嘗試復制到其他服務器但不提供保證。 服務注冊的生存時間很短(TTL),要求客戶端對服務器進行心跳檢測。 不健康的服務或節點將停止心跳,導致它們超時并從注冊表中刪除。 發現請求可以路由到任何服務,由于盡力復制,這些服務可以提供過時或丟失的數據。 這種簡化的模型允許輕松的集群管理和高可擴展性。

      Consul提供了一系列超級功能,包括更豐富的運行狀況檢查,鍵/值存儲和多數據中心感知。 Consul需要每個數據中心中的一組服務器,以及每個客戶端上的代理,類似于使用像Ribbon這樣的邊車。 Consul代理允許大多數應用程序不知道Consul,通過配置文件執行服務注冊以及通過DNS或負載平衡器sidecars進行發現。

      Consul提供強大的一致性保證,因為服務器使用Raft協議復制狀態。 Consul支持豐富的運行狀況檢查,包括TCP,HTTP,Nagios / Sensu兼容腳本或基于的Eureka的TTL。 客戶端節點參與基于gossip的健康檢查,該檢查分發健康檢查的工作,而不像集中式心跳,這成為可擴展性挑戰。 發現請求被路由到當選的Consul領導者,這使他們默認情況下非常一致。 允許過時讀取的客戶端允許任何服務器處理其請求,從而允許像Eureka一樣的線性可伸縮性。

      Consul的強烈一致性意味著它可以用作領導者選舉和集群協調的鎖定服務。 Eureka不提供類似的保證,并且通常需要為需要執行協調或具有更強一致性需求的服務運行ZooKeeper。

      Consul提供了支持面向服務的體系結構所需的功能工具包。 這包括服務發現,還包括豐富的運行狀況檢查,鎖定,鍵/值,多數據中心聯合,事件系統和ACL。 Consul和consul-template和envconsul等工具生態系統都試圖最大限度地減少集成所需的應用程序更改,以避免需要通過SDK進行本機集成。 Eureka是更大的Netflix OSS套件的一部分,該套件期望應用程序相對同質且緊密集成。 因此,Eureka只解決了有限的一部分問題,期望其他工具如ZooKeeper可以同時使用。

      Eureka Server端采用的是P2P的復制模式,但是它不保證復制操作一定能成功,因此它提供的是一個最終一致性的服務實例視圖;Client端在Server端的注冊信息有一個帶期限的租約,一旦Server端在指定期間沒有收到Client端發送的心跳,則Server端會認定為Client端注冊的服務是不健康的,定時任務將會將其從注冊表中刪除。Consul與Eureka不同,Consul采用Raft算法,可以提供強一致性的保證,Consul的agent相當于Netflix Ribbon + Netflix Eureka Client,而且對應用來說相對透明,同時相對于Eureka這種集中式的心跳檢測機制,Consul的agent可以參與到基于goosip協議的健康檢查,分散了server端的心跳檢測壓力。除此之外,Consul為多數據中心提供了開箱即用的原生支持等。

      Consul下載和安裝

      Consul采用Go語言編寫,支持Linux、Mac、Windows等各大操作系統,本文使用windows操作系統,-:https://www.consul.io/downloads.html,下完成后解壓到計算機目錄下,解壓成功后,只有一個可執行的consul.exe可執行文件。打開cmd終端,切換到目錄,執行以下命令:

      consul?--version

      終端顯示如下:

      Consul?v1.4.2Protocol?2?spoken?by?default,?understands?2?to?3?(agent?will?automatically?use?protocol?>2?when?speaking?to?compatible?agents)

      證明consul下載成功了,并可執行。

      consul的一些常見的執行命令如下:

      更多命令請查看官方網站:https://www.consul.io/docs/commands/index.html

      開發模式啟動:

      consul?agent?-dev

      啟動成功,在瀏覽器***問:http://localhost:8500,顯示的界面如下:

      spring cloud consul

      該項目通過自動配置并綁定到Spring環境和其他Spring編程模型成語,為Spring Boot應用程序提供Consul集成。通過幾個簡單的注釋,您可以快速啟用和配置應用程序中的常見模式,并使用基于Consul的組件構建大型分布式系統。提供的模式包括服務發現,控制總線和配置。智能路由(Zuul)和客戶端負載平衡(Ribbon),斷路器(Hystrix)通過與Spring Cloud Netflix的集成提供。

      使用spring cloud consul來服務注冊與發現

      本小節以案例的形式來講解如何使用Spring Cloud Consul來進行服務注冊和發現的,并且使用Feign來消費服務。再講解之前,已經啟動consul的agent,并且在瀏覽器上http://localhost:8500能夠顯示正確的頁面。本案例一共有2個工程,分別如下:

      其中,服務提供者和服務消費者分別向consul注冊,注冊完成后,服務消費者通過FeignClient來消費服務提供者的服務。

      服務提供者consul-provider

      創建一個工程consul-provider,在工程的pom文件引入以下依賴,包括consul-discovery的起步依賴,該依賴是spring cloud consul用來向consul 注冊和發現服務的依賴,采用REST API的方式進行通訊。另外加上web的起步依賴,用于對外提供REST API。代碼如下:

      ????org.springframework.cloud????spring-cloud-starter-consul-discovery????org.springframework.boot????spring-boot-starter-web

      在工程的配置文件application.yml做下以下配置:

      server:??port:?8763spring:??application:????name:?consul-provider??cloud:????consul:??????host:?localhost??????port:?8500??????discovery:????????serviceName:?consul-provider

      上面的配置,指定了程序的啟動端口為8763,應用名為consul-provider,consul注冊中心的地址為localhost:8500

      在程序員的啟動類ConsulProviderApplication加上@EnableDiscoveryClient注解,開啟服務發現的功能。

      @SpringBootApplication

      @EnableDiscoveryClient

      public class ConsulProviderApplication {

      public static void main(String[] args) {

      SpringApplication.run(ConsulProviderApplication.class, args);

      }

      }

      寫一個RESTAPI,該API為一個GET請求,返回當前程序的啟動端口,代碼如下。

      @RestController

      public class HiController {

      @Value("${server.port}")

      String port;

      @GetMapping("/hi")

      public String home(@RequestParam String name) {

      return "hi "+name+",i am from port:" +port;

      }

      }

      啟動工程,在瀏覽器***問http://localhost:8500,頁面顯示如下:

      從上圖可知,consul-provider服務已經成功注冊到consul上面去了。

      服務消費者consul-provider

      服務消費者的搭建過程同服務提供者,在pom文件中引入的依賴同服務提供者,在配置文件application.yml配置同服務提供者,不同的點在端口為8765,服務名為consul-consumer。

      寫一個FeignClient,該FeignClient調用consul-provider的REST API,代碼如下:

      @FeignClient(value = "consul-provider")

      public interface EurekaClientFeign {

      @GetMapping(value = "/hi")

      String sayHiFromClientEureka(@RequestParam(value = "name") String name);

      }

      Service層代碼如下:

      @Service

      public class HiService {

      @Autowired

      EurekaClientFeign eurekaClientFeign;

      public String sayHi(String name){

      return ?eurekaClientFeign.sayHiFromClientEureka(name);

      }

      }

      對外提供一個REST API,該API調用了consul-provider的服務,代碼如下:

      @RestController

      public class HiController {

      @Autowired

      HiService hiService;

      @GetMapping("/hi")

      public String sayHi(@RequestParam( defaultValue = "forezp",required = false)String name){

      return hiService.sayHi(name);

      }

      }

      在瀏覽器***問http://localhost:8765/hi,瀏覽器響應如下:

      hi forezp,i am from port:8763

      這說明consul-consumer已經成功調用了consul-provider的服務。這說明consul-provider的服務已經注冊到了consul的注冊中心上面去了。consul-consumer能夠獲取注冊中心的注冊列表來獲來消費服務。

      使用Spring Cloud Consul Config來做服務配置中心

      Consul不僅能用來服務注冊和發現,Consul而且支持Key/Value鍵值對的存儲,可以用來做配置中心。Spring Cloud 提供了Spring Cloud Consul Config依賴去和Consul相集成,用來做配置中心。 現在以案例的形式來講解如何使用Consul作為配置中心,本案例在上一個案例的consul-provider基礎上進行改造。首先在工程的pom文件加上consul-config的起步依賴,代碼如下:

      ????org.springframework.cloud????spring-cloud-starter-consul-config

      然后在配置文件application.yml加上以下的以下的配置,配置如下:

      spring:??profiles:????active:?dev

      上面的配置指定了SpringBoot啟動時的讀取的profiles為dev。 然后再工程的啟動配置文件bootstrap.yml文件中配置以下的配置:

      spring:??application:????name:?consul-provider??cloud:????consul:??????host:?localhost??????port:?8500??????discovery:????????serviceName:?consul-provider??????config:????????enabled:?true????????format:?yaml???????????????????prefix:?config?????????????profile-separator:?':'????????????data-key:?data

      關于spring.cloud.consul.config的配置項描述如下:

      enabled 設置config是否啟用,默認為true

      format 設置配置的值的格式,可以yaml和properties

      prefix 設置配的基本目錄,比如config

      defaultContext 設置默認的配置,被所有的應用讀取,本例子沒用的

      profileSeparator profiles配置分隔符,默認為‘,’

      date-key為應用配置的key名字,值為整個應用配置的字符串。

      網頁***問consul的KV存儲的管理界面,即http://localhost:8500/ui/dc1/kv,創建一條記錄,

      key值為:config/consul-provider:dev/data value值如下:

      foo:??bar:?bar1server:??port:?8081

      在consul-provider工程新建一個API,該API返回從consul 配置中心讀取foo.bar的值,代碼如下:

      @RestController

      Spring Cloud Consul 之Greenwich版本全攻略

      public class FooBarController {

      @Value("${foo.bar}")

      String fooBar;

      @GetMapping("/foo")

      public String getFooBar() {

      return fooBar;

      }

      }

      啟動工程,可以看到程序的啟動端口為8081,即是consul的配置中心配置的server.port端口。 工程啟動完成后,在瀏覽器***問http://localhost:8081/foo,頁面顯示bar1。由此可知,應用consul-provider已經成功從consul的配置中心讀取了配置foo.bar的配置。

      動態刷新配置

      當使用spring cloud config作為配置中心的時候,可以使用spring cloud config bus支持動態刷新配置。Spring Cloud Comsul Config默認就支持動態刷新,只需要在需要動態刷新的類上加上@RefreshScope注解即可,修改代碼如下:

      @RestController

      @RefreshScope

      public class FooBarController {

      @Value("${foo.bar}")

      String fooBar;

      @GetMapping("/foo")

      public String getFooBar() {

      return fooBar;

      }

      }

      啟動consul-provider工程,在瀏覽器***問http://localhost:8081/foo,頁面顯示bar1。然后 在網頁***問consul的KV存儲的管理界面,即http://localhost:8500/ui/dc1/kv,修改config/consul-provider:dev/data的值,修改后的值如下:

      foo:??bar:?bar2server:???port:?8081

      此時不重新啟動consul-provider,在瀏覽器***問http://localhost:8081/foo,頁面顯示bar2。可見foo.bar的最新配置在應用不重啟的情況下已經生效。

      注意事項

      consul支持的KV存儲的Value值不能超過512KB

      Consul的dev模式,所有數據都存儲在內存中,重啟Consul的時候會導致所有數據丟失,在正式的環境中,Consul的數據會持久化,數據不會丟失。

      參考資料

      https://www.consul.io/intro/index.html

      https://www.consul.io/docs/internals/architecture.html

      https://www.consul.io/intro/vs/eureka.html

      http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html

      https://springcloud.cc/spring-cloud-consul.html

      https://www.cnblogs.com/lsf90/p/6021465.html

      https://blog.csdn.net/longgeqiaojie304/article/details/85227936

      RPC 邊緣數據中心管理 EDCM Spring Cloud Spring

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel如何快速填充空白
      下一篇:excel表函數rank的使用教程
      相關文章
      久久亚洲AV无码西西人体| 亚洲色偷拍区另类无码专区| 亚洲国产另类久久久精品黑人| 免费在线观看亚洲| 亚洲6080yy久久无码产自国产 | 久久精品国产亚洲| 国产∨亚洲V天堂无码久久久| 亚洲性猛交XXXX| 亚洲精品美女久久久久99| 色噜噜AV亚洲色一区二区| 国产亚洲大尺度无码无码专线 | 亚洲国产精品一区二区第一页免| 狼人大香伊蕉国产WWW亚洲| 国产精品成人亚洲| 亚洲性久久久影院| 亚洲无人区午夜福利码高清完整版| 亚洲欧洲日产国码av系列天堂| 久久亚洲精品视频| 亚洲精品综合一二三区在线 | 亚洲综合精品香蕉久久网97| 亚洲视频一区二区在线观看| 亚洲精品中文字幕无码AV| 亚洲六月丁香六月婷婷蜜芽| 亚洲无吗在线视频| 亚洲第一成年网站视频| 亚洲av高清在线观看一区二区 | 中文字幕不卡亚洲 | 亚洲黄色免费网址| 亚洲午夜国产精品| 在线观看亚洲AV日韩A∨| 亚洲AV永久无码精品网站在线观看 | 亚洲avav天堂av在线网毛片| 亚洲免费一区二区| 亚洲国产精品无码久久一区二区| 亚洲av最新在线网址| 亚洲综合激情六月婷婷在线观看| 亚洲av成人一区二区三区| 亚洲精品无码日韩国产不卡av| 国产成人亚洲精品无码AV大片 | 亚洲国产午夜精品理论片| 久久亚洲精品国产亚洲老地址 |