9、gRPC
之前原蟾蜍时安装过,不需安装
快速开启 grpc 服务
新建目录testGrpc。以及testGrpc/服务和测试grpc/客户端
testGrpc下新建你好,普罗托
语法=' proto3
包tempPackageName
选项go _ package=' gins start/testGrpc/service/hello package ';//生成在服务文件夹下,包名为helloPackage
//问候语服务定义。
服务迎宾员{
//发送问候
rpc SayHello (HelloRequest)返回(HelloReply) {}
}
//包含用户名的请求消息。
消息HelloRequest {
字符串名称=1;
}
//包含问候语的响应消息
消息HelloReply {
字符串消息=1;
}
//生成普通结构文件
//protocol-go _ out=client-go _ opt=path=source _ relative grpc。样机
//生成grpc文件
//协议-go-grpc _ out=服务-go-grpc _ opt=路径=source _ relative grpc。proto/若是。表示当前目录
//- go-grpc_out=service //定义输出路径
//-go-grpc _ opt=path=source _ relative//定义输入路径
//grpc.proto /定义需要编译的文件
//两种文件一起生成
//协议-go _ out=.-go _ opt=path=source _ relative \
//- go-grpc_out=.-go-grpc _ opt=path=source _ relative \
//grpc.proto
执行命令在当前文件夹生成文件
协议-外出=.-go _ opt=path=source _ relative \
- go-grpc_out=.-go-grpc _ opt=path=source _ relative \
grpc.proto
在服务下新建main.go
包装主体
导入(
上下文
google.golang.org/grpc
日志
"净"
Pb项目/testGrpc '
)
//在hello_grpc.pb.go里面找到迎宾服务器接口
//键入迎宾服务器接口{
////发送问候
//SayHello(上下文。上下文,*HelloRequest) (*HelloReply,错误)
//mustemembedunimplectdreeterserver()
//}
//根据格式,实现接口
//服务器用于实现你好。迎宾服务器.
类型服务器结构{
铅。未实现的问候服务器
}
//说Hello实现你好.迎宾服务器
func (s *server) SayHello(ctx上下文。上下文,单位为*pb .HelloRequest) (*pb .HelloReply,错误){ 0
//日志Printf('接收到: %v ',in .GetName())
返回铅.helloreplay {
消息:"你好"。GetName(),
},零
}
func main(){ 0
//监听传输控制协议的50051 端口
lis,err :=净值。监听(“tcp”,“localhost:50051”)
如果出错!=零
日志。宿命论('未能列出: %v ',错误)//监听发生错误就打印出来,随后退出
}
//初始化服务
s :=grpc .新闻服务器()
//注册服务
pb.RegisterGreeterServer(s, server{})
log.Printf("server listening at %v", lis.Addr()) // 一些无关紧要的打印信息
// 开启服务
err = s.Serve(lis)
if err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
启动服务端
go run service/main.go
在 client 下新建main.go
package main import ( "context" "google.golang.org/grpc" "log" pb "project/testGrpc" "time" ) func main() { // 开始请求服务端 conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } // 请求结束后就自动关闭连接 defer conn.Close() // 初始化客户端连接 c := pb.NewGreeterClient(conn) // Contact the server and print out its response. //name := defaultName //if len(os.Args) 1 { // name = os.Args[1] //} // 创建一个子节点的context,1秒后自动超时 ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() // 发送请求体,返回内容 r, err := c.SayHello(ctx, pb.HelloRequest{Name: "好家伙"}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.GetMessage()) }
客户端开始连接测试
go run client/main.go
GRPC Gateway 实现
在主目录新建 hello.yaml
type: google.api.Service config_version: 3 http: rules: - selector: tempPackageName.Greeter.SayHello get: /haha/{name}
创建 .bat 快捷键 (最后一行是生成gateway)
protoc --go_out=. --go_opt=paths=source_relative hello.proto protoc --go-grpc_out=. --go-grpc_opt=paths=source_relative hello.proto protoc --grpc-gateway_out=. --grpc-gateway_opt=paths=source_relative,grpc_api_configuration=hello.yaml hello.proto
调用生成
./gen.bat
在 service/main.go 里面
package main import ( "context" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "google.golang.org/grpc" "log" "net" "net/http" pb "project/testGrpc" ) type server struct { pb.UnimplementedGreeterServer } func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return pb.HelloReply{ Message: "Hello "+ in.GetName(), }, nil } func main() { // 新增 grpc gateway go grpcGateWay() // 监听 tcp 的 8088 端口 lis, err := net.Listen("tcp", "localhost:50051") if err != nil { log.Fatalf("failed to listen: %v", err) // 监听发生错误就打印出来,随后退出 } // 初始化服务 s := grpc.NewServer() // 注册服务 pb.RegisterGreeterServer(s, server{}) log.Printf("server listening at %v", lis.Addr()) // 一些无关紧要的打印信息 // 开启服务 err = s.Serve(lis) if err != nil { log.Fatalf("failed to serve: %v", err) } } func grpcGateWay() { // 生成没有具体内容的上下文 c := context.Background() // 给它新增退出功能 c, cancel := context.WithCancel(c) defer cancel() mux := runtime.NewServeMux() // 注册 grpc 服务 err := pb.RegisterGreeterHandlerFromEndpoint( c, mux, ":50051", []grpc.DialOption{grpc.WithInsecure()}, ) if err != nil { log.Fatalf("can not start grpc gateway:%v",err) } // 监听端口中的 HTTP 请求,监听到就按照 .yaml 的内容进行分发 err = http.ListenAndServe(":8080",mux) if err != nil { log.Fatalf("can not start grpc gateway:%v",err) } }
起服务后,浏览器访问
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/134426.html