_ _ _______ _____ _____ _____ _____
| \ | | /\|__ __/ ____| | __ \| __ \ / ____|
| \| | / \ | | | (___ | |__) | |__) | |
| . ` | / /\ \ | | \___ \ | _ /| ___/| |
| |\ |/ ____ \| | ____) | | | \ \| | | |____
|_| \_/_/ \_\_| |_____/ |_| \_\_| \_____|
NATS收发消息需要手动定义subject,request,reply,handler等繁琐且易出错的代码。gRPC需要用服务发现到endpoint才能发送请求。NATRPC的目的就是要像gRPC一样定义接口,像NATS一样不关心具体网络位置,只需要监听和发送就能完成RPC调用。
- 使用简单,不需要服务发现
- 使用gRPC接口定义方式,接口定义清晰,学习成本低
- 代码生成器一键生成
- 支持空间隔离
- 支持定向发送也支持负载均衡(nats的同组内随机)
- 支持Header和返回Error
go install github.com/golang/protobuf/protoc-gen-go@v1.5.2
go install github.com/byebyebruce/natsrpc/cmd/protoc-gen-natsrpc@latest
- 启动nats-server(没有部署好的nats-server可以
go run example/cmd/simple_natsserver/main.go
)
- 创建工程
go mod init natsrpc_test
- 引用包
go get github.com/byebyebruce/natsrpc
- 定义服务接口
syntax = "proto3";
package natsrpc_test;
option go_package = "github.com/byebyebruce/natsrpc/example/natsrpc_test;natsrpc_test";
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
service Greeter {
rpc Hello (HelloRequest) returns (HelloReply) {}
}
- 生成客户端和服务端代码
protoc --proto_path=. --go_out=paths=source_relative:. --natsrpc_out=paths=source_relative:. *.proto
- 实现接口
type Greeter interface {
// Hello
Hello(ctx context.Context, req *natsrpc_test.HelloRequest) (*natsrpc_test.HelloReply, error)
}
- main.go 启动server和client
-
广播
go run example/bench/pub/main.go -url=nats://127.0.0.1:4222
-
请求
go run example/bench/req/main.go -url=nats://127.0.0.1:4222
- service 定义文件改成gRPC标准
- 支持返回错误
- 支持Header
- 生成Client接口
- 支持中间件
- 支持goroutine池