cncf技术栈自由实践

gRPC

grpc 是 Google 在 2015 年 2 月底时发布的一款开源 RPC 框架,其源码是由 C 语言编写的。
按照 Google 的说法,grpc 是:

A high-performance, open-source universal RPC framework

gRPC 官方文档中文版
RPC框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。
gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。

安装(ubuntu)
#安装pkg-config
sudo apt-get install pkg-config
#安装依赖文件
sudo apt-get install autoconf automake libtool make g++ unzip
sudo apt-get install libgflags-dev libgtest-dev
sudo apt-get install clang libc++-dev
#下载gRPC源码
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init  #更新第三方源码
#安装protobuf
#此时应保证在grpc文件夹下
cd third_party/protobuf/
git submodule update --init --recursive #确保克隆子模块,更新第三方源码
sudo ./autogen.sh   #生成配置脚本
sudo ./configure    #生成Makefile文件,为下一步的编译做准备,可以加上安装路径:--prefix=path ,默认路径为/usr/local/
sudo make           #从Makefile读取指令,然后编译
sudo make check     #可能会报错,但是不影响,对于安装流程没有实质性用处,可以跳过该步
sudo make install 
sudo ldconfig       #更新共享库缓存
which protoc        #查看软件的安装位置
protoc --version    #检查是否安装成功
#安装gRPC
cd ../..  #到达grpc根文件夹下
make   #编译
HelloWorld

gRPC的使用通常包括

  1. 通过protobuf来定义接口和数据类型
  2. 编写gRPC server端代码
  3. 编写gRPC client端代码

使用helloworld示例,使用protoc命令生成相关文件。

protoc --go_out=plugins=grpc:. helloworld.proto

这里plugins选项选择grpc,生成相应的服务接口。
Server端:

package main
 
import (
    "log"
    "net"
 
    pb "your_path_to_gen_pb_dir/helloworld"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)
 
const (
    port = ":50051"
)
 
// server is used to implement helloworld.GreeterServer.
type server struct{}
 
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
 
func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    s.Serve(lis)
}

客户端:

package main
 
import (
    "log"
    "os"
 
    pb "your_path_to_gen_pb_dir/helloworld"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)
 
const (
    address     = "localhost:50051"
    defaultName = "world"
)
 
func main() {
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    
    c := pb.NewGreeterClient(conn)
 
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

运行服务端和客户端,如果命令行中显示:

Greeting:hello world

则运行成功。

你可能感兴趣的:(服务计算)