net core 微服務框架 Viper 調用鏈路追蹤

一、Viper是什麼?

  Viper 是.NET平臺下的Anno微服務框架的一個示例項目。入門簡單安全穩定高可用全平臺可監控。底層通信能夠隨意切換thrift grpc 自帶服務發現、調用鏈追蹤、Cron 調度、限流、事件總線、CQRS 、DDD、相似MVC的開發體驗,插件化開發html

  一個不可監控的微服務平臺是可怕的,出了問題 難以準肯定位問題的根源, Anno則提供了一套完整的監控體系,包括鏈路追蹤服務佔用的系統資源、系統自身 CPU、內存、硬盤使用率實時可監控等等。java

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

體驗地址:(體驗用戶爲anno 密碼123456 同一時間一個用戶只能在一個終端登陸用戶多的時候可能發生強制退出的狀況,稍後登陸體驗)
http://140.143.207.244/github

若是對Viper不瞭解能夠看:web

  一、 net core 微服務 快速開發框架 Viper 初體驗編程

  二、打不死的小強 .net core 微服務 快速開發框架 Viper 限流安全

二、Viper調用鏈追蹤 

  當咱們進行微服務架構開發時,一般會劃分出多個微服務,各服務之間經過RPC進行調用。一個業務操做,可能須要多個微服務的協同才能完成,在業務調用鏈路上任何一個微服務出現問題或者網絡出現問題,都會致使業務失敗。隨着業務愈來愈複雜,微服務之間的協做也愈來愈多,愈來愈複雜。若是不能直觀的看到整個調用鏈路,那麼咱們就沒法快速、準確的定位問題、解決問題,有甚者出現服務之間出現死循環調用拖垮整個集羣。這樣咱們不只不能嚐到微服務給咱們帶來的好處,反而引入了一堆更復雜的問題。所以對於一個微服務系統鏈路追蹤是必要的。

   Viper爲服務之間調用提供了一套完善的鏈路追蹤體系。經過Viper能夠清晰的看到一個調用鏈(一次業務操做)通過了哪些微服務、每一個服務消耗多少時間、是否出現異常、處理結果如何等等。經過鏈路追蹤體系能夠分析整個業務的狀態,好比那個服務或者業務操做耗時異常須要優化,快速定位問題解決問題。從而更好的爲整個微服務體系服務。服務器

  不只如此還能夠幫助公司新入職員工梳理梳理業務脈絡,明白本身所處在的業務環節、預測系統可能發生的隱患,早發現早解決,防患於未然。網絡

鏈路追蹤列表:架構

  單個鏈路追蹤示例:

  下面這個調用鏈路爲:

   

   整個調用鏈路花費22毫秒,最後兩個調用爲並行。

 

三、Viper&Anno 遠程過程調用(RPC)

  Anno 框架底層Rpc採用了成熟的 thrift(首選推薦)grpc他們都有着高性能跨語言的特色,所以Anno框架也是一個跨語言的,能夠輕鬆實現混合編程的框架。目前支持.net core、.net framework、java,更多的實現期待你們共同努力一塊兒貢獻。

  Thrift是一種接口描述語言和二進制通信協議,它被用來定義和建立跨語言的服務。它被看成一個遠程過程調用(RPC)框架來使用,是由Facebook爲「大規模跨語言服務開發」而開發的。目前託管在Apache,更多詳細可翻閱網上資料。

  

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

  gRPC 基於 HTTP/2 標準設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 鏈接上的多複用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間佔用。

 

以Thrift爲例來了解Anno框架

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

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

服務之間通信的接口爲 string broker(1:map<string,string> input),服務之間通信採用的是 Thrift的 二進制傳輸。

/// <summary>
    /// Engine 常量
    /// </summary>
    public static class Eng
    {
        /// <summary>
        /// 命名空間
        /// </summary>
        public const string NAMESPACE = "channel";
        /// <summary>
        ////// </summary>
        public const string CLASS = "router";
        /// <summary>
        /// 方法
        /// </summary>
        public const string METHOD = "method";
    }
channel、router、method此三個參數是遠程過程調用過程當中的必須參數
以插件 Anno.Plugs.LogicService爲例
namespace Anno.Plugs.LogicService
{
    using Anno.CommandBus;

    public class PlatformModule : BaseModule
    {
        --------------省略-------------------
        /// <summary>
        /// 獲取用戶功能
        /// </summary>
        /// <returns></returns>
        [AnnoInfo(Desc = "獲取用戶功能")]
        public ActionResult GetFunc()
        {
            return _platformQuery.GetFunc(Profile);
        }
    }
}    
channel 對應:Anno.Plugs.Logic
router  對應:Platform
method  對應:GetFunc
 
保留關鍵字:TraceId,PreTraceId,AppName,AppNameTarget,GlobalTraceId,TTL,X-Original-For
TraceId:一次Rpc調用成爲一個span,這個調用的惟一標識爲TraceId
PreTraceId:服務之間相互調用的時候PreTraceId用來標識父子關係的父TraceId
AppName:當前服務名稱
AppNameTarget:目標服務名稱
GlobalTraceId:一次用戶操做或者是系統人物成爲一個調用鏈,這個調用鏈的惟一標識爲GlobalTraceId
TTL:跨越的服務次數
X-Original-For:web調用的時候的用戶IP 

二、Viper調用鏈追蹤體系解析 

  Viper的調用鏈式內嵌在 Anno.Rpc.Client中的,Rpc調用以前建立追蹤對象sys_trace記錄Request參數,調用完成以後完善響應Response結果而且把追蹤對象sys_trace寫入內存隊列中。而後定時定量發送到追蹤服務器。

僞代碼以下:

   /// <summary>
    /// 追蹤隊列池
    /// </summary>
    public static class TracePool
    {
     //內存隊列
private static ConcurrentQueue<sys_trace> TraceQueue { get; set; } = new ConcurrentQueue<sys_trace>();      //業務處理後推送追蹤對象到內存隊列 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); } }
     //建立追蹤對象
public static sys_trace CreateTrance(Dictionary<string, string> input) { return new sys_trace() { Timespan = DateTime.Now, InputDictionary = input }; } /// <summary> /// 批量發送調用鏈到 追蹤服務器(定時任務會定時調用TryDequeue) /// </summary> internal static void TryDequeue() { if (TraceQueue.IsEmpty) { return; } List<sys_trace> traces = new List<sys_trace>(); ReTryDequeue: while (!TraceQueue.IsEmpty && traces.Count < 100) { TraceQueue.TryDequeue(out sys_trace trace);
   ------------轉換追蹤對象--------------
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)} };
       //發送追蹤數據 Connector.BrokerDns(inputTrace);
if (!TraceQueue.IsEmpty) { traces.Clear(); goto ReTryDequeue; } } }

  

Viper

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

體驗地址:(體驗用戶爲anno 密碼123456 同一時間一個用戶只能在一個終端登陸用戶多的時候可能發生強制退出的狀況,稍後登陸體驗)
http://140.143.207.244/

 

關於Viper的更多內容,隨後更新。敬請關注。開源不易,感謝Star。

相關文章
相關標籤/搜索