.Net Core微服務入門全紀錄(二)——Consul-服務注冊與發現(上)

系列文章目錄

1、.Net Core微服務入門系列(一)——項目搭建
2、.Net Core微服務入門全紀錄(二)——Consul-服務注冊與發現(上)
3、.Net Core微服務入門全紀錄(三)——Consul-服務注冊與發現(下)
4、.Net Core微服務入門全紀錄(四)——Ocelot-API網關(上)
5、.Net Core微服務入門全紀錄(五)——Ocelot-API網關(下)
6、.Net Core微服務入門全紀錄(六)——EventBus-事件總線
7、.Net Core微服務入門全紀錄(七)——IdentityServer4-授權認證
8、.Net Core微服務入門全紀錄(八)——Docker Compose與容器網絡


在這里插入圖片描述


前言📃

關于 微服務 的概念解釋網上有很多, 個人理解微服務是一種系統架構模式,它和語言無關,和框架無關,和工具無關,和服務器環境無關。

微服務思想 是將傳統的單體系統按照業務拆分成多個職責單一、且可獨立運行的接口服務。至于服務如何拆分,沒有明確的定義。幾乎任何后端語言都能做微服務開發。微服務也并不是完美無缺的,微服務架構會帶來更多的問題,增加系統的復雜度,引入更多的技術棧。

上一篇【.Net Core微服務入門全紀錄(一)——項目搭建】講到要做到服務的靈活伸縮,那么需要有一種機制來實現它,這個機制就是服務注冊與發現。當然這也并不是必要的,如果你的服務實例很少,并且很穩定,那么就沒有必要使用服務注冊與發現。


一、服務注冊與發現

  • 服務注冊:簡單理解,就是有一個注冊中心,我們的每個服務實例啟動時,都去注冊中心注冊一下,告訴注冊中心我的地址,端口等信息。同樣的服務實例要刪除時,去注冊中心刪除一下,注冊中心負責維護這些服務實例的信息。

  • 服務發現:既然注冊中心維護了各個服務實例的信息,那么客戶端通過注冊中心就很容易發現服務的變化了。

有了服務注冊與發現,客戶端就不用再去配置各個服務實例的地址,改為從注冊中心統一獲取。
那注冊中心又是怎么保證每個地址的可用狀態呢,假如某個實例掛了怎么辦呢?原則上掛掉的實例不應該被客戶端獲取到,所以就要提到:健康檢查

🎯健康檢查:每個服務都需要提供一個用于健康檢查的接口,該接口不具備業務功能。服務注冊時把這個接口的地址也告訴注冊中心,注冊中心會定時調用這個接口來檢測服務是否正常,如果不正常,則將它移除,這樣就保證了服務的可用性。

常見注冊中心有 ConsulZooKeeperetcdEureka

二、Consul

Consul 官網:https://www.consul.io/
Consul 的主要功能有服務注冊與發現、健康檢查、K-V存儲、多數據中心等。

  • Consul安裝:很簡單,直接在官網下載解壓即可。
  • Consul運行:在 consul.exe 目錄下打開命令行執行 consul.exe agent -dev
  • 瀏覽器訪問:http://localhost:8500/
    在這里插入圖片描述
    Consul 已成功運行。

三、服務注冊

首先 Nuget 安裝一下 Consul

在這里插入圖片描述
這個類庫里封裝了Consul的api操作,方便我們直接使用。當然自己去寫http調用Consul的接口也不是不行。。。接口說明:https://www.consul.io/api-docs

改造一下訂單服務的代碼:

在這里插入圖片描述
ConsulHelper.cs:

    public static class ConsulHelper{/// <summary>/// 服務注冊到consul/// </summary>/// <param name="app"></param>/// <param name="lifetime"></param>public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IConfiguration configuration, IHostApplicationLifetime lifetime) {var consulClient = new ConsulClient(c =>{//consul地址c.Address = new Uri(configuration["ConsulSetting:ConsulAddress"]);});var registration = new AgentServiceRegistration(){ID = Guid.NewGuid().ToString(),//服務實例唯一標識Name = configuration["ConsulSetting:ServiceName"],//服務名Address = configuration["ConsulSetting:ServiceIP"], //服務IPPort = int.Parse(configuration["ConsulSetting:ServicePort"]),//服務端口 因為要運行多個實例,端口不能在appsettings.json里配置,在docker容器運行時傳入Check = new AgentServiceCheck(){DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服務啟動多久后注冊Interval = TimeSpan.FromSeconds(10),//健康檢查時間間隔HTTP = $"http://{configuration["ConsulSetting:ServiceIP"]}:{configuration["ConsulSetting:ServicePort"]}{configuration["ConsulSetting:ServiceHealthCheck"]}",//健康檢查地址Timeout = TimeSpan.FromSeconds(5)//超時時間}};//服務注冊consulClient.Agent.ServiceRegister(registration).Wait();//應用程序終止時,取消注冊lifetime.ApplicationStopping.Register(() =>{consulClient.Agent.ServiceDeregister(registration.ID).Wait();});return app;}}

appsettings.json:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ConsulSetting": {"ServiceName": "OrderService","ServiceIP": "localhost","ServiceHealthCheck": "/healthcheck","ConsulAddress": "http://host.docker.internal:8500"//注意,docker容器內部無法使用localhost訪問宿主機器,如果是控制臺啟動的話就用localhost}
}

Startup.cs:

    public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllers();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});//服務注冊app.RegisterConsul(Configuration, lifetime);}}

OrdersController.cs:

    [Route("[controller]")][ApiController]public class OrdersController : ControllerBase{private readonly ILogger<OrdersController> _logger;private readonly IConfiguration _configuration;public OrdersController(ILogger<OrdersController> logger, IConfiguration configuration){_logger = logger;_configuration = configuration;}[HttpGet]public IActionResult Get(){string result = $"【訂單服務】{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}——" +$"{Request.HttpContext.Connection.LocalIpAddress}:{_configuration["ConsulSetting:ServicePort"]}";return Ok(result);}}

HealthCheckController.cs:

    [Route("[controller]")][ApiController]public class HealthCheckController : ControllerBase{/// <summary>/// 健康檢查接口/// </summary>/// <returns></returns>[HttpGet]public IActionResult Get(){return Ok();}}

至此就完成了服務注冊,取消注冊,健康檢查等功能的代碼編寫。

同樣的改造一下產品服務,代碼差不多一樣,就不貼了。

四、運行服務

繼續在 docker 中運行服務實例,不習慣 docker 的話用控制臺啟動也行。
--ConsulSetting:ServicePort 參數就是傳入容器的端口信息。

docker build -t orderapi:1.0 -f ./Order.API/Dockerfile .
docker run -d -p 9060:80 --name orderservice orderapi:1.0 --ConsulSetting:ServicePort="9060"
docker run -d -p 9061:80 --name orderservice1 orderapi:1.0 --ConsulSetting:ServicePort="9061"
docker run -d -p 9062:80 --name orderservice2 orderapi:1.0 --ConsulSetting:ServicePort="9062"docker build -t productapi:1.0 -f ./Product.API/Dockerfile .
docker run -d -p 9050:80 --name productservice productapi:1.0 --ConsulSetting:ServicePort="9050"
docker run -d -p 9051:80 --name productservice1 productapi:1.0 --ConsulSetting:ServicePort="9051"
docker run -d -p 9052:80 --name productservice2 productapi:1.0 --ConsulSetting:ServicePort="9052"

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
至此,6個服務器實例都已運行,并且成功注冊到 Consul

隨便停止2個服務:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
可以看到停止的服務已經在 Consul 中被移除。注意,這個是我們停止程序時主動調用 Consul移除的。

//應用程序終止時,取消注冊
lifetime.ApplicationStopping.Register(() =>
{consulClient.Agent.ServiceDeregister(registration.ID).Wait();
});

當然程序發生異常,健康檢查不能正確響應的話,Consul 也會移除,有一點區別。

那么注冊,發現,健康檢查功能都完成了,下一步就該考慮客戶端如何拿到這些服務實例的地址了。


在這里插入圖片描述

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

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

相關文章

Spark Streaming的核心功能及其示例PySpark代碼

Spark Streaming是Apache Spark中用于實時流數據處理的模塊。以下是一些常見功能的實用PySpark代碼示例&#xff1a; 基礎流處理&#xff1a;從TCP套接字讀取數據并統計單詞數量 from pyspark import SparkContext from pyspark.streaming import StreamingContext# 創建Spar…

深度學習系列75:sql大模型工具vanna

1. 概述 vanna是一個可以將自然語言轉為sql的工具。簡單的demo如下&#xff1a; !pip install vanna import vanna from vanna.remote import VannaDefault vn VannaDefault(modelchinook, api_keyvanna.get_api_key(my-emailexample.com)) vn.connect_to_sqlite(https://va…

【線性代數】列主元法求矩陣的逆

列主元方法是一種用于求解矩陣逆的數值方法&#xff0c;特別適用于在計算機上實現。其基本思想是通過高斯消元法將矩陣轉換為上三角矩陣&#xff0c;然后通過回代求解矩陣的逆。以下是列主元方法求解矩陣 A A A 的逆的步驟&#xff1a; [精確算法] 列主元高斯消元法 步驟 1&am…

[0242-06].第06節:SpringBoot對SpringMVC的自動配置

SpringBoot學習大綱 一、基于SpringBoot搭建Web工程&#xff1a; 1.1.編碼實現步驟&#xff1a; a.創建SpringBoot項目 b.選中依賴&#xff1a;選中我們所需要的模塊 1.2.SSM中的WEB開發配置與SpringBoot中WEB開發自動配置對比&#xff1a; a.SSM中的WEB開發&#xff1a; 1…

【21】Word:德國旅游業務?

目錄 題目 NO1.2.3 NO4 NO5.6 NO7 NO8.9.10.11 題目 NO1.2.3 F12&#xff1a;另存為布局→頁面設置→頁邊距&#xff1a;上下左右選中“德國主要城市”→開始→字體對話框→字體/字號→文本效果&#xff1a;段落對話框→對齊方式/字符間距/段落間距 NO4 布局→表對話框…

什么是軟件架構

什么是軟件架構 程序員說&#xff0c;軟件架構是要決定編寫哪些C程序或OO類、使用哪些庫和框架 程序經理說&#xff0c;軟件架構就是模塊的劃分和接口的定義 系統分析員說&#xff0c;軟件架構就是為業務領域對象的關系建模 配置管理員說&#xff0c;軟件架構就是開發出來的…

1/20賽后總結

1/20賽后總結 T1『討論區管理員』的旅行 - BBC編程訓練營 算法&#xff1a;IDA* 分數&#xff1a;0 damn it! Ac_code走丟了~~&#xff08;主要是沒有寫出來&#xff09;~~ T2華強買瓜 - BBC編程訓練營 算法&#xff1a;雙向DFS或者DFS剪枝 分數&#xff1a;0 Ac_code…

大數據與AI驅動的商業查詢平臺:企業市場拓展的變革引擎?

在競爭白熱化的商業環境里&#xff0c;企業對準確市場信息的高效獲取能力&#xff0c;直接關系到業務拓展的成敗。商業查詢平臺借助大數據和人工智能技術&#xff0c;為企業提供精準客戶篩選、市場拓展分析以及風險評估服務&#xff0c;正逐漸成為企業市場開拓的得力助手。本文…

redis 各個模式的安裝

一、Redis單機安裝 1、安裝gcc依賴 Redis是C語言編寫的&#xff0c;編譯需要GCC。 Redis6.x.x版本支持了多線程&#xff0c;需要gcc的版本大于4.9&#xff0c;但是CentOS7的默認版本是4.8.5。 升級gcc版本&#xff1a; yum -y install centos-release-scl yum -y install d…

TiDB 的優勢與劣勢

TiDB 的優勢與劣勢 TiDB 作為一款新興的分布式數據庫&#xff0c;在業界逐漸嶄露頭角。它兼具傳統關系型數據庫的特性&#xff0c;又充分利用分布式架構的優勢。那么&#xff0c;TiDB 究竟有怎樣的優缺點呢&#xff1f;今天我們來聊聊 TiDB 的優勢與劣勢&#xff0c;幫你全面了…

藍橋杯算法日常|c\c++常用競賽函數總結備用

一、字符處理相關函數 大小寫判斷函數 islower和isupper&#xff1a;是C標準庫中的字符分類函數&#xff0c;用于檢查一個字符是否為小寫字母或大寫字母&#xff0c;需包含頭文件cctype.h&#xff08;也可用萬能頭文件包含&#xff09;。返回布爾類型值。例如&#xff1a; #…

微服務知識——4大主流微服務架構方案

文章目錄 1、微服務聚合模式2、微服務共享模式3、微服務代理模式4、微服務異步消息模式 微服務是大型架構的必經之路&#xff0c;也是大廠重點考察對象&#xff0c;下面我就重點詳解4大主流微服務架構方案。 1、微服務聚合模式 微服務聚合設計模式&#xff0c;解決了如何從多個…

【HTML+CSS】使用HTML與后端技術連接數據庫

目錄 一、概述 1.1 HTML前端 1.2 后端技術 1.3 數據庫 二、HTML表單示例 三、PHP后端示例 3.1 連接數據庫 3.2 接收數據并插入數據庫 四、安全性 4.1 防止SQL注入 4.2 數據驗證與清洗 五、優化 5.1 索引優化 5.2 查詢優化 六、現代Web開發中的最佳實踐 6.1 使用…

T-SQL語言的數據庫編程

T-SQL語言的數據庫編程 1. 引言 在信息化迅速發展的今天&#xff0c;數據庫已經成為數據管理和使用的重要工具。其中&#xff0c;T-SQL&#xff08;Transact-SQL&#xff09;作為微軟SQL Server的擴展SQL語言&#xff0c;不僅用于數據查詢和管理&#xff0c;還能夠進行復雜的…

通信協議—WebSocket

一、WebSocket編程概念 1.1 什么是WebSocket WebSocket 是一種全雙工通信協議&#xff0c;允許在客戶端&#xff08;通常是瀏覽器&#xff09;和服務器之間建立持久連接&#xff0c;以實現實時的雙向通信。它是 HTML5 標準的一部分&#xff0c;相比傳統的 HTTP 請求&#xff…

cadence筆記--畫PMU6050原理圖和封裝

簡介 本文主要介紹使用Cadence自己畫一個PMU6050的原理圖PCB的實際用例&#xff0c;Cadence使用的是24.1版本。 原理圖 首先獲取PMU6050引腳參數&#xff0c;使用立創商城查詢PMU6050型號&#xff0c;點擊數據手冊如下圖所示&#xff1a; 如下圖所示&#xff0c;左邊是原理圖&…

CSS3 3D 轉換介紹

CSS3 中的 3D 轉換提供了一種在二維屏幕上呈現三維效果的方式&#xff0c;主要包括translate3d、rotate3d、scale3d等轉換函數&#xff0c;下面來詳細介紹&#xff1a; 1. 3D 轉換的基本概念 坐標系 在 CSS3 的 3D 空間中&#xff0c;使用的是右手坐標系。X 軸是水平方向&…

Text2SQL 智能報表方案介紹

0 背景 Text2SQL智能報表方案旨在通過自然語言處理&#xff08;NLP&#xff09;技術&#xff0c;使用戶能夠以自然語言的形式提出問題&#xff0c;并自動生成相應的SQL查詢&#xff0c;從而獲取所需的數據報表&#xff0c;用戶可根據得到結果展示分析從而為結論提供支撐&#…

FFmpeg音視頻采集

文章目錄 音視頻采集音頻采集獲取設備信息錄制麥克風錄制聲卡 視頻采集攝像機畫面采集 音視頻采集 DirectShow&#xff08;簡稱DShow&#xff09;是一個Windows平臺上的流媒體框架&#xff0c;提供了高質量的多媒體流采集和回放功能&#xff0c;它支持多種多樣的媒體文件格式&…

【漫話機器學習系列】056.F1值(F1 score)

F1值&#xff08;F1 Score&#xff09; 定義 F1值是機器學習中一種用于評估模型性能的指標&#xff0c;特別適合用于 不平衡數據集 的分類任務。它是 精確率&#xff08;Precision&#xff09; 和 召回率&#xff08;Recall&#xff09; 的調和平均值。通過綜合考慮精確率和召…