net core 微服务框架 Viper 调用链路追踪
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调用链追踪
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 调用链路追踪的更多相关文章
- hello world .net core 微服务框架 Viper
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
- 基于.NET CORE微服务框架 -浅析如何使用surging
1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...
- 微服务SpringCloud之zipkin链路追踪
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位 ...
- 基于.NET CORE微服务框架 -谈谈surging的服务容错降级
一.前言 对于不久开源的surging受到不少.net同学的青睐,也受到.net core学习小组的关注,邀请加入.NET China Foundation以方便国内.net core开源项目的推广, ...
- .net Core 微服务框架 surging 使用
surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心, 集成了哈希,随机,轮询作为负载均衡的算法,RPC集成采用的 ...
- 基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级
1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身 ...
- 基于.NET CORE微服务框架 -Api网关服务管理
1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...
随机推荐
- RXJAVA之创建被观察者
RXJava中提供了多种创建数据源的方式 使用create方法 Observable<String> observable = Observable.create(new Observab ...
- NuxtJS快速入门
服务器端渲染(SSR) 知识储备 ES6 Nodejs Vue React Angular 什么是服务器端渲染 前端渲染:html页面作为静态文件存在,前端请求时后端不对该文件做任何内容上的修改,直接 ...
- Registry 容器镜像服务端细节
引言 通常我们在使用集群或者容器的时候,都会接触到存储在本地的镜像,也或多或少对本地镜像存储有一定的了解.但是服务端的镜像存储细节呢?本文主要介绍容器镜像的服务端存储结构,对于自建镜像服务或是对容器镜 ...
- 一文了解.Net Core 3.1 Web API基础知识
一.前言 随着近几年前后端分离.微服务等模式的兴起,.Net Core也似有如火如荼之势 ,自16年发布第一个版本到19年底的3.1 LTS版本,以及将发布的.NET 5,.NET Core一路更迭, ...
- django 的初始项目结构
2.创建Django项目 root@dev:shiyanlou_project# workon syl (syl) root@dev:shiyanlou_project# cd /aaa/shiy ...
- shiro认证流程源码分析--练气初期
写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...
- 050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句 本文知识点:continue语句 continue语句 continue ...
- python数据结构之二叉树的遍历实例
遍历方案 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作: 1).访问结点本身(N) 2).遍历该结点的 ...
- Combine 框架,从0到1 —— 5.Combine 常用操作符
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 5.Combine 常用操作符. 内容概览 前言 print breakpoint handleEve ...
- 你知道CPU结构也会影响Redis性能吗?
啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...