1、Viper是什么?

  Viper 是.NET平台下的Anno微服务框架的一个示例项目。入门简单安全稳定高可用全平台可监控。底层通讯可以随意切换thrift grpc 自带服务发现、调用链追踪、Cron 调度、限流、事件总线、CQRS 、DDD、类似MVC的开发体验,插件化开发

  一个不可监控的微服务平台是可怕的,出了问题 难以准确定位问题的根源, Anno则提供了一套完整的监控体系,包括链路追踪服务占用的系统资源、系统自身 CPU、内存、硬盘使用率实时可监控等等。

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

体验地址:(体验用户为anno 密码123456 同一时间一个用户只能在一个终端登录用户多的时候可能发生强制退出的情况,稍后登录体验)
http://140.143.207.244/

如果对Viper不了解可以看:

  1、 net core 微服务 快速开发框架 Viper 初体验

  2、打不死的小强 .net core 微服务 快速开发框架 Viper 限流

2、Viper调用链追踪 

  当我们进行微服务架构开发时,通常会划分出多个微服务,各服务之间通过RPC进行调用。一个业务操作,可能需要多个微服务的协同才能完成,在业务调用链路上任何一个微服务出现问题或者网络出现问题,都会导致业务失败。随着业务越来越复杂,微服务之间的协作也越来越多,越来越复杂。如果不能直观的看到整个调用链路,那么我们就无法快速、准确的定位问题、解决问题,有甚者出现服务之间出现死循环调用拖垮整个集群。这样我们不仅不能尝到微服务给我们带来的好处,反而引入了一堆更复杂的问题。因此对于一个微服务系统链路追踪是必要的。

  Viper为服务之间调用提供了一套完善的链路追踪体系。通过Viper可以清晰的看到一个调用链(一次业务操作)经过了哪些微服务、每个服务消耗多少时间、是否出现异常、处理结果如何等等。通过链路追踪体系可以分析整个业务的状态,比如那个服务或者业务操作耗时异常需要优化,快速定位问题解决问题。从而更好的为整个微服务体系服务。

  不仅如此还可以帮助公司新入职员工梳理梳理业务脉络,明白自己所处在的业务环节、预测系统可能发生的隐患,早发现早解决,防患于未然。

链路追踪列表:

 单个链路追踪示例:

  下面这个调用链路为:

   

  整个调用链路花费22毫秒,最后两个调用为并行。

3、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 

2、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。

net core 微服务框架 Viper 调用链路追踪的更多相关文章

  1. hello world .net core 微服务框架 Viper

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  2. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  3. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...

  4. 基于.NET CORE微服务框架 -浅析如何使用surging

    1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...

  5. 微服务SpringCloud之zipkin链路追踪

    随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...

  6. 基于.NET CORE微服务框架 -谈谈surging的服务容错降级

    一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...

  7. .net Core 微服务框架 surging 使用

    surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心, 集成了哈希,随机,轮询作为负载均衡的算法,RPC集成采用的 ...

  8. 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

    1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...

  9. 基于.NET CORE微服务框架 -Api网关服务管理

    1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...

随机推荐

  1. 再见了SpringMVC!这个框架有点厉害,甚至干掉了Servlet!

    # 前言 对 Java 开发者来说, Spring 发布 5.0 正式版,而新版 Spring 的一大特色,就是 Reactive Web 方案 Web Flux,这是用来替代 Spring Web ...

  2. JVM-概述和内存区域

    目录 JVM的优势 Java的跨平台性 JVM跨语言 举个例子 JVM整体结构 运行时数据区 方法区(Method Area) 1. 什么是方法区(Method Area)? 2.方法区(Method ...

  3. 3.Channel详解

  4. Kafka监控必备——Kafka-Eagle 2.0.2正式发布

    对于经常使用Kafka的同学,拥有一个炫酷又实用的监控系统是非常有必要的.可以实时的监控数据流的情况,了解实时数据流的变化. Kafka Eagle Kafka Eagle是一个监控系统,监控Kafk ...

  5. # js权威指南之对象篇

    对象是js中的关键 属性查找 in,Object.hasOwnProperty(),Object.propertyIsEnumerable()都能检测出对象内是否存在某个属性 in关键字 自有属性/继 ...

  6. 一篇文章带你了解Java OOP思想

    Java OOP 思想深度刨析 Java面向对象编程 面向对象编程简称OOP(Object--对象.Oriendted--导向的.Programming--程序设计) 面向对象通俗来讲,就是指使用丰富 ...

  7. 手写“SpringBoot”近况:IoC模块已经完成

    jsoncat:https://github.com/Snailclimb/jsoncat (About 仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架) ...

  8. 005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介

    005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介 Eclipse是一款集成开发工具--IDE. 集成开发环境(IDE,Integrated ...

  9. CF471D MUH and Cube Walls

    Link 一句话题意: 给两堵墙.问 \(a\) 墙中与 \(b\) 墙顶部形状相同的区间有多少个. 这生草翻译不想多说了. 我们先来转化一下问题.对于一堵墙他的向下延伸的高度,我们是不用管的. 我们 ...

  10. MySQL计算月份间隔的函数

    要求忽视具体日期,即 2020-01-31 与 2020-02-01 的月份间隔为:1 -- 格式必须为: '%Y%m' SELECT PERIOD_DIFF("202008" , ...