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. hystrix文档翻译之运维

    hystrix不仅用作工程可靠性还可以用来运维. 这里将会分享一个拥有100+Hystrix命令,40+线程池,每天有100亿次线程请求,2000亿次信号量请求的系统是如何使用hystrix运维的.这 ...

  2. leetcode1546题解【前缀和+贪心】

    leetcode1546.和为目标值的最大数目不重叠非空子数组数目 题目链接 算法 前缀和+贪心 时间复杂度O(n). 1.对nums数组求前缀和: 2.在求前缀和过程中将前缀和sum插入到set集合 ...

  3. 我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!

    写在前面 事情是这样的,今年疫情期间,我在某云购买了一套服务器,做什么呢?不是用来部署项目,也不是用来搭建网站,而是用来做代码备份和管理.没错,都是我个人的代码,也许你会说,你个人能有多少代码啊?确实 ...

  4. Nginx+Gunicorn+Supervisor部署Flask应用

    Flask 内置了简单的 Web 环境,让我们在开发的时候只需要专注于应用实现,而真正要在生产环境运行时这个简单的 Web 环境就不够用了,还需要一系列操作才能让 Web 应用高效的运行起来.现在记录 ...

  5. NMOS和PMOS区别

    在很多电路途中会出现NMOS和PMOS管,因为不是中文那么直接,都说管压降之类的,但其实它的导通很重要以及区别,关系到你点亮电子元件> 参考: 1.https://blog.csdn.net/l ...

  6. 【题解】CF1324F

    Question 题目大意:每个点不是黑点就是白点,求以每一个点为根时,选择出一个联通块,使得白点数与黑点数之差最大(白减黑). \(Solution\) 考虑先跑一遍\(dp\). 可以写出一个比较 ...

  7. SpringCould中的Hystrix

    一.简介 源码地址:https://gitee.com/xiaocheng0902/my-cloud.git 1,定义 Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多 ...

  8. Linux init 详解(0,1,2,3,4,5,6)

    一.什么是 init init是Linux系统操作中不可缺少的程序之一. 所谓的init进程,它是一个由内核启动的用户级进程. 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数 ...

  9. ORA-00018: maximum number of sessions exceeded 超出最大会话数

    ORA-00018: maximum number of sessions exceededORA-00018: 超出最大会话数 Cause:       All session state obje ...

  10. shell-变量的数值运算let内置命令

    1. let命令的用法 格式: let 赋值表达式 [注]let赋值表达式功能等同于:((赋值表达式))  范例1:给自变量i加8 [root@1-241 scripts]# i=2 [root@1- ...