項(xiàng)目代碼
https://github.com/hao1990/test_grpc
代碼基本是來自官方的演示代碼
開始吧 繼續(xù)上一篇的 "hello.proto"
Golang-grpc 加 gateway(一)(protoc ,gateway,swagger)
下面代碼黎烈, 和github中有略微不同面哥,這里只留下一些必要的代碼,配置相關(guān)的都暫時(shí)去掉
啟動(dòng) grpc service
在hello.proto 中定義了 HelloService
// Hello服務(wù)
service HelloService {
// 接口SayHello
rpc SayHello (HelloRequest) returns (HelloReply){
option (google.api.http) = {
post:"/v1/examples/sayhello"
body:"*"
};
}
}
需要在go中實(shí)現(xiàn)這個(gè)服務(wù)和服務(wù)中的方法
實(shí)現(xiàn)定義的服務(wù)
代碼 service/service.go
定義 一個(gè)HelloService 都結(jié)構(gòu)體
type HelloService struct {
}
// SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloReply, error)
func (s *HelloService) SayHello(ctx context.Context, in *hello.HelloRequest) (*hello.HelloReply, error) {
log.Printf("Received: %v", in.Name)
var messge string = fmt.Sprintf("Hello , %v ; your age is %d", in.Name, in.Age)
return &hello.HelloReply{Message: messge}, nil
}
啟動(dòng)服務(wù) main方法
func main() {
lis, err := net.Listen("tcp", "127.0.0.1:50123")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcService := grpc.NewServer()
pb.RegisterHelloServiceServer(grpcService, &HelloService{})
if err := grpcService.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
運(yùn)行
go run service/service.go
調(diào)用服務(wù)
代碼 client/client.go
必要的代碼
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial("127.0.0.1:50123", grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)
// Contact the server and print out its response.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "haohao_client", Age: 20})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
測(cè)試下尘奏,另啟一個(gè)終端
go run client/client.go
可以看到 service 的終端輸出
Received: haohao_client
client的終端輸出了
Hello , haohao_client ; your age is 20
gateway
其實(shí)gateway的代碼也很少的
看官方github中第6步就幾行代碼“6.Write an entrypoint”
https://github.com/grpc-ecosystem/grpc-gateway
代碼 /gateway/main.go
必要的代碼就是 newGateway()方法
func newGateway(ctx context.Context, opts ...runtime.ServeMuxOption) (http.Handler, error) {
mux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{OrigName: true, EmitDefaults: true}))
dialOpts := []grpc.DialOption{grpc.WithInsecure()}
//注冊(cè) hello service
err := gw.RegisterHelloServiceHandlerFromEndpoint(ctx, mux, *endpoint, dialOpts)
if err != nil {
return nil, err
}
return mux, nil
}
以后添加服務(wù)后,只需要在這里注冊(cè)新的服務(wù)即可
主要“gw.RegisterHelloServiceHandlerFromEndpoint”這里沛膳,這方法是在自動(dòng)生成的代碼 hello.pb.gw.go中的稍坯。
當(dāng)添加了新服務(wù)時(shí)只要在下面繼續(xù) Register。如 gw.Register*****HandlerFromEndpoint
可以在 hello.pb.gw.go 中看到 這個(gè)方法:
func RegisterHelloServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
....
}
其他代碼時(shí)運(yùn)行 swagger的
運(yùn)行一下看看
cd進(jìn)入 gateway目錄
然后
go run main.go
在瀏覽器打開
http://127.0.0.1:8123/swagger
看到
點(diǎn)開接口輸入內(nèi)容測(cè)試下
好了
結(jié)束
入門測(cè)試沒問題了