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

摘要:
续上篇,这篇我们来进一步探索Tye更多的使用方法。目前市面上也有非常多可用的开源方案,其中不乏开箱即用的优秀用例:SkyWalking、Jaeger和Zipkin等等。本篇,我们将探索Tye中已经实现扩展的Zipkin来演示一下分布式链路追踪的简易效果。这其实和使用Tye辅助开发k8s应用竟如此简单(二)中得到的测试用例是相同的。这将会在消息请求头中添加这是一种符合W3C标准追踪头信息。不过,如果开发者是net5应用,则不需要变更了,因为这已经是默认行为。

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

Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架。如果您是首次阅读本系列文章。建议可以先从本文末尾的入门文章开始了解。

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

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

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

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

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

创建测试应用

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

create-tye-zipkin-test.sh
dotnet new sln -n TyeTest

dotnet 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.csproj

dotnet 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:

Program.cs
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 应用,则不需要变更了,因为这已经是默认行为。有关此内容的详细信息,开发者可以参阅:

启用 Zipkin

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

tye.yml
name: tyetest
extensions:
- name: zipkin
services:
- name: tyetest
project: TyeTest/TyeTest.csproj
- name: tyetest2
project: 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 以便重复利用,避免每次都要启动浪费时间。

docker-compose.yml
version: '3.3'

services:
zipkin:
image: openzipkin/zipkin
restart: always
container_name: zipkin
ports:
- 9411:9411
tye.yml
name: tyetest
extensions:
- name: zipkin
services:
- name: tyetest
project: TyeTest/TyeTest.csproj
- name: tyetest2
project: TyeTest2/TyeTest2.csproj
- name: zipkin
external: true
bindings:
- name: http
containerPort: 9411

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

Jaeger 也可以

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

docker-compose.yml
version: '3.3'
services:
jaeger:
image: jaegertracing/all-in-one:1.21
restart: always
ports:
- 9411:9411
- 16686:16686
environment:
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 如何碰撞出更精彩的火花。

最后但是最重要!

如果读者对该内容感兴趣,欢迎转发、评论、收藏文章以及项目。

最近作者正在构建以 Actor 模式 和 事件溯源 为理论基础的一套服务端开发框架。希望为开发者提供能够便于开发出 “分布式”、“可水平扩展”、“可测试性高” 的应用系统 ——Newbe.Claptrap

本篇文章是该框架的一篇技术选文,属于技术构成的一部分。

项目文档库:claptrap.newbe.pro

联系方式:QQ 群 610394020

您还可以查阅本系列的其他选文:

理论入门篇

  1. Newbe.Claptrap - 一套以 “事件溯源” 和 “Actor 模式” 作为基本理论的服务端开发框架

术语介绍篇

  1. Actor 模式
  2. 事件溯源(Event Sourcing)
  3. Claptrap
  4. Minion
  5. 事件 (Event)
  6. 状态 (State)
  7. 状态快照 (State Snapshot)
  8. Claptrap 设计图 (Claptrap Design)
  9. Claptrap 工厂 (Claptrap Factory)
  10. Claptrap Identity
  11. Claptrap Box
  12. Claptrap 生命周期(Claptrap Lifetime Scope)
  13. 序列化(Serialization)
  14. 最小竞争资源 (Minimal Competing Resources)

样例实践篇

  1. 设计一个火车票销售系统

开发工具篇

  1. 使用 Tye 辅助开发 k8s 应用竟如此简单(一)
  2. 使用 Tye 辅助开发 k8s 应用竟如此简单(二)
  3. 使用 Tye 辅助开发 k8s 应用竟如此简单(三)
  4. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)
  5. 使用 Tye 辅助开发 k8s 应用竟如此简单(五)
  6. 使用 Tye 辅助开发 k8s 应用竟如此简单(六)

其他番外篇

  1. 谈反应式编程在服务端中的应用,数据库操作优化,从 20 秒到 0.5 秒
  2. 谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
  3. 十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
  4. docker-mcr 助您全速下载 dotnet 镜像
  5. 十多位全球技术专家,为你献上近十个小时的.Net 微服务介绍
  6. 年轻的樵夫哟,你掉的是这个免费 8 核 4G 公网服务器,还是这个随时可用的 Docker 实验平台?
  7. 如何使用 dotTrace 来诊断 netcore 应用的性能问题
  8. 只要十步,你就可以应用表达式树来优化动态调用

GitHub 项目地址:https://github.com/newbe36524/Newbe.Claptrap

Gitee 项目地址:https://gitee.com/yks/Newbe.Claptrap

您当前查看的是先行发布于www.newbe.pro上的博客文章,实际开发文档随版本而迭代。若要查看最新的开发文档,需要移步claptrap.newbe.pro

Newbe.Claptrap

------ 本文结束 ------

免责声明:文章转载自《使用 Tye 辅助开发 k8s 应用竟如此简单(五)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql排序字段为空的排在最后面Linux中的汇编简介下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

K8S(rancher) 服务(POD)定时重启服务方案

目标 每天在固定时间点,重启服务。 运行N小时后重启服务。 难点: 原先Linux虚拟机部署中,可以轻易实现。 现在Docker K8S 如何实现? 解决方案: 巧用 rancher 2.* 新特性 -- 存活状态检查(liveness)特性说明健康检查 在容器启动后的N秒后以N秒的频率执行一次检查 TCP 端口检查  HTTP 请求状态检查(2...

K8S从入门到放弃系列-(3)部署etcd集群

摘要:etcd 是k8s集群最重要的组件,用来存储k8s的所有服务信息, etcd 挂了,集群就挂了,我们这里把etcd部署在master三台节点上做高可用,etcd集群采用raft算法选举Leader, 由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群。 官方地址 https...

k8s service不能访问排错

简介 对于新安装的 Kubernetes,经常出现的一个问题是 Service 没有正常工作。如果您已经运行了 Deployment 并创建了一个 Service,但是当您尝试访问它时没有得到响应,希望这份文档能帮助您找出问题所在。​ Service工作逻辑 为了完成本次演练的目的,我们先运行几个 Pod $ kubectl run hostnames...

k8s集群部分常见问题处理

目录部分常见问题处理 Coredns CrashLoopBackOff 导致无法成功添加工作节点的问题 添加工作节点时提示token过期 kubectl 执行命令报“The connection to the server localhost:8080 was refused” 网络组件flannel无法完成初始化 部分节点无法启动pod  最后  ...

K8S 上部署 Redis-cluster 三主三从 集群

介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序集合。 由于Redis接受多种格式的密钥,因此可以在服务器上执行操作,从而减少了客户端的工作量。 它仅将磁盘用于持久性,而将数据库完全保存在内存中。Redis是一种流行的数据...

k8S--05 K8s控制器类型

目录 K8s控制器类型 一、pod控制器 二、ReplicaSet控制器 三、Deployment资源配置清单 四、Service控制器 五、Ingress控制器介绍 1.安装部署traefik 2.创建traefik的web-ui的ingress规则 3.ingress实验 K8s控制器类型 一、pod控制器 0.控制器作用 pod...