drpc
基于grpc-go封装的rpc请求库
Usage
创建服务proto: demo.proto
syntax = "proto3";
package proto;
message Request {
int64 uid = 1;
}
message Response {
int64 id = 1;
string username = 2;
}
service Demo {
rpc UserInfo(Request) returns (Response);
}
编译proto
protoc --go_out=plugins=grpc:./ ./demo.proto
创建Server端 server.go
import (
"github.com/dysodeng/drpc"
"github.com/dysodeng/drpc/register"
demo "github.com/dysodeng/drpc/rpc/proto"
"github.com/dysodeng/drpc/rpc/service"
"github.com/rcrowley/go-metrics"
"log"
"net"
"os"
"os/signal"
)
func main() {
etcdV3Register := ®ister.EtcdV3Register{
ServiceAddress: "127.0.0.1:9000",
EtcdServers: []string{"localhost:2379"},
BasePath: "demo/rpc",
Lease: 5,
Metrics: metrics.NewMeter(),
}
rpcServer := drpc.NewServer(etcdV3Register)
defer func() {
if err := recover(); err != nil {
_ = rpcServer.Stop()
}
}()
_ = rpcServer.Register("DemoService", &service.DemoService{}, demo.RegisterDemoServer, "")
go func() {
rpcServer.Serve(ip + ":9000")
}()
// 等待中断信号以优雅地关闭服务器
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
<-quit
log.Println("shutdown rpc server ...")
_ = rpcServer.Stop()
}
创建客户端 client.go
import (
"context"
"github.com/dysodeng/drpc/discovery"
demo "github.com/dysodeng/drpc/rpc/proto"
"github.com/dysodeng/drpc/rpc/service"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"io"
"log"
"time"
)
func main() {
d, err := discovery.NewEtcdV3Discovery([]string{"127.0.0.1:2379"}, "demo/rpc")
if err != nil {
log.Fatalln(err)
}
defer d.Close()
demoCtx, demoCancel := context.WithDeadline(context.Background(), time.Now().Add(3 * time.Second))
defer demoCancel()
demoConn := d.Conn("DemoService")
demoService := demo.NewDemoClient(demoConn)
demoRes, err := demoService.UserInfo(demoCtx, &demo.Request{Uid: 1})
if err != nil {
//获取错误状态
state, ok := status.FromError(err)
if ok {
//判断是否为调用超时
if state.Code() == codes.DeadlineExceeded {
log.Fatalln("UserInfo timeout!")
}
log.Println(err)
}
} else {
log.Printf("%+v", demoRes)
log.Println(demoRes.Username)
}
}
启动服务端
go run server.go
客户端访问
go run client.go
Installation
go get github.com/dysodeng/drpc