如何使用proto文件实现rpcx
时间: 2024-04-26 17:22:57 浏览: 140
RPCX 支持使用 ProtoBuf 协议作为编码协议,可以通过定义 ProtoBuf 文件来实现 RPCX 的服务调用。
以下是一个简单的示例,演示了如何使用 ProtoBuf 文件定义服务接口和消息类型,并通过 RPCX 进行调用。
服务端代码:
```go
package main
import (
"fmt"
"github.com/smallnest/rpcx/server"
"google.golang.org/protobuf/proto"
"io/ioutil"
"log"
"net/http"
)
type HelloService struct{}
func (t *HelloService) SayHello(request []byte, reply *[]byte) error {
req := new(Request)
err := proto.Unmarshal(request, req)
if err != nil {
return err
}
res := &Response{Message: "Hello, " + req.Name + "!"}
*reply, err = proto.Marshal(res)
return err
}
func main() {
s := server.NewServer()
s.RegisterName("HelloService", new(HelloService), "")
http.Handle("/rpc", s)
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "index.html")
})
fmt.Println("starting server at :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
服务端使用 HTTP 协议进行服务调用,通过 `RegisterName` 函数注册了一个名为 `HelloService` 的服务,并将其绑定到 `http://localhost:8080/rpc` 上。
ProtoBuf 文件定义了服务接口和消息类型:
```protobuf
syntax = "proto3";
package hello;
message Request {
string name = 1;
}
message Response {
string message = 1;
}
service HelloService {
rpc SayHello (Request) returns (Response);
}
```
客户端代码:
```go
package main
import (
"fmt"
"github.com/smallnest/rpcx/client"
"google.golang.org/protobuf/proto"
"io/ioutil"
"log"
"net/http"
)
func main() {
d := client.NewHTTPDiscovery("http://localhost:8080/rpc")
xclient := client.NewXClient("HelloService", client.Failtry, client.RandomSelect, d, client.DefaultOption)
defer xclient.Close()
req := &Request{Name: "World"}
data, err := proto.Marshal(req)
if err != nil {
log.Fatalf("marshal error: %v", err)
}
res := new(Response)
err = xclient.Call(nil, "SayHello", data, res)
if err != nil {
log.Fatalf("call error: %v", err)
}
fmt.Println(res.Message)
}
```
客户端使用 HTTP 协议进行服务调用,通过 `NewHTTPDiscovery` 函数创建一个 RPCX 客户端实例。客户端调用 `Call` 方法来调用服务端的 `SayHello` 方法,并将参数和返回值转换为 ProtoBuf 格式。
在客户端代码中,需要使用 `protoc` 工具将 ProtoBuf 文件生成对应的 Go 代码,然后将生成的代码文件引入到客户端代码中。具体的使用方法可以参考 ProtoBuf 官方文档。
这个示例演示了如何使用 ProtoBuf 文件定义服务接口和消息类型,并通过 RPCX 进行调用。
阅读全文