
多服务注册
背景:如果有多个服务需要注册,怎么办?
方案一:启动多个 Server 实例
每个业务服务使用独立的 Kitex Server,并监听不同的端口。
示例:同时提供 EchoService
和 HelloService
假设你有两个 Thrift 定义:
thrift
// echo.thrift
service EchoService {
string echo(1: string msg)
}
thrift
// hello.thrift
service HelloService {
string hello(1: string name)
}
生成代码后,在同一个 Go 程序中启动两个 Server:
go
// main.go
package main
import (
"log"
"net"
"your_project/echo"
"your_project/hello"
"github.com/cloudwego/kitex/server"
)
func main() {
// === 启动 EchoService 监听 :6666 ===
addr1, _ := net.ResolveTCPAddr("tcp", ":6666")
svr1 := echo.NewServer(
new(EchoServiceImpl),
server.WithServiceAddr(addr1),
)
// === 启动 HelloService 监听 :7777 ===
addr2, _ := net.ResolveTCPAddr("tcp", ":7777")
svr2 := hello.NewServer(
new(HelloServiceImpl),
server.WithServiceAddr(addr2),
)
// 并发启动两个服务
go func() {
if err := svr1.Run(); err != nil {
log.Println("EchoService stopped with error:", err)
}
}()
go func() {
if err := svr2.Run(); err != nil {
log.Println("HelloService stopped with error:", err)
}
}()
// 阻塞主协程,防止退出
select {}
}
✅ 优点:
- 各服务完全解耦
- 可独立配置中间件、日志、限流、超时等
- 易于后续拆分为独立微服务
- 客户端可单独调用某个服务(比如只连
:6666
)
⚠️ 注意事项:
- 每个服务占用一个端口,注意防火墙和端口冲突
- 进程内资源(内存、CPU)共享,需评估负载
方案二:在同一个 Thrift 文件中定义多个 service(共享端口)
你可以把多个逻辑服务写进同一个 .thrift
文件中,它们会共用一个 Kitex Server 和端口。
thrift
// api.thrift
namespace go api
service EchoService {
string echo(1: string msg)
}
service HelloService {
string hello(1: string name)
}
然后生成代码:
bash
kitex --service MyApi api.thrift
Kitex 会生成一个 Server,可以注册多个 handler:
go
// 实现两个服务
type EchoImpl struct{}
func (e *EchoImpl) Echo(ctx context.Context, msg string) (string, error) {
return "echo: " + msg, nil
}
type HelloImpl struct{}
func (h *HelloImpl) Hello(ctx context.Context, name string) (string, error) {
return "hello, " + name, nil
}
// 主函数中注册多个服务
func main() {
addr, _ := net.ResolveTCPAddr("tcp", ":8888")
svr := api.NewServer(
server.WithServiceAddr(addr),
)
// 注册第一个服务
svr.RegisterService(new(EchoImpl))
// 注册第二个服务
svr.RegisterService(new(HelloImpl))
if err := svr.Run(); err != nil {
log.Println("server failed:", err)
}
}
⚠️ 注意:这种方式需要 Kitex 支持多 service 注册(取决于版本和生成代码结构),部分旧版本可能不支持或需手动处理路由。
✅ 优点:
- 节省端口
- 部署简单,适合小项目
❌ 缺点:
- 所有服务强耦合在一个进程中
- 无法独立扩缩容
- 一个服务出错可能影响其他服务
- 不符合微服务设计理念