<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          .net core學(xué)習(xí)筆記,組件篇:服務(wù)的注冊(cè)與發(fā)現(xiàn)(Consul)初篇

          共 4855字,需瀏覽 10分鐘

           ·

          2020-09-03 14:05

          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ù)ID                ID = 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(ILogger logger, IDemoService demoService) { _logger = logger; _demoService = demoService; }
          [HttpGet] 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ò)誤大家能給予包容和指正。

          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人污污网站在线观看 | 懂色av,蜜臀AV粉嫩av | 成人AV麻豆 | 日产A片| 欧美成人在线免费视频 |