Kratos微服务需完成服务端注册、客户端解析、传输层适配三步闭环。服务端须通过kratos.Registrar向Consul注册含Endpoints的元数据;客户端需注入同一注册中心并配置resolver;传输层按协议筛选、健康检查后由selector选节点连接。

要在Kratos微服务中让客户端准确发现并调用服务端点,必须完成服务端注册、客户端解析、传输层适配三步闭环,缺一不可。
服务端注册:将端点写入注册中心
在服务启动时,Kratos通过kratos.Registrar(registry)将服务元数据(含IP、端口、协议类型、健康状态)提交至Consul等注册中心。
注册内容由registry.ServiceInstance结构体封装,其中Endpoints字段必须显式声明可用端点,例如["http://10.0.1.5:8000", "grpc://10.0.1.5:9000"]
若未在newApp函数中传入registry实例,或ServiceInstance.Endpoints为空,则服务在Consul UI中显示为“无健康节点”,【客户端将完全无法感知该服务】。
运行kratos run后,访问http://localhost:8500/ui/dc1/services/blog,确认服务条目下有非空的“Address”与“Tags”字段。
客户端解析:从注册中心拉取并缓存端点列表
客户端初始化时需注入同一注册中心实例,并配置服务发现策略:
方法一:使用resolver包直接解析
resolver.Register(resolver.NewBuilder("consul", consulRegistry))
方法二:通过client选项自动绑定
在client.NewClient(client.WithResolver(resolver))中传入已注册的resolver,Kratos会自动监听服务变更事件。
首次解析失败时,客户端不会阻塞启动,但后续所有RPC调用将返回rpc error: code = Unavailable desc = service blog not found。
传输层适配:按协议匹配端点并建立连接
第一步:客户端根据目标服务名(如"blog")查询注册中心,获取Endpoints切片。
第二步:遍历端点,提取协议前缀(http://或grpc://),丢弃不匹配当前传输协议的地址。
第三步:对剩余地址执行健康检查(如HTTP HEAD探测或gRPC Check方法),剔除不可达节点。
第四步:将存活地址交由selector模块(默认P2C算法)选择一个节点发起连接。
若注册中心返回的端点协议与客户端初始化时指定的transport不一致(如gRPC客户端收到HTTP端点),【连接将立即失败且不重试其他地址】。
这一步完成后,客户端即可通过blogClient.ListServices(ctx, req)发起真实调用。


















