gRPC的Go语言使用例子

gRPC刚被Google开源, gRPC是啥? 先照抄一段说明:

gRPC是一个高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。

这段抄自info: http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf

官网地址: http://www.grpc.io

冲着面向移动应用开发这点,值得一试,参考其说明文档,用Golang弄了个例子:

1. 先创建一个rpcsrv.proto文件:

syntax = "proto3";

package xcl;

enum UserStatus {
    OFFLINE = 0;
    ONLINE = 1;
 }

message UserInfo {
  int32 id = 1;
  string name = 2;
  UserStatus status = 3 ;
}

message UserID {
  int32 id = 1;
}

message funcResponse {
   string reply = 1;
}

service UserService {
  rpc Login(UserInfo) returns (funcResponse){};
  rpc logout(UserID) returns (funcResponse){};
}

2. 生成相应的rpcsrv.pb.go文件

主要的几个struct:

type UserInfo struct {
	Id     int32      `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
	Name   string     `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
	Status UserStatus `protobuf:"varint,3,opt,name=status,enum=xcl.UserStatus" json:"status,omitempty"`
}

type UserID struct {
	Id int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
}

type FuncResponse struct {
	Reply string `protobuf:"bytes,1,opt,name=reply" json:"reply,omitempty"`
}

  3. RPC服务端

//gRPC例子-服务端
//author: Xiong Chuan Liang
//date: 2015-3-8

package main

import (
	pb "xcl"

	"log"
	"net"
	"os"

	"golang.org/x/net/context"
	"google.golang.org/grpc"
)

func main() {

	log.SetOutput(os.Stdout)
	lis, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterUserServiceServer(s, &server{})

	log.Println("Server......")
	s.Serve(lis)

}

const (
	port = ":50051"
)

type server struct{}

func (s *server) Login(ctx context.Context, usr *pb.UserInfo) (*pb.FuncResponse, error) {
	log.Println("Server...... Login() UserInfo:", usr)

	usr.Id = 100
	strId := "100" //strconv.Itoa(usr.Id)

	return &pb.FuncResponse{Reply: strId}, nil

}

func (s *server) Logout(ctx context.Context, uid *pb.UserID) (*pb.FuncResponse, error) {
	log.Println("Server...... Logout() UserID:", uid)
	return &pb.FuncResponse{Reply: "Logout Successed."}, nil
}

4. 客户端:

//gRPC例子-客户端
//author: Xiong Chuan Liang
//date: 2015-3-8

package main

import (
	"log"
	"os"
	"strconv"

	pb "xcl"

	"golang.org/x/net/context"
	"google.golang.org/grpc"
)

const (
	address = "localhost:50051"
)

func main() {
	log.SetOutput(os.Stdout)

	conn, err := grpc.Dial(address)
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewUserServiceClient(conn)

	var status pb.UserStatus
	status = pb.UserStatus_ONLINE

	userInfo := &pb.UserInfo{
		//Id:     10,         //proto.Int32(10),
		Name:   "XCL-gRPC", //proto.String("XCL-gRPC"),
		Status: status,
	}

	r, err := c.Login(context.Background(), userInfo)
	if err != nil {
		log.Fatalf("登录失败!  %v", err)
	}
	log.Println("Login():", r)

	uid, err := strconv.ParseInt(r.Reply, 10, 32)
	if err != nil {
		log.Fatalf("非数字  %v", err)
	}

	userID := &pb.UserID{int32(uid)}
	out, err := c.Logout(context.Background(), userID)
	log.Println("Logout():", out)
}

运行结果:

gRPC 跑起来了,内部的东西还没去细究。不过app服务端相关的话,应当值得一试。

MAIL: [email protected]

BLOG:http://blog.csdn.net/xcl168

时间: 2024-12-18 12:52:29

gRPC的Go语言使用例子的相关文章

自学SQL语言的例子(使用MySQL实现)

SQL语言作为一种数据库管理的标准语言有着极为广泛的应用场景,菜鸟入门选用的数据库软件是轻量级的免费(这个极为重要)的MySQL,下载链接如下:http://www.mysql.com/downloads/ ,笔者的程序在MySQL可视化界面WorkBench下编写脚本文件并执行,这比在命令行模式下执行更加便捷且直观.安利一本MySQL菜鸟入门的书籍刘少杰和曾少军编著的<MySQL5.5——从零开始学>这本书(资源自寻,为避免侵权这里就不给出链接了,当然也欢迎直接买本纸质书支持作者). 例子:

Direct3D C语言的例子

几乎所有的D3D例子都是用COM和C++写的.C语言可以用D3D吗,StackOverflow上给出了答案:directx-programming-in-c. 1 hr = IDirect3D9_GetDeviceCaps(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9); 2 hr = IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm); 3 hr = I

go语言从例子开始之Example20.错误处理

Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby 以及在 C 语言中经常见到的超重的单返回值/错误值相比,Go 语言的处理方式能清楚的知道哪个函数返回了错误,并能像调用那些没有出错的函数一样调用. package main import "errors" import "fmt" 按照惯例,错误通常是最后一个返回值并且是 error 类型,一个内建的接口. func f1(arg int) (int, error) {

c语言一个例子对比php学习随记

今天开始学写一些简单的C例子,发现很多和PHP不一样的地方,做个笔记. #include <stdio.h> int main(void) { int a,b; printf("请输入整数a"); //这里是用双引号,不能用单引号,PHP类似的地方可以用单引号,这里需注意 scanf("%d",&a); //获取用户输入值存入a printf("请输入整数b"); scanf("%d",&b);//

go语言从例子开始之Example32.打点器

定时器 是当你想要在未来某一刻执行一次时使用的 - 打点器 则是当你想要在固定的时间间隔重复执行准备的.这里是一个打点器的例子,它将定时的执行,直到我们将它停止. Example: package main import "fmt" import "time" func main() { //打点器和定时器的机制有点相似: //一个通道用来发送数据. //这里我们在这个通道上使用内置的 range 来迭代值每隔500ms 发送一次的值. ticker := time

go语言从例子开始之Example39.使用函数自定义排序

有时候我们想使用和集合的自然排序不同的方法对集合进行排序.例如,我们想按照字母的长度而不是首字母顺序对字符串排序.这里是一个 Go 自定义排序的例子. Example: package main import ( "fmt" "sort" ) //为了在 Go 中使用自定义函数进行排序, //我们需要一个对应的类型. //这里我们创建一个为内置 []string 类型的别名的byLength 类型, type byLength []string //我们在类型中实现

R语言小例子---简易的数据分析和画图

目前有10名儿童(男)的年龄和身高的数据(虚构数据),感兴趣的是升高的分布及体重和年龄的关系. 年龄(岁) 体重(kg) 年龄(岁) 体重(kg) 4 95 6 116 4 97 7 120 5 106 7 121 5 108 8 126 6 114 8 125 使用函数c()以向量的形式输入儿童的年龄和身高数据.然后,使用一些内置的函数获得身高的均值和标准差,以及年龄和体重的相关度. > age <- c(4,4,5,5,6,6,7,7,8,8) > height <- c(95

gRPC最佳入门教程,Golang/Python/PHP多语言讲解

目录 一.gRPC是什么? 二.Protocol Buffers是什么? 三.需求:开发健身房服务 四.最佳实践 Golang 1. 安装protoc 2. 安装protoc-gen-go 3. 安装grpc包 4. 生成代码 5. 定义服务端 6. 定义客户端 7. 运行代码 Python 1. 安装grpc包 2. 安装protobuf 3. 安装grpc的protobuf编译工具 4. 生成代码 5. 定义服务端 6. 定义客户端 7. 运行代码 PHP 1. 安装protoc 2. 安装

使用L脚本语言实现分布式计算的例子

一种编程语言要让大家接受需要有一个从理解到使用的过程,之前介绍的L脚本语言的设计思想和语法介绍也可能不那么直观, 后续我会编写一些L脚本语言的例子给大家参考 这里我先来写一个分布式计算的例子 其实分布式计算就是将计算任务分解给不同的计算机,由多个计算机实现共同的计算任务 这里,我们需要有一个管理者计算机,多个工作者计算机 管理者将任务分配给工作者,工作者完成计算任务后交给管理者,最后再由管理者将所有计算结果汇总 下面这个例子是L脚本语言编写的工作者,它不断在一个UDP的端口上监听,如果有发过来的