<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 微服務(wù)框架 Viper 調(diào)用鏈路追蹤

          共 4767字,需瀏覽 10分鐘

           ·

          2020-10-27 14:42

          1、Viper是什么?

            Viper 是.NET平臺下的Anno微服務(wù)框架的一個示例項(xiàng)目。入門簡單安全穩(wěn)定高可用全平臺可監(jiān)控。底層通訊可以隨意切換thrift?grpc?自帶服務(wù)發(fā)現(xiàn)、調(diào)用鏈追蹤、Cron 調(diào)度、限流、事件總線、CQRS 、DDD、類似MVC的開發(fā)體驗(yàn),插件化開發(fā)

            一個不可監(jiān)控的微服務(wù)平臺是可怕的,出了問題?難以準(zhǔn)確定位問題的根源, Anno則提供了一套完整的監(jiān)控體系,包括鏈路追蹤服務(wù)占用的系統(tǒng)資源、系統(tǒng)自身?CPU、內(nèi)存、硬盤使用率實(shí)時(shí)可監(jiān)控等等。

          github:
          https://github.com/duyanming/Viper
          文檔地址:
          https://duyanming.github.io/

          體驗(yàn)地址:(體驗(yàn)用戶為anno 密碼123456 同一時(shí)間一個用戶只能在一個終端登錄用戶多的時(shí)候可能發(fā)生強(qiáng)制退出的情況,稍后登錄體驗(yàn))
          http://140.143.207.244/

          如果對Viper不了解可以看:

            1、?net core 微服務(wù) 快速開發(fā)框架 Viper 初體驗(yàn)

            2、打不死的小強(qiáng) .net core 微服務(wù) 快速開發(fā)框架 Viper 限流

          2、Viper調(diào)用鏈追蹤 

            當(dāng)我們進(jìn)行微服務(wù)架構(gòu)開發(fā)時(shí),通常會劃分出多個微服務(wù),各服務(wù)之間通過RPC進(jìn)行調(diào)用。一個業(yè)務(wù)操作,可能需要多個微服務(wù)的協(xié)同才能完成,在業(yè)務(wù)調(diào)用鏈路上任何一個微服務(wù)出現(xiàn)問題或者網(wǎng)絡(luò)出現(xiàn)問題,都會導(dǎo)致業(yè)務(wù)失敗。隨著業(yè)務(wù)越來越復(fù)雜,微服務(wù)之間的協(xié)作也越來越多,越來越復(fù)雜。如果不能直觀的看到整個調(diào)用鏈路,那么我們就無法快速、準(zhǔn)確的定位問題、解決問題,有甚者出現(xiàn)服務(wù)之間出現(xiàn)死循環(huán)調(diào)用拖垮整個集群。這樣我們不僅不能嘗到微服務(wù)給我們帶來的好處,反而引入了一堆更復(fù)雜的問題。因此對于一個微服務(wù)系統(tǒng)鏈路追蹤是必要的。

          ?  Viper為服務(wù)之間調(diào)用提供了一套完善的鏈路追蹤體系。通過Viper可以清晰的看到一個調(diào)用鏈(一次業(yè)務(wù)操作)經(jīng)過了哪些微服務(wù)、每個服務(wù)消耗多少時(shí)間、是否出現(xiàn)異常、處理結(jié)果如何等等。通過鏈路追蹤體系可以分析整個業(yè)務(wù)的狀態(tài),比如那個服務(wù)或者業(yè)務(wù)操作耗時(shí)異常需要優(yōu)化,快速定位問題解決問題。從而更好的為整個微服務(wù)體系服務(wù)。

            不僅如此還可以幫助公司新入職員工梳理梳理業(yè)務(wù)脈絡(luò),明白自己所處在的業(yè)務(wù)環(huán)節(jié)、預(yù)測系統(tǒng)可能發(fā)生的隱患,早發(fā)現(xiàn)早解決,防患于未然。

          鏈路追蹤列表:

          ??單個鏈路追蹤示例:

            下面這個調(diào)用鏈路為:

             

          ?  整個調(diào)用鏈路花費(fèi)22毫秒,最后兩個調(diào)用為并行。

          ?

          3、Viper&Anno 遠(yuǎn)程過程調(diào)用(RPC)

            Anno?框架底層Rpc采用了成熟的?thrift(首選推薦)grpc他們都有著高性能跨語言的特點(diǎn),因此Anno框架也是一個跨語言的,可以輕松實(shí)現(xiàn)混合編程的框架。目前支持.net core、.net framework、java,更多的實(shí)現(xiàn)期待大家共同努力一起貢獻(xiàn)。

            Thrift是一種接口描述語言和二進(jìn)制通訊協(xié)議,它被用來定義和創(chuàng)建跨語言的服務(wù)。它被當(dāng)作一個遠(yuǎn)程過程調(diào)用(RPC)框架來使用,是由Facebook為“大規(guī)模跨語言服務(wù)開發(fā)”而開發(fā)的。目前托管在Apache,更多詳細(xì)可翻閱網(wǎng)上資料。

            

            grpc 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設(shè)計(jì)。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

            gRPC 基于 HTTP/2 標(biāo)準(zhǔn)設(shè)計(jì),帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復(fù)用請求等特。這些特性使得其在移動設(shè)備上表現(xiàn)更好,更省電和節(jié)省空間占用。

          ?

          以Thrift為例來了解Anno框架

            Anno框架的 Thrift接口描述文件:

          namespace csharp Anno.Rpc   #  命名空間
          struct Micro { # 服務(wù)信息
          1: string ip
          2: i32 port
          3: i32 timeout
          4: string name
          5: string nickname
          6: i32 weight
          }
          service BrokerService { # Provider服務(wù)
          string broker(1:map<string,string> input)
          }
          service BrokerCenter { # 注冊中心
          bool add_broker(1:map<string,string> input)
          list
          GetMicro(1:string channel)
          string Invoke(1:map<string,string> input)
          }

          服務(wù)之間通訊的接口為?string broker(1:map input),服務(wù)之間通訊采用的是 Thrift的 二進(jìn)制傳輸。

          /// 
          /// Engine 常量
          ///

          public static class Eng
          {
          ///
          /// 命名空間
          ///

          public const string NAMESPACE = "channel";
          ///
          ///
          ///

          public const string CLASS = "router";
          ///
          /// 方法
          ///

          public const string METHOD = "method";
          }

          channel、router、method此三個參數(shù)是遠(yuǎn)程過程調(diào)用過程中的必須參數(shù)
          以插件 Anno.Plugs.LogicService為例

          namespace Anno.Plugs.LogicService
          {
          using Anno.CommandBus;

          public class PlatformModule : BaseModule
          {
          --------------省略-------------------
          ///
          /// 獲取用戶功能
          ///

          ///
          [AnnoInfo(Desc = "獲取用戶功能")]
          public ActionResult GetFunc()
          {
          return _platformQuery.GetFunc(Profile);
          }
          }
          }

          channel 對應(yīng):Anno.Plugs.Logic
          router  對應(yīng):Platform
          method  對應(yīng):GetFunc
          保留關(guān)鍵字:TraceId,PreTraceId,AppName,AppNameTarget,GlobalTraceId,TTL,X-Original-For
          TraceId:一次Rpc調(diào)用成為一個span,這個調(diào)用的唯一標(biāo)識為TraceId
          PreTraceId:服務(wù)之間相互調(diào)用的時(shí)候PreTraceId用來標(biāo)識父子關(guān)系的父TraceId
          AppName:當(dāng)前服務(wù)名稱
          AppNameTarget:目標(biāo)服務(wù)名稱
          GlobalTraceId:一次用戶操作或者是系統(tǒng)人物成為一個調(diào)用鏈,這個調(diào)用鏈的唯一標(biāo)識為GlobalTraceId
          TTL:跨越的服務(wù)次數(shù)
          X-Original-For:web調(diào)用的時(shí)候的用戶IP?

          2、Viper調(diào)用鏈追蹤體系解析?

            Viper的調(diào)用鏈?zhǔn)絻?nèi)嵌在 Anno.Rpc.Client中的,Rpc調(diào)用之前創(chuàng)建追蹤對象sys_trace記錄Request參數(shù),調(diào)用完成之后完善響應(yīng)Response結(jié)果并且把追蹤對象sys_trace寫入內(nèi)存隊(duì)列中。然后定時(shí)定量發(fā)送到追蹤服務(wù)器。

          偽代碼如下:

             /// 
          /// 追蹤隊(duì)列池
          ///

          public static class TracePool
          {
               //內(nèi)存隊(duì)列
          private static ConcurrentQueue TraceQueue { get; set; } = new ConcurrentQueue();
               //業(yè)務(wù)處理后推送追蹤對象到內(nèi)存隊(duì)列 TraceQueue
          public static void EnQueue(sys_trace trace, string result)
          {
          if (trace != null)
          {
          trace.UseTimeMs
          = (DateTime.Now - trace.Timespan).TotalMilliseconds;
          trace.Response
          = result;
          TraceQueue.Enqueue(trace);
          }
          }
               //創(chuàng)建追蹤對象
          public static sys_trace CreateTrance(Dictionary<string, string> input)
          {
          return new sys_trace()
          {
          Timespan
          = DateTime.Now,
          InputDictionary
          = input
          };
          }
          ///
          /// 批量發(fā)送調(diào)用鏈到 追蹤服務(wù)器(定時(shí)任務(wù)會定時(shí)調(diào)用TryDequeue)
          ///

          internal static void TryDequeue()
          {
          if (TraceQueue.IsEmpty)
          {
          return;
          }

          List
          traces = new List();
          ReTryDequeue:
          while (!TraceQueue.IsEmpty && traces.Count < 100)
          {
          TraceQueue.TryDequeue(
          out sys_trace trace);

             ------------轉(zhuǎn)換追蹤對象--------------
          if (trace.Rlt)
          {
          trace.Response
          = null;
          }

          traces.Add(trace);
          }
          if (traces.Count <= 0)
          {
          return;
          }
          Dictionary
          <string, string> inputTrace = new Dictionary<string, string>
          {
          {Const.Enum.Eng.NAMESPACE,
          "Anno.Plugs.Trace"},
          {Const.Enum.Eng.CLASS,
          "Trace"},
          {Const.Enum.Eng.METHOD,
          "TraceBatch"},
          {
          "traces", Newtonsoft.Json.JsonConvert.SerializeObject(traces)}
          };
                 //發(fā)送追蹤數(shù)據(jù)
          Connector.BrokerDns(inputTrace);
          if (!TraceQueue.IsEmpty)
          {
          traces.Clear();
          goto ReTryDequeue;
          }
          }

          }

          ??

          Viper

          github:
          https://github.com/duyanming/Viper
          文檔地址:
          https://duyanming.github.io/

          體驗(yàn)地址:(體驗(yàn)用戶為anno 密碼123456 同一時(shí)間一個用戶只能在一個終端登錄用戶多的時(shí)候可能發(fā)生強(qiáng)制退出的情況,稍后登錄體驗(yàn))
          http://140.143.207.244/

          ?

          關(guān)于Viper的更多內(nèi)容,隨后更新。敬請關(guān)注。開源不易,感謝Star。


          往期精彩回顧




          【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★

          .NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃

          【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引

          Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)

          .NET Core中的一個接口多種實(shí)現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了

          10個小技巧助您寫出高性能的ASP.NET Core代碼

          用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面

          在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度

          現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化

          關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議

          C#異步編程看這篇就夠了


          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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在线 | 超碰人人人 |