Golang gRPC 实践
Posted 跳动的代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang gRPC 实践相关的知识,希望对你有一定的参考价值。
-
低延时、高可用的分布式系统 -
使用ProtoBuf,独立于语言的协议 -
负载均衡,日志系统,监控系统等
-
体积小,效率高 -
使用简单,兼容性好,维护简单 -
加密性好 -
跨平台
go get -u google.golang.org/grpc
wget https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz
tar -xzvf protobuf-2.6.1.tar.gz
cd protobuf-2.6.1
./configure --prefix=/usr/local/protobuf
make
make install
vim /etc/profile
export PATH=$PATH:/usr/local/protobuf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
go get github.com/golang/protobuf/protoc-gen-go cd github.com/golang/protobuf/protoc-gen-go go build go install
go get github.com/golang/protobuf/proto
cd github.com/golang/protobuf/proto
go build
go install
syntax = "proto2";
This file relies on plugins to generate service code.
option cc_generic_services = true;
option java_generic_services = true;
option py_generic_services = true;
package gg_rpc;
option go_package = "pb_models/gg_rpc";
message RpcRequest {
required string name = 1;
}
message RpcReply {
required string message = 1;
}
service Greeter {
rpc RpcCall(RpcRequest) returns (RpcReply) ;
}
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
pb "pb_models/gg_rpc"
"log"
"net"
"github.com/golang/protobuf/proto"
)
const(
Port = ":10010"
)
type server struct {}
func (s *server) RpcCall(Ctx context.Context, In *pb.RpcRequest) (*pb.RpcReply, error) {
log.Printf("Received : %v", In.GetName())
Msg := fmt.Sprintf("Hello : %v " , In.GetName())
return &pb.RpcReply{Message: proto.String(Msg)}, nil
}
func main() {
Socket, Err := net.Listen("tcp", Port)
if Err != nil {
log.Fatalf("failed to listen : %v .", Err)
}
Rpc := grpc.NewServer()
pb.RegisterGreeterServer(Rpc, &server{})
if Err := Rpc.Serve(Socket); Err != nil {
log.Fatalf("failed to service : %v .", Err)
}
}
package main
import (
"context"
"google.golang.org/grpc"
pb "pb_models/gg_rpc"
"log"
"fmt"
"os"
"github.com/golang/protobuf/proto"
"time"
)
const (
Address = "localhost:10010"
DefaultName = "Carter"
)
func main() {
Conn, Err := grpc.Dial(Address, grpc.WithInsecure())
if Err != nil {
log.Fatalf("did not connect : %v .", Err)
}
defer Conn.Close()
Client := pb.NewGreeterClient(Conn)
fmt.Println("grpc client start.")
Name := DefaultName
if len(os.Args) > 1 {
Name = os.Args[1]
}
Ctx, Cancel := context.WithTimeout(context.Background(), time.Second)
defer Cancel()
RpcResult, RpcError := Client.RpcCall(Ctx, &pb.RpcRequest{Name : proto.String(Name)})
if RpcError != nil {
log.Fatalf("could not greet %v .", RpcError)
}
log.Printf("Greeting: %v .", RpcResult.GetMessage())
}
protoc --go_out=plugins=grpc:. gg_rpc.proto
go build rpc_server.go
go build rpc_client.go
以上是关于Golang gRPC 实践的主要内容,如果未能解决你的问题,请参考以下文章
gRPC最佳入门教程,Golang/Python/PHP多语言讲解