PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • 下载器

  • 作业网站管理

  • 联邦学习

  • 随手写的小项目

  • docker

  • 即时通讯

    • 想自己写一个高性能的IM
    • 自己实现高性能IM-服务划分
    • 自己实现高性能IM-初始代码框架搭建并实现依赖注入
    • kitex 与 hertz 配合使用,实现服务发现链路追踪等功能
    • 项目
    • 即时通讯
    PeaceSheep
    2024-11-04
    目录

    kitex 与 hertz 配合使用,实现服务发现链路追踪等功能

    本教程将以登录用户为例,说明整个微服务系统的架构和运作流程。

    # 1. 链路追踪

    kitex支持多种链路追踪,这里选用了opentelemetry。OpenTelemetry 是一个开源的可观测性框架,它提供了一种标准化的方法来收集、处理和导出遥测数据,涵盖了跟踪(Trace)、指标(Metrics)和日志(Logs)。该框架包含了一套通用的 API、SDK 和工具,从而简化了应用程序可观测性的实现过程,使其更加统一。

    然而,OpenTelemetry 本身只是一个框架,它定义了数据的标准和收集方式,但并不提供数据的存储和展示功能。因此,为了充分利用 OpenTelemetry 收集的跟踪数据,需要一个相应的平台来进行数据的接收、存储和可视化。在这方面,Jaeger 是一个理想的选择。

    Jaeger 能够直接接收由 OpenTelemetry SDK 生成的跟踪数据。这意味着,当应用程序通过 OpenTelemetry 进行检测并收集跟踪信息时,这些信息可以无缝地被发送到 Jaeger。在 Jaeger 平台上,这些数据得以存储,并通过其强大的可视化工具进行展示,从而帮助开发者分析和理解服务之间的交互和性能表现。因此,Kitex 选择支持 OpenTelemetry 并结合 Jaeger,为开发者提供了一套完整的链路追踪解决方案。

    # jaeger安装

    到官网 (opens new window)直接下载就可以,各个系统都有。以windows为例,下载好后,使用管理员身份的cmd运行all-in-one即可。

    # opentelemetry在kitex中的使用

    参照链路追踪 (opens new window)。

    # 查看

    打开本地的16686端口,即可看到如下界面:

    此时说明我们的链路追踪已经好了。

    # 代码实现

    只要在项目中运行下面的代码即可,不管在什么地方都可以,比如main函数里面或者随便一个函数,他会影响到整个项目的全局:

    服务端:

    package trace
    
    import (
    	"github.com/hertz-contrib/obs-opentelemetry/provider"
    	"github.com/li1553770945/sheepim-user-service/biz/infra/config"
    )
    
    func InitTrace(config *config.Config) provider.OtelProvider {
    	p := provider.NewOpenTelemetryProvider(
    		provider.WithServiceName(config.ServerConfig.ServiceName),
    		provider.WithExportEndpoint(config.OpenTelemetryConfig.Endpoint),
    		provider.WithInsecure(),
    	)
    	return p
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    1. 服务发现

    这里只介绍etcd,其他方法类似

    服务端;

    r, err := etcd.NewEtcdRegistry(App.Config.EtcdConfig.Endpoint) 
    if err != nil {
      klog.Fatal(err)
    }
    serviceName := App.Config.ServerConfig.ServiceName
    svr := authservice.NewServer(
      new(AuthServiceImpl),
      server.WithSuite(tracing.NewServerSuite()),
      server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}),
      server.WithRegistry(r), //核心是这个
      server.WithServiceAddr(addr),
    )
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    客户端:

    func NewUserClient(config *config.Config) userservice.Client {
    	r, err := etcd.NewEtcdResolver(config.EtcdConfig.Endpoint)
    	userClient, err := userservice.NewClient(
    		config.RpcConfig.UserServiceName, // 要找的服务的名字
    		client.WithResolver(r), //核心是这个
    		client.WithSuite(tracing.NewClientSuite()),
    		client.WithClientBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: config.ServerConfig.ServiceName}), //自己这个服务的名字
    	)
    	if err != nil {
    		log.Fatal(err)
    	}
    	return userClient
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    编辑 (opens new window)
    上次更新: 2025/04/15, 10:52:45
    自己实现高性能IM-初始代码框架搭建并实现依赖注入

    ← 自己实现高性能IM-初始代码框架搭建并实现依赖注入

    最近更新
    01
    ubuntu安装g++显示已有但是输入g++又找不到命令
    04-15
    02
    使用cloudflare-r2搭建webdav
    04-08
    03
    LLM聚合平台客户端对比
    03-29
    更多文章>
    Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
    冀ICP备2022004632号-1
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式