
多服务注册 
背景:如果有多个服务需要注册,怎么办?
方案一:启动多个 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.thriftKitex 会生成一个 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 注册(取决于版本和生成代码结构),部分旧版本可能不支持或需手动处理路由。
✅ 优点: 
- 节省端口
- 部署简单,适合小项目
❌ 缺点: 
- 所有服务强耦合在一个进程中
- 无法独立扩缩容
- 一个服务出错可能影响其他服务
- 不符合微服务设计理念

