Skip to content
鼓励作者:欢迎打赏犒劳

多服务注册

背景:如果有多个服务需要注册,怎么办?

方案一:启动多个 Server 实例

每个业务服务使用独立的 Kitex Server,并监听不同的端口。

示例:同时提供 EchoServiceHelloService

假设你有两个 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 注册(取决于版本和生成代码结构),部分旧版本可能不支持或需手动处理路由。

✅ 优点:

  • 节省端口
  • 部署简单,适合小项目

❌ 缺点:

  • 所有服务强耦合在一个进程中
  • 无法独立扩缩容
  • 一个服务出错可能影响其他服务
  • 不符合微服务设计理念

如有转载或 CV 的请标注本站原文地址