当前位置: 首页 > news >正文

在go-kratos中使用服务注册和发现

为什么有这篇文章?

虽然go-kratos提供了非常方便的对服务注册和发现配置的封装。我们能很轻松地把我们选定组件(consul,etcd,dicovery等等)注入到初始化地流程中。
但由于go-kratos框架强依赖Google wire进行依赖注入(DI),而官方教程并没有完整展示生产级的注册服务实例和服务发现的方法,所以我整理出了这篇文章。

本文以etcd为例。
本文的完整代码可以在这里找到,示例代码。

项目目录

svc-b├── api│   └── helloworld│       └── v1│           ├── error_reason.pb.go│           ├── error_reason.proto│           ├── greeter_grpc.pb.go│           ├── greeter_http.pb.go│           ├── greeter.pb.go│           └── greeter.proto├── cmd│   └── svc-b│       ├── main.go│       ├── wire_gen.go│       └── wire.go├── configs│   └── config.yaml├── Dockerfile├── go.mod├── go.sum├── internal│   ├── biz│   │   ├── biz.go│   │   ├── greeter.go│   │   └── README.md│   ├── conf│   │   ├── conf.pb.go│   │   └── conf.proto│   ├── data│   │   ├── data.go│   │   ├── greeter.go│   │   └── README.md│   ├── server│   │   ├── grpc.go│   │   ├── http.go│   │   ├── registry.go│   │   └── server.go│   └── service│       ├── greeter.go│       ├── README.md│       └── service.go├── LICENSE├── Makefile├── openapi.yaml├── README.md└── third_party

步骤

更改config.yaml

registry:etcd:endpoints:- "127.0.0.1:2379"

更改internal/conf/conf.proto

在 Kratos 中,Bootstrap(引导程序)并不是一个具有复杂逻辑的运行组件,而是整个服务配置文件的“根节点”或“入口字典”。
go-kratos使用protobuf保证了Bootstrap的类型安全。

新增字段

message Bootstrap {Server server = 1;Data data = 2;Registry registry = 3;
}message Registry {message Etcd {repeated string endpoints = 1;}Etcd etcd = 1;
}

接着执行make config

新增internal/server/registry.go

package serverimport ("svc-b/internal/conf" // 替换为你的真实项目路径"github.com/go-kratos/kratos/contrib/registry/etcd/v2""github.com/go-kratos/kratos/v2/registry"clientv3 "go.etcd.io/etcd/client/v3"
)// NewEtcdClient 创建 etcd 客户端
func NewEtcdClient(c *conf.Registry) *clientv3.Client {client, err := clientv3.New(clientv3.Config{Endpoints: c.Etcd.Endpoints,})if err != nil {panic(err) // 启动时连不上 etcd 直接 panic 是合理的设计}return client
}// NewRegistrar 创建 Kratos 服务注册器
func NewRegistrar(client *clientv3.Client) registry.Registrar {return etcd.New(client)
}// NewDiscovery 创建 Kratos 服务发现器 (如果你同时需要调用其他服务)
func NewDiscovery(client *clientv3.Client) registry.Discovery {return etcd.New(client)
}

注册到internal/serverProviderSet

var ProviderSet = wire.NewSet(NewGRPCServer, NewHTTPServer, NewEtcdClient, NewRegistrar, NewDiscovery)

修改cmd/服务名/wire.go

func wireApp(*conf.Server, *conf.Data, *conf.Registry, log.Logger) (*kratos.App, func(), error) { // <-- 新增 *conf.Registrypanic(wire.Build(server.ProviderSet, data.ProviderSet, biz.ProviderSet, service.ProviderSet, newApp))
}

修改cmd/服务名/main.go中的newApp

func newApp(logger log.Logger, gs *grpc.Server, hs *http.Server, rr registry.Registrar) *kratos.App {  // <-- 修改函数签名return kratos.New(kratos.ID(id),kratos.Name(Name),kratos.Version(Version),kratos.Metadata(map[string]string{}),kratos.Logger(logger),kratos.Server(gs,hs,),kratos.Registrar(rr), // <-- 把Registry放进来)
}

应用更改

main.go:

    app, cleanup, err := wireApp(bc.Server, bc.Data, bc.Registry, logger)if err != nil {panic(err)}defer cleanup()

运行

make generate

结尾

这样子,你就可以在服务中使用etcd了。
完整代码在这里。

http://www.jsqmd.com/news/785259/

相关文章:

  • 我打开Prime Video是为了看剧,它却先让我刷一会儿
  • 那个被裁掉的35岁程序员,后来成了AI训练师
  • 从零搭建GitHub Pages静态博客:Hugo实战与自动化部署指南
  • 手把手教你配置SSH密钥:从本地生成到GitHub、服务器免密登录完整流程
  • AI公平性中的蝴蝶效应:微小偏差如何引发系统性歧视
  • ESP芯片烧录神器esptool:5分钟掌握固件刷写终极指南
  • go语言 mysql DB 使用方法
  • 零基础自建知识图谱网站——数据编辑页面
  • R语言线性回归实战:从lm函数到模型诊断与业务解读
  • Python 开发者如何通过 OpenAI 兼容协议快速调用多模型
  • OpenClaw会话审计插件:为AI代理打造透明化操作日志与安全监控
  • 2026年杭州美发培训机构选型:欧曼谛美发学校好不好深度解析 - 产业观察网
  • XAI评估新框架:从信息质量到社会价值的全面度量
  • TMS320DM6467引导模式详解与配置指南
  • STM32 SysTick定时器保姆级教程:从9分频到72M主频,彻底搞懂delay_us()底层原理
  • 祝睿融
  • 钢套铜套核心技术突破:中浮动力领航精密传动部件行业新标杆 - 品牌策略师
  • 多语言开发依赖加速:智能代理multicodex-proxy原理与部署指南
  • AI工具搭建自动化视频生成自动创建工单
  • 英语阅读_post-exam economy
  • 构建容灾方案时如何利用Taotoken的多模型与路由能力
  • 北京上海智能客服系统选型:传统客服与AI智能客服能力差异 - 品牌2025
  • TiDB 全面解析:从核心架构到安装部署与生产实践
  • Shopee大模型面试岗,我慌了!!
  • 开源游戏汉化实战:逆向工程与协作流程全解析
  • RAMP计划:云端EDA与零信任架构重塑芯片供应链安全
  • 2026年4月市面上小区停车场系统源头厂家推荐,自动伸缩门/百叶折叠门/阻车路障机/防撞路障机,停车场系统公司推荐 - 品牌推荐师
  • 2026年降AI工具改写自然度横评:五款主流工具改写后可读性完整对比测试报告
  • 医疗电子中的算法-硬件协同设计与数字孪生应用
  • CANN/elec-ops-inspection UniqueV3算子