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 ...
随机推荐
- 【Java并发编程】synchronized相关面试题总结
目录 说说自己对于synchronized关键字的了解 synchronized关键字的三种使用 synchronized关键字的底层原理 JDK1.6之后对synchronized关键字进行的优化 ...
- 【论文】The Road to SDN: An Intellectual History of Programmable Networks
目录 ABSTRACT: 1 Introduction: 2 The Road to SDN: 2.1 Active Networking Technology push and use pull I ...
- dubbo学习(二)配置dubbo XML方式配置
provider(生产者) <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo= ...
- 刷题[GXYCTF2019]禁止套娃
梳理思路 打开网站,发现很简单,只有flag在哪里的字样. 查看源码,常用后台目录,robots.txt,都未发现有任何东西. 扫描 直接拉进扫描器一扫,发现 思考可能是git源码泄露,可能可以恢复源 ...
- dpwwn-01靶机渗透
dpwwn-01 主机发现+端口扫描 发现3306端口,80端口. 访问80端口,进行目录爆破,没有什么发现,主要点还是在数据库. 登录,没有密码. 进入数据库,查找敏感信息. 查看到ssh的用户,进 ...
- 命令执行漏洞攻击&修复建议
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec.shell_exec.passthru.popen.proc_popen等函数可以执行系统命令.当黑客能控制这些函 ...
- mysql 空值(null)和空字符('')的区别
日常开发中,一般都会涉及到数据库增删改查,那么不可避免会遇到Mysql中的NULL和空字符. 空字符(")和空值(null)表面上看都是空,其实存在一些差异: 定义: 空值(NULL)的长度 ...
- Python实现的数据结构与算法之链表详解
一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循 ...
- Lesktop开源IM移动端:接入LayIM移动端UI
在<开源企业即时通讯和在线客服>中已介绍了Lesktop的桌面模式和Web模式,但是没有移动端.评论中 dotnetcms.org工作室 提到了LayIM,看了一下官网的演示和文档,如果用 ...
- Java基础系列-RandomAccess
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755424.html Random是随机的意思,Access是访问的意思,合起来就是随机访问的意思. ...