java 调用 go rpcx_记一次rpcx拦截器的实现+使用TLS证书启动

安装

首先,你需要安装 rpcx:go get -u -v github.com/smallnest/rpcx/...

这一步只会安装 rpcx 的基础功能。如果你想要使用 etcd 作为注册中心,你需要加上etcd这个标签。 (see build tags)go get -u -v -tags "etcd" github.com/smallnest/rpcx/...

如果你想要使用 quic ,你也需要加上quic这个标签。go get -u -v -tags "quic etcd" github.com/smallnest/rpcx/...

方便起见,我推荐你安装所有的tags,即使你现在并不需要他们:go get -u -v -tags "reuseport quic kcp zookeeper etcd consul ping" github.com/smallnest/rpcx/...

tag:quic: 支持 quic 协议

kcp: 支持 kcp 协议

zookeeper: 支持 zookeeper 注册中心

etcd: 支持 etcd 注册中心

consul: 支持 consul 注册中心

ping: 支持 网络质量负载均衡

reuseport: 支持 reuseport

简单的Service实现

实现一个 Sevice 就像写一个单纯的 Go 结构体:import "context"

type Args struct {

A int

B int

}

type Reply struct {

C int

}

type Arith int

func (t *Arith) Mul(ctx context.Context, args *Args, reply *Reply) error {

reply.C = args.A * args.B

return nil

}

注册一个简单服务s := server.NewServer()

s.RegisterName("Arith", new(Arith), "")

s.Serve("tcp", ":8972") // 可以启动quic(udp)/tcp/http服务

手写一个拦截器

其实是实现plugin的PostReadRequest方法type SignPlugin struct {

}

// 拦截器

func (signPlugin *SignPlugin) PostReadRequest(ctx context.Context, req *protocol.Message, err error) error {

//fmt.Println(req.ServiceMethod)

//fmt.Println(req.ServicePath)

// 我这是使用json传输的

p := &你的结构体

err = json.Unmarshal(req.Payload, p)

// todo 你的逻辑(数据验证,数据处理等)

decodeMap := 你处理后的数据(如果不用处理,该步骤可以省略)

req.Payload = decodeMap

return err

}

把拦截器add到启动服务中s := server.NewServer()

siginPlugin := &controller.SignPlugin{}

s.Plugins.Add(siginPlugin) // 把拦截器注册到服务中

s.RegisterName("Arith", new(Arith), "")

s.Serve("tcp", ":8972") // 可以启动quic(udp)/tcp/http服务

到此拦截器已经实现.

下面附上client代码option := client.DefaultOption

option.SerializeType = protocol.JSON // 传输数据格式

// #1

d := client.NewPeer2PeerDiscovery("tcp@127.0.0.1:8972", "")

// #2

xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d,option)

defer xclient.Close()

// #3

args := &example.Args{

A: 10,

B: 20,

}

// #4

reply := &example.Reply{}

// #5

err := xclient.Call(context.Background(), "Mul", args, reply)

if err != nil {

log.Fatalf("failed to call: %v", err)

}

log.Printf("%d * %d = %d", args.A, args.B, reply.C)

使用quic(UDP)和TLS证书注意:使用quic(UDP)时,s.Serve("tcp", "localhost:8972"). address参数必须要写完整,localhost不能省略

使用quic(UDP)时,rpcx对quic协议的支持是通过build tags实现的.默认不会编译quic相关文件.如果要使用,必须自己手动指定tagsserver+client都需要go run -tags quic main.go

使用quic(UDP)时,必须要使用TLS证书server代码// 加载tls证书,使用quic必要步骤

cert, err := tls.LoadX509KeyPair("公钥路径", "私钥路径")

if err != nil {

panic("加载证书失败:" + err.Error())

}

configs := &tls.Config{Certificates: []tls.Certificate{cert}}

s = server.NewServer(server.WithTLSConfig(configs))client代码conf := &tls.Config{

InsecureSkipVerify: true, // true=跳过tls证书验证

}

option := client.DefaultOption

option.SerializeType = protocol.JSON // 传输数据格式

option.TLSConfig = conf // 使用tls证书

d := client.NewPeer2PeerDiscovery("tcp@127.0.0.1:8972", "")

xclient := client.NewXClient("Arith", client.Failtry, client.RandomSelect, d,option)

有疑问加站长微信联系(非本文作者)

好的,下面是一个简单的示例,演示如何使用 Go 语言和 rpcx 注册一个服务并绑定租约: ```go package main import ( "context" "log" "time" "github.com/smallnest/rpcx/server" "go.etcd.io/etcd/clientv3" ) type Arith int type Args struct { A, B int } func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } func main() { // 创建 etcd 客户端 cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379"}, }) if err != nil { log.Fatal(err) } defer cli.Close() // 创建 rpcx 服务实例 s := server.NewServer() // 注册服务到 rpcx s.RegisterName("Arith", new(Arith)) // 创建租约 lease := clientv3.NewLease(cli) leaseResp, err := lease.Grant(context.Background(), 5) if err != nil { log.Fatal(err) } // 绑定租约到 rpcx 服务实例上 err = s.AttachLease(leaseResp.ID) if err != nil { log.Fatal(err) } // 启动 rpcx 服务 go s.Serve("tcp", "localhost:8972") // 每秒续约一次 for { _, err = lease.KeepAliveOnce(context.Background(), leaseResp.ID) if err != nil { log.Fatal(err) } time.Sleep(1 * time.Second) } } ``` 在这个示例中,我们创建了一个 Arith 结构体,实现了 Multiply 方法,然后将 Arith 结构体注册到 rpcx 服务实例中。接着,我们创建了一个 etcd 客户端,用于创建租约和续约。我们创建了一个 5 秒的租约,并将它绑定到 rpcx 服务实例上。最后,我们启动rpcx 服务,并在一个循环中每秒续约一次。这样,我们就完成了一个简单的 rpcx 服务注册并绑定租约的示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值