.net core學(xué)習(xí)筆記,組件篇:服務(wù)的注冊(cè)與發(fā)現(xiàn)(Consul)初篇
1、什么是服務(wù)注冊(cè)中心?
在學(xué)習(xí)服務(wù)注冊(cè)與發(fā)現(xiàn)時(shí),我們要先搞明白到底什么是服務(wù)注冊(cè)與發(fā)現(xiàn)。
在這里我舉一個(gè)生活中非常普遍的例子——網(wǎng)購來簡(jiǎn)單說明,網(wǎng)購在我們?nèi)粘I钪幸呀?jīng)是非常普遍了,其實(shí)網(wǎng)購中的(商家—菜鳥驛站—買家),就組成了一個(gè)非常簡(jiǎn)單的注冊(cè)發(fā)現(xiàn)邏輯。在我們購買商品之后,需要拿到這件商品,如果是普通的點(diǎn)對(duì)點(diǎn)服務(wù),商家直接將商品快遞給買家,如果買家臨時(shí)有事不在家,這個(gè)時(shí)候?qū)?huì)收貨失敗。
當(dāng)引入注冊(cè)中心—菜鳥驛站之后,商家發(fā)貨后只需要將商品發(fā)送給菜鳥驛站(服務(wù)注冊(cè)),買家在合適的時(shí)間通過快遞號(hào)或者掃碼去菜鳥驛站拿取自己的商品(服務(wù)發(fā)現(xiàn)),在這個(gè)環(huán)節(jié)中,菜鳥驛站只負(fù)責(zé)商品的收與發(fā),這樣就構(gòu)成了一個(gè)簡(jiǎn)單的服務(wù)發(fā)現(xiàn)邏輯。
2、為什么要使用服務(wù)注冊(cè)中心?
1、解耦:
? ? ? 服務(wù)消費(fèi)者和服務(wù)提供者之間完全解耦。就如同上面的例子:買家不用去關(guān)心賣家到底發(fā)什么快遞,只要我去快遞驛站能拿到商品就OK。
2、擴(kuò)展:
? ? ??服務(wù)消費(fèi)者和服務(wù)提供者增加和刪除新的服務(wù)時(shí),對(duì)于雙方?jīng)]有任何影響。比如:買家買了多個(gè)不同的商品,這時(shí)買家也只需要根據(jù)不同的取件憑據(jù)去菜鳥驛站拿取對(duì)應(yīng)的商品就OK。
3、不同的服務(wù)注冊(cè)中心組件
zookeeper
ZooKeeper是一個(gè)分布式的,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),是Google的Chubby一個(gè)開源的實(shí)現(xiàn),是Hadoop和Hbase的重要組件。它是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的軟件,提供的功能包括:配置維護(hù)、域名服務(wù)、分布式同步、組服務(wù)等。ZooKeeper的目標(biāo)就是封裝好復(fù)雜易出錯(cuò)的關(guān)鍵服務(wù),將簡(jiǎn)單易用的接口和性能高效、功能穩(wěn)定的系統(tǒng)提供給用戶。ZooKeeper包含一個(gè)簡(jiǎn)單的原語集,提供Java和C的接口。
consul
Consul 是 HashiCorp 公司推出的開源產(chǎn)品,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)、服務(wù)隔離、服務(wù)配置,這些功能中的每一個(gè)都可以根據(jù)需要單獨(dú)使用,也可以同時(shí)使用所有功能。Consul 官網(wǎng)目前主要推 Consul 在服務(wù)網(wǎng)格中的使用。
etcd
etcd是CoreOS團(tuán)隊(duì)于2013年6月發(fā)起的開源項(xiàng)目,它的目標(biāo)是構(gòu)建一個(gè)高可用的分布式鍵值(key-value)數(shù)據(jù)庫。etcd內(nèi)部采用raft協(xié)議作為一致性算法,etcd基于Go語言實(shí)現(xiàn)。
eureka
eureka注冊(cè)中心已經(jīng)閉源,不建議在家學(xué)習(xí)使用。
4、什么是Consul
Consul是一個(gè)用來實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置的開源工具。是由go語言開發(fā)。他主要由多個(gè)組成部分:
服務(wù)發(fā)現(xiàn):客戶端通過Consul提供服務(wù),類似于API、MySQL、或者其他客戶端可以使用Consul發(fā)現(xiàn)服務(wù)的提供者。使用類似DNS或者HTTP,應(yīng)用程序和可以很輕松的發(fā)現(xiàn)他們依賴的服務(wù)。
檢查健康:Consul客戶端可以提供與給定服務(wù)相關(guān)的健康檢查(Web服務(wù)器返回200 ok)或者本地節(jié)點(diǎn)(“內(nèi)存利用率低于90%”)。這些信息可以監(jiān)控集群的運(yùn)行情況,并且使訪問遠(yuǎn)離不健康的主機(jī)組件。
鍵值對(duì)存儲(chǔ):應(yīng)用程序可以使用Cousul的層級(jí)鍵值對(duì)。
多數(shù)據(jù)中心:Consul有開箱及用的多數(shù)據(jù)中心。
5、如何在asp.net core中使用Consul
概念性的內(nèi)容已經(jīng)講的差不多了,下面我們來看看如何在asp.net core+windows下使用Consul。
5.1、下載Consul
官網(wǎng)地址:?https://www.consul.io/
下載地址:?https://releases.hashicorp.com/consul/1.7.2/?或?https://www.consul.io/downloads.html
5.2、啟動(dòng)Consul
consul.exe agent -dev

?
?
?參數(shù)介紹:
Version:consul版本
Node ID:consul當(dāng)前啟動(dòng)的節(jié)點(diǎn)ID
Node name:consul當(dāng)前啟動(dòng)的節(jié)點(diǎn)名稱,默認(rèn)當(dāng)前電腦名稱
Datacenter:數(shù)據(jù)中心
Service:consul的啟動(dòng)模式,true表示服務(wù)端模式,false表示客戶端模式
Client Addr:客戶端連接地址,支持HTTP、HTTPS、GRPC、DNS,默認(rèn)使用HTTP
Cluster Addr:集群地址,就是Server模式下的啟動(dòng)方式
5.3、編碼
5.3.1、創(chuàng)建兩個(gè)asp.net core webapi項(xiàng)目,并分別引用Consul的包。


5.3.2、編寫服務(wù)提供者代碼
在服務(wù)提供項(xiàng)目(ConsulService)的Startup類的Configure方法內(nèi)編寫如下代碼:
// 創(chuàng)建Consul的客戶端連接var consulClient = new ConsulClient(configuration =>{// Consul的連接地址configuration.Address = new Uri("http://127.0.0.1:8500");});// 創(chuàng)建Consul的服務(wù)注冊(cè)信息var registration = new AgentServiceRegistration(){// 服務(wù)IDID = Guid.NewGuid().ToString(),// 服務(wù)名稱Name = "demoService",// 服務(wù)連接地址Address = "https://localhost",// 端口Port = 5001// AgentServiceRegistration對(duì)象還有一些其他屬性,后面有機(jī)會(huì)再了解};// 注冊(cè)服務(wù)consulClient.Agent.ServiceRegister(registration);
然后啟動(dòng)項(xiàng)目:

?
?
?項(xiàng)目啟動(dòng)成功,我們?cè)L問Consul的可視化web頁面(地址默認(rèn)是8500端口),看服務(wù)是否注冊(cè)成功:

?
?
?
?
?
?從上面的截圖可以看到,我們剛剛注冊(cè)的demoService服務(wù)已經(jīng)注冊(cè)成功了。
5.3.3、編寫服務(wù)消費(fèi)者代碼
在服務(wù)消費(fèi)者項(xiàng)目中添加一個(gè)Service文件夾,新增一個(gè)服務(wù)消費(fèi)的接口然后實(shí)現(xiàn)這個(gè)接口:
public interface IDemoService{Task<string> GetDemoService();}public class DemoService : IDemoService{private readonly IHttpClientFactory httpClientFactory;public DemoService(IHttpClientFactory httpClientFactory){this.httpClientFactory = httpClientFactory;}public async Task<string> GetDemoService(){var res = "";// 創(chuàng)建consul連接對(duì)象var consulClient = new Consul.ConsulClient(configuare =>{// Consul的連接地址configuare.Address = new Uri("http://127.0.0.1:8500");});// 根據(jù)剛才注冊(cè)的服務(wù)名稱獲取對(duì)應(yīng)的服務(wù)var queryResult = await consulClient.Catalog.Service("demoService");// 服務(wù)連接地址var serviceUrls = new List<string>();// 遍歷獲取到的服務(wù)列表foreach (var service in queryResult.Response){// 拼接連接地址serviceUrls.Add(service.ServiceAddress + ":" + service.ServicePort);}HttpClient httpClient = httpClientFactory.CreateClient();HttpResponseMessage response = await httpClient.GetAsync(serviceUrls[0] + "/api/Home/");if (response.StatusCode == HttpStatusCode.OK){res = await response.Content.ReadAsStringAsync();}return res;}}
在控制器調(diào)用這個(gè)服務(wù):
private readonly ILogger_logger; private readonly IDemoService _demoService;public HomeController(ILoggerlogger, IDemoService demoService ){_logger = logger;_demoService = demoService;}[]public Task<string> Get(){return _demoService.GetDemoService();}
注意,記得在Startup類中的ConfigureService方法中注入上面的服務(wù)接口與類,具體為什么要注入應(yīng)該不用我多說了。
1 services.AddScoped();
最后,我們啟動(dòng)消費(fèi)者項(xiàng)目,并請(qǐng)求對(duì)應(yīng)接口看看效果,很顯然,服務(wù)已經(jīng)請(qǐng)求成功。


?
這篇文章暫時(shí)就到這里,上面就是.net core對(duì)Consul最簡(jiǎn)單的應(yīng)用。隨著學(xué)習(xí)的深入,后面會(huì)有相應(yīng)的學(xué)習(xí)筆記記錄。
因?yàn)楸救艘彩翘幱谔剿麟A段,上面所寫的也僅僅是一些學(xué)習(xí)筆記,所以一些理解可能不夠準(zhǔn)確,希望所寫的一些內(nèi)容出現(xiàn)錯(cuò)誤大家能給予包容和指正。
