本次学习目的
通过protobuf构建grpc服务端,并打包函数给各个语言的客户端
安装
安装protobuf编译器
[ ~ ]
libprotoc 3.17.3
安装GO protobuf插件
[ ~ ]
[ ~ ]
[ ~ ]
安装Python protobuf
[ ~ ]
[ ~ ]
[ ~ ]
编写.proto文件
syntax = "proto3" ;
package hello;
option go_package = "./proto" ;
service Hello {
rpc SayHello ( HelloReq) returns ( HelloRes) { }
rpc SayI ( SayIReq) returns ( SayIRes) { }
}
message HelloReq {
string Name = 1 ;
}
message HelloRes {
string Message = 1 ;
}
message SayIReq {
string Name = 1 ;
}
message SayIRes {
string Message = 1 ;
}
转化pb文件,并同步给客户端
经过以下操作将会得到文件(这些文件服务端与客户端都将用到) python: hello_pb2.py, hello_pb2_grpc.py go: hello.pb2.go
GO
[ ~ ]
Python
[ ~ ]
实现Go服务端
package controller
import "golang.org/x/net/context"
import "grpc-demo/proto"
type HelloController struct {
}
func ( c HelloController) SayHello ( ctx context. Context, request * proto. HelloReq) ( * proto. HelloRes, error ) {
response := proto. HelloRes{ }
response. Message = "你好啊 " + request. Name
return & response, nil
}
func ( c HelloController) SayI ( ctx context. Context, request * proto. SayIReq) ( * proto. SayIRes, error ) {
response := proto. SayIRes{ }
response. Message = "大家好,我是 " + request. Name
return & response, nil
}
package main
import (
"google.golang.org/grpc"
"grpc-demo/controller"
"grpc-demo/proto"
"log"
"net"
)
func main ( ) {
const addr = "0.0.0.0:8000"
listen, err := net. Listen ( "tcp" , addr)
if err != nil {
log. Panicln ( err)
}
server := grpc. NewServer ( )
proto. RegisterHelloServer ( server, & controller. HelloController{ } )
log. Println ( "listen on " , addr)
if err := server. Serve ( listen) ; err != nil {
log. Panicln ( err)
}
}
实现客户端
GO
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"grpc-demo/proto"
"log"
"time"
)
func main ( ) {
t1 := time. Now ( )
const addr = "0.0.0.0:8000"
if conn, err := grpc. Dial ( addr, grpc. WithInsecure ( ) ) ; err != nil {
log. Panicln ( err)
} else {
defer conn. Close ( )
client := proto. NewHelloClient ( conn)
ctx := context. Background ( )
args := proto. HelloReq{
Name: "lijiacai" ,
}
result, err := client. SayHello ( ctx, & args)
if err != nil {
log. Println ( err)
}
fmt. Println ( result)
fmt. Println ( time. Now ( ) . Sub ( t1) . Seconds ( ) )
}
}
Python
import grpc
import proto. hello_pb2 as hello
import proto. hello_pb2_grpc as hello_grpc
def run ( ) :
addr = "localhost:8000"
conn = grpc. insecure_channel( addr, options= ( ( 'grpc.enable_http_proxy' , 0 ) , ) )
stub = hello_grpc. HelloStub( conn)
response = stub. SayHello( hello. HelloReq( Name= "david" ) )
print ( response. Message)
conn. close( )
if __name__ == '__main__' :
run( )
Grpc接口文档
环境安装
[ ~ ]
[ ~ ]
[ ~ ]
[ ~ ]
[ ~ ]