使用 Tye 辅助开发 k8s 应用竟如此简单(五)

使用 Tye 辅助开发 k8s 应用竟如此简单(一)

使用 Tye 辅助开发 k8s 应用竟如此简单(二)

使用 Tye 辅助开发 k8s 应用竟如此简单(三)

使用 Tye 辅助开发 k8s 应用竟如此简单(四)

续上篇,这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中实现对分布式链路追踪。

我是谁?我在哪儿?我咋了?

分布式系统纷繁复杂,特别以现在微服务架构的出现,使得应用系统中的应用实例变得更加多变难以捉摸。

那么如何在如此繁杂的系统中找到一条业务调用链的上下游关系、性能细节、业务数据等等成为了一项开发者必然要面对的挑战。

使用分布式链路追踪系统无非是解决该问题的一个良好方法。目前市面上也有非常多可用的开源方案,其中不乏开箱即用的优秀用例:SkyWalking、Jaeger和Zipkin等等。

本篇,我们将探索 Tye 中已经实现扩展的 Zipkin 来演示一下分布式链路追踪的简易效果。

创建测试应用

要测试分布式情况,那么至少需要两个应用实例才能够体现效果。因此,此处创建两个测试服务实例:

dotnet new sln -n TyeTestdotnet new webapi -n TyeTest
dotnet add ./TyeTest/TyeTest.csproj package Microsoft.Tye.Extensions.Configuration --version 0.6.0-alpha.21070.5
dotnet sln ./TyeTest.sln add ./TyeTest/TyeTest.csprojdotnet new webapi -n TyeTest2
dotnet sln ./TyeTest.sln add ./TyeTest2/TyeTest2.csproj
tye init

在 TyeTest 项目的 Startup.cs 增加对 HttpClientFactory 的注册。

  public void ConfigureServices(IServiceCollection services){
+     services.AddHttpClient();services.AddControllers();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "TyeTest", Version = "v1" });});}

进入 WeatherForecastController, 我们使用 HttpClient 来调用下游服务,并且将得到的数据返回:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;namespace TyeTest.Controllers
{[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;private readonly IConfiguration _configuration;private readonly HttpClient _httpClient;public WeatherForecastController(ILogger<WeatherForecastController> logger,IConfiguration configuration,HttpClient httpClient){_logger = logger;_configuration = configuration;_httpClient = httpClient;}[HttpGet]public async Task<string> Get(){var serviceUri = _configuration.GetServiceUri("tyetest2");Console.WriteLine(serviceUri);var httpResponseMessage = await _httpClient.GetAsync($"{serviceUri}WeatherForecast");var json = await httpResponseMessage.Content.ReadAsStringAsync();return json;}}
}

这样,我们就得到了一个在服务 TyeTest 中调用 TyeTest2 的一个服务间调用的示例。

这其实和 《使用 Tye 辅助开发 k8s 应用竟如此简单(二)》 中得到的测试用例是相同的。

然后使用tye run便可以启用测试应用。开发者可以在 swagger 页面中测试具体的效果。

但是!其实没完。此处我们还需要修改Program.cs变更默认的Activity.DefaultIdFormat:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;namespace TyeTest
{public class Program{public static void Main(string[] args){Activity.DefaultIdFormat = ActivityIdFormat.W3C;CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});}
}

注意,两个应用都需要修改。

这将会在消息请求头中添加这是一种符合 W3C 标准追踪头信息。不过,如果开发者是 net5 应用,则不需要变更了,因为这已经是默认行为。有关此内容的详细信息,开发者可以参阅:

  • https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/

  • https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/default-activityidformat-changed

启用 Zipkin

接下来,我们修改 tye.yml 来启用 zipkin 以监控服务间的调用:

name: tyetest
extensions:- name: zipkin
services:- name: tyetestproject: TyeTest/TyeTest.csproj- name: tyetest2project: TyeTest2/TyeTest2.csproj

没错,其实只是加了extensions就完成了。

使用tye run,启动应用,便可以在 dashboard 中查看到自动部署起来的 zipkin:

zipkin in dashboard

打开对应链接,便可以看到对应的 zipkin 查询界面:

zipkin search ui

然后,我们打开 tyetest 服务的 swagger 界面,进行一次调用。然后在回来查询,便可以查询到服务调用的情况:

zipkin results

点击其中的 Show 按钮,便可以查看到一次服务调用的详细过程信息:

one tracing

这就是使用 zipkin 对 http 调用进行追踪的最简易示例。

自行部署 Zipkin

和 seq 一样,开发者可以使用已经部署好的 zipkin 以便重复利用,避免每次都要启动浪费时间。

version: '3.3'services:zipkin:image: openzipkin/zipkinrestart: alwayscontainer_name: zipkinports:- 9411:9411
name: tyetest
extensions:- name: zipkin
services:- name: tyetestproject: TyeTest/TyeTest.csproj- name: tyetest2project: TyeTest2/TyeTest2.csproj- name: zipkinexternal: truebindings:- name: httpcontainerPort: 9411

和 seq 一样,通过自行部署 zipkin 实例。然后修改 tye.yml 使得服务得以连接。预期效果与前面一节相同。但是节约了每次启动都需要启动 zipkin 实例的时间。

Jaeger 也可以

实际上,只要是 zipkin 协议兼容的收集端,那么都可以被这种方式集成。因此,我们该用 Jaeger 作为后端进行测试。

version: '3.3'
services:jaeger:image: jaegertracing/all-in-one:1.21restart: alwaysports:- 9411:9411- 16686:16686environment:COLLECTOR_ZIPKIN_HTTP_PORT: 9411

tye.yml和先前对比没有变化。

启用并测试应用。便可以在 jaeger dashboard 得到类似的结果:

jaeger result

当然,使用与 Zipkin 兼容的 SkyWalking 也是可以的,开发者可以自行尝试。

更详细的追踪

如果在应用程序中需要更加细致的追踪细节,那么可以使用 OpenTelemetry 相关的类库在系统中进行集成。然后通过 Tye 获取对应服务的 connectionString 便可以实现自行导出特定的活动细节。

这里,开发者可以参照 《使用 Tye 辅助开发 k8s 应用竟如此简单(二)》 中连接 mongodb 的方式进行实验。

《OpenTelemetry .NET》https://github.com/open-telemetry/opentelemetry-dotnet《OpenTelemetry - 云原生下可观测性的新标准》https://blog.csdn.net/sd7o95o/article/details/112645413

最后,发到 K8S 里面试一下

注意,和前面的 seq 一样。tye deploy 并不会自动部署对应的 zipkin 服务。

因此,如果要部署extensions包含 zipkin 的 tye.yml。请确保 k8s 集群中存在名称为 zipkin 的服务,这样数据才会被收集。

小结

本篇,我们已经顺利完成了使用 Tye 中的 zipkin 扩展来实现分布式链路追踪。

下一篇,我们将进一步研究 Tye 如何与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花。

本文作者:newbe36524

本文链接:https://www.newbe.pro/Newbe.Claptrap/Try-Tye-5/

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解冒泡排序

转自&#xff1a;静默虚空http://www.cnblogs.com/jingmoxukong/p/4302718.html要点冒泡排序是一种交换排序。什么是交换排序呢&#xff1f;交换排序&#xff1a;两两比较待排序的关键字&#xff0c;并交换不满足次序要求的那对数&#xff0c;直到整个表都满足次序要求为止。算…

java面向对象使用字符串_java面向对象中的String类中12种常用的方法

1、字符串与字符数组的转换字符串可以使用toCharArray()方法变成一个字符数组&#xff0c;也可以使用String类的构造方法把一个字符数组变成一个字符串。public class StringAPIDemo01{public static void main(String[] args){String str1 "hello"; //定义字符串ch…

python测试4_Python 各种测试框架简介(四):pytest

pytest 有时也被称为 py.test&#xff0c;是因为它使用的执行命令是 $ py.test。本文中我们使用 pytest 指代这个测试框架&#xff0c;py.test 特指运行命令。##较于 nose这里没有使用像前三篇一样(简介-举例-discovery-环境)式的分段展开&#xff0c;是因为 pytest 与 nose 的…

在Eigrp做不等值路由的负载均衡

在Eigrp做不等值路由的负载均衡 EIGRP Load Balancing 每个路由协议都支持等值路径的负载均衡.除此之外,IGRP和EIGRP也支持不等值路径的负载均衡,使用variance命令. Variance命令向路由器通告一个n值,n值使用variance命令指定.n值为1-128之间&#xff0c;默认为1。 网络拓扑 Va…

雪花算法Snowflake

雪花Id生成算法&#xff0c;是鼎鼎有名的分布式Id生成算法。它的优点在于&#xff0c;在分布式系统中快速生成有时间顺序的唯一编号&#xff01;Snowflake实测每秒可生成900万个唯一Id。Nuget包&#xff1a;NewLife.Core源码地址&#xff1a;https://github.com/NewLifeX/X/blo…

java爬取新浪微博登陆_30行jsoup代码搞定新浪微博登录抓取爬虫

主要是设置cookies 想知道方法的朋友可以留言哦爬虫问题都可以探讨哦import java.io.IOException;import java.util.HashMap;import java.util.Map;import org.jsoup.Connection;import org.jsoup.Connection.Method;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;p…

像小猪佩奇那样生活,需要多少钱?

每个有娃的家庭&#xff0c;几乎都有一个小猪佩奇的超级粉丝《小猪佩奇》&#xff08;又名《粉红猪小妹》&#xff09;史上最赚钱的英国学前电视动画片动画之一有网友从经济的角度算了笔账像佩奇一家那样生活需要多少钱呢&#xff1f;▼这是佩奇的家&#xff0c;视野相当不错的…

几何画板自定义工具_几何画板最强版 v5.06 中文版(含教程/实例/控件/打包机/工具集)...

相信还有很多地方的网课没有结束&#xff0c;前两天有小伙伴在后台留言求几何画板&#xff0c;这款软件大都收费&#xff0c;所以小软公然发到这里怕是不太稳妥&#xff0c;如果被删除就是被举报啦&#xff0c;需要的小伙伴速度下载保存~几何画板英文名&#xff1a;Sketchpad&a…

解惑3G业务

内容简介&#xff1a; 本书系统地介绍了第三代移动通信系统的业务&#xff0c;主要从业务概念、业务实现流程、关键技术、关键问题以及解决问题的思路几个角度进行介绍。本书内容包括&#xff1a;通信业务发展整体分析、3G的移动视频业务、基于SIP的移动“邀请”业务、移动位置…

Delphi 26 岁

喜欢就关注我们吧&#xff01;诞生于1995年的 Delphi 现在已经 26 岁了。1995年2月14日&#xff0c;Borland 公司推出了面向开发者的新工具——Delphi&#xff0c;旨在接替 DOS 时代盛行一时的 Turbo Pascal。说到这两款产品必然离不开它们的灵魂人物——Anders Hejlsberg&…

row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别

需求描述&#xff1a;分析最近三个月每天排名前30的邮箱收件数量。涉及到的表字段&#xff1a;发件时间&#xff0c;收件人。一、ROW_NUMBER表t查询出了3月每天不同类型邮箱收件量的降序排名&#xff0c;表t1通过ROW_NUMBER函数给每行数据添加序列号&#xff0c;select ROW_NUM…

在U盘上安装linux

所谓在U盘上安装Linux&#xff0c;就是在U盘上放置一些文件&#xff0c;可以让电脑从U 盘启动linux&#xff08;需要电脑支持从U盘启动&#xff09;。这篇教程简单说一下怎么在U盘上安装DSL。主要是这个发行版小&#xff0c;50M左右&#xff0c;而且包含了该有的很多软件。前提…

java中的console是干什么的_[Java教程]javascript中,你真的会用console吗?

[Java教程]javascript中&#xff0c;你真的会用console吗&#xff1f;0 2015-08-11 17:00:09使用console进行性能测试和计算代码运行时间对于前端开发人员&#xff0c;在开发过程中经常需要监控某些表达式或变量的值&#xff0c;如果使用用debugger会显得过于笨重&#xff0c;最…

边缘计算k8s集群之SuperEdge

什么是边缘计算边缘计算&#xff0c;是指在靠近物或数据源头的一侧&#xff0c;采用网络、计算、存储、应用核心能力为一体的开放平台&#xff0c;就近提供最近端服务。其应用程序在边缘侧发起&#xff0c;产生更快的网络服务响应&#xff0c;满足行业在实时业务、应用智能、安…

python中getrandbits函数用法_python random - 刘江的python教程

random阅读: 8288评论&#xff1a;1random模块用于生成伪随机数。真正意义上的随机数(或者随机事件)是按照实验过程中表现的分布概率随机产生的&#xff0c;其结果是不可预测的。而计算机中的随机数是所谓的随机函数按照一定算法模拟产生的&#xff0c;其结果是确定的&#xff…

让你的系统移动起来

最近一直在捣鼓linux系统&#xff0c;听一大哥说想搞好它&#xff0c;最简单的方法就是经常用&#xff0c;用的久了也就自然简单了。。就跟我们用windows一样。。在linux系统里&#xff0c;我最喜欢的是Ubuntu。。个人感觉它做的还不错&#xff0c;有丰富的三方软件支持&#x…

java一个界面用另一个界面的值_如何将参数/值从一个弹出窗口传递到Angular2中的另一个弹出窗口...

我在Angular2中有一个要求&#xff0c;我需要打开第一个弹出窗口&#xff0c;用户会输入一些值 . 在某些用户事件(即按钮单击)上&#xff0c;我需要关闭该弹出窗口并打开另一个弹出窗口&#xff0c;其中包含用户在第一个弹出窗口中输入的值 .我创建了一个plunker&#xff0c;我…

简约而不简单的 Django 新手图文教程

来源&#xff1a;cizixssegmentfault.com/a/1190000008387882本文面向&#xff1a;有python基础&#xff0c;刚接触web框架的初学者。环境&#xff1a;windows7&#xff0c;python3.5.1&#xff0c;pycharm专业版&#xff0c;Django 1.10版&#xff0c;pip3一、Django简介百度百…

通俗系列之同步、异步、阻塞和非阻塞

前言在日常的开发中&#xff0c;经常出现同步、异步、阻塞和非阻塞等概念。有些人搞不清楚什么代码是同步&#xff0c;什么代码是异步。有些人说我用异步了啊&#xff0c;为什么效率还是没提高呢&#xff1f;也许你是用异步了&#xff0c;但是可能是异步阻塞了。有些人一听说异…

python的matplotlib库内的函数_如何在matplotlib中找到函数下面的区域?

我是python和matplotlib库的新手&#xff0c;我试图在绘图中得到函数行下方的区域。我有一个变量a&amp&#xff1b;b&#xff0c;它在我的绘图中移动一个矩形。我也许可以使用原始数学来解决这个问题&#xff0c;但我想知道是否有一种更简单的方法来实现我正在尝试使用matp…