# server **Repository Path**: lsxh/server ## Basic Information - **Project Name**: server - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-12 - **Last Updated**: 2025-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于kitex封装一个服务器service间rpc调用 ## 服务端启动 - 注册方法 ```go // 将方法注册到UserService服务 sf.RegisterMethod("UserService", "create", Create) sf.RegisterMethod("UserService", "get", Get) sf.RegisterMethod("UserService", "send_mail", SendMail) // 启动UserService服务,端口8001,并且注册到etcd usrService := sf.NewServiceServer("UserService", 8001, []string{"127.0.0.1:2379"}) usrService.Start() defer usrService.Stop() // 注册之后客户端或者其他服务就可以通过rpc调用这个服务的方法 ``` - 客户端/其他服务调用 ```go sf.InitCaller([]string{"127.0.0.1:2379"}, 1, 2) // 初始化caller,参数是etcd地址和caller数量 sf.GlobalPool().SetStrategy(sf.FirstOne) // 设置caller均衡策略不设置使用默认的 // 调用UserService服务的create方法 resp, err := sf.RemoteCall("UserService", "create", map[string]interface{}{ "name": "李四", "email": "lisi@example.com", "age": 28, }) // 异步调用,传入callback函数 sf.RemoteCallback("OrderService", "create", map[string]interface{}{ "user_id": "user_123", "amount": 199.99, "items": []string{"商品A", "商品B"}, }, func(resp *sf.Response, err error) { // callback }) // 发送消息不等待回调, 只管发送 sf.Remote("UserService", "send_main", map[string]interface(){}) ``` ### 目录说明 - sf:使用kitex封装一个通用的协议 1. generic.thrift 通用协议的内容,用来封装通用rpc调用 2. server.go 启动service注册,通用服务器处理器实现generic.thrift的Invoke接口 3. register.go 全局方法注册表,所有对外的服务接口注册到这里, RegisterMethod(service_name, method_name, handler_method) 3. caller.go 封装ServiceCaller,获取client实例,封装service调用doCall 4. pool_caller.go 管理多个ServiceCaller,处理负载均衡策略,实现动态调节数量 # 注:功能已删除,改回使用单例的servicecaller 5. remote_caller.go 统一对外接口封装 - sf.Remote : 异步向指定service发送消息 - sf.RemoteCall : 同步向指定service发送消息 - sf.RemoteCallback : 异步向指定service发送消息,通过callback处理回调 - internal:内部工具包 - example:使用示例 1. ```shell go run example/service_user/main.go # 启动UserService ``` 2. ```shell go run example/servce_order/main.go # 启动OrderService ``` 3. ```shell go run example/client/main.go # 启动客户端测试rpc调用 ```