
[ad_1]
gRPC service with HTTP interface?

While Go-Zero brought developers an excellent RESTful and gRPC service development experience, more expectations were raised. to like:
- i want to write the code only once
- I want both gRPC and HTTP interfaces
It makes sense! You see what users say.
User A: A set of arguments, HTTP and gRPC together.
User B: If Go-Zero can simplify this step, I think it will become the best microservices framework ever.
So I got into a deep thought: the user is never wrong, but do we want to take that for granted?
Here comes the article.
We are very familiar with this service. Create a new directory, call it grpc-restufl
and put one sum.proto
file in
syntax = "proto3";package sum;
option go_package="./pb";message SumRequest {
int64 a = 1;
int64 b = 2;
}message SumResponse {
int64 result = 1;
}service Sum {
rpc Add(SumRequest) returns (SumResponse) {}
}
One-click generation, you know.
$ goctl rpc protoc --go_out=. --go-grpc_out=. --zrpc_out=. sum.proto
see what you get
.
├── etc
│ └── sum.yaml
├── go.mod
├── internal
│ ├── config
│ │ └── config.go
│ ├── logic
│ │ └── addlogic.go
│ ├── server
│ │ └── sumserver.go
│ └── svc
│ └── servicecontext.go
├─ pb
│ ├── sum.pb.go
│ └── sum_grpc.pb.go
├─ sum
│ └── sum.go
├── sum.go
└── sum.proto
To implement business logic, modify Add
method in internal/logic/addlogic.go
as follows.
func (l *AddLogic) Add(in *pb.SumRequest) (*pb.SumResponse, error) {
return &pb.SumResponse{
Result: in.A+in.B,
}, nil
}
You can run it, and the business logic is present (though it’s too simple for demo purpose.)
$ go mod tidy && go run sum.go
Starting rpc server at 127.0.0.1:8080...
For those who are familiar with Go-Zero, there is no highlight (new knowledge) here, let’s move on~
First, let’s update to Go-Zero v1.4.0
Edition,
$ go get -u github.com/zeromicro/go-zero@latest
Revised sum.proto
i made a new one sum-api.proto
as follows
syntax = "proto3";package sum;
option go_package="./pb";import "google/api/annotations.proto";message SumRequest {
int64 a = 1;
int64 b = 2;
}message SumResponse {
int64 result = 1;
}service Sum {
rpc Add(SumRequest) returns (SumResponse) {
option (google.api.http) = {
post: "/v1/sum"
body: "*"
};
}
}
protoc --include_imports --proto_path=. --descriptor_set_out=sum.pb sum-api.proto
Revised internal/config/config.go
Looks like this (partially)
type Config struct {
zrpc.RpcServerConf
Gateway gateway.GatewayConf
Gateway.GatewayConf }
Revised etc/sum.yaml
Is in this type
Gateway:
Name: gateway
Port: 8081
Upstreams:
- Grpc:
Endpoints:
- localhost:8080
ProtoSets:
- sum.pb
to create gateway
and use ServiceGroup
to manage gRPC server
And gateway server
The code part is as follows.
gw := gateway.MustNewServer(c.Gateway)
group := service.NewServiceGroup()
group.Add(s)
group.Add(gw)
defer group.Stop() fmt.Printf("Starting rpc server at %s... \n", c.ListenOn)
fmt.Printf("Starting gateway at %s:%d... \n", c.Gateway.Host, c.Gateway.Port)
group.Start()
let’s start the service
$ go run sum.go
Starting rpc server at 127.0.0.1:8080...
Starting gateway at 0.0.0.0:8081...
test it with curl
$ curl -i -H "Content-Type: application/json" -d '{"a":2, "b":3}' localhost:8081/v1/sum
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Traceparent: 00-ad5b7df7a834a1c05ee64999e3310811-195ba1f4f9956cc4-00
Date: Mon, 18 Jul 2022 14:33:11 GMT
Content-Length: 20{
"result": "5"
}
and see the link information in our gateway
And gRPC
Log that corresponds to what the client receives is awesome!
{"@timestamp": "2022-07-18T22:33:11.437+08:00", "caller": "serverinterceptors/statinterceptor.go:76", "content": "127.0.0.1:61635 - /sum. Sum/Add - {\"a\":2,\"b\":3}", "duration": "0.0ms", "level": "info", "span": "b3c85cd32a76f8c9", "trace":" ad5b7df7a834a1c05ee64999e3310811"}
{"@timestamp": "2022-07-18T22:33:11.438+08:00", "caller": "handler/loghandler.go:197", "content":"[HTTP] 200 - POST /v1/sum - 127.0.0.1: 61662 - curl/7.79.1", "duration": "0.7ms", "level": "info", "span": "195ba1f4f9956cc4", "trace": "ad5b7df7a834a1c05ee64999e3310811"}
You see, adding HTTP
interface for us gRPC
Is the service too easy? Isn’t it?
Also, don’t underestimate this simple gateway
Configuration will automatically load balance if it is docked gRPC
There’s service behind it, and you can even customize the middleware to control what you want.
By the way, here is the complete code for this example.
https://github.com/kevwan/grpc-restful
https://github.com/zeromicro/go-zero
feel free to use go-zero
And Star to support us!
[ad_2]
Source link
#Add #RESTful #APIs #gRPC #Services #Minutes #Kevin #Wan #August