golang grpc demo
1.grpm 安装:
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
2.proto, protoc-gen-go 安装:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
3.protoc 安装:
git clone https://github.com/protocolbuffers/protobuf.git
cd $GOPATH/src/github.com/protocolbuffers/
./autogen.sh
./configure
make -j12
make install
4.go-genproto 安装(运行时需要的依赖,下载完移动到相应的目录里面)
git https://github.com/googleapis/go-genproto.git
5.protoc 查看版本:
[root@wangjq]# protoc --version
libprotoc 3.10.
6.目录结构:
[root@wangjq demo]# tree
.
├── client
│ └── main.go
├── example
│ └── data.proto
└── server
└── main.go directories, files
7.data.proto 内容如下
syntax = "proto3"; //指定proto版本 package proto; //定义请求结构
message HelloRequest{
string name=;
} //定义响应结构
message HelloReply{
string message=;
} //定义Hello服务
service Hello{
//定义服务中的方法
rpc SayHello(HelloRequest) returns (HelloReply){}
}
8.生成 data.pb.go 文件
protoc -I . --go_out=plugins=grpc:. ./data.proto
9.服务端代码
package main import (
pb "demo/example"
"fmt"
"golang.org/x/net/context"
"google.golang.org/grpc"
"net"
) const (
//gRPC服务地址
Address = "127.0.0.1:50052"
) //定义一个helloServer并实现约定的接口
type helloService struct{} func (h helloService) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
resp := new(pb.HelloReply)
resp.Message = "hello" + in.Name + "."
return resp, nil
} var HelloServer = helloService{} func main() {
listen, err := net.Listen("tcp", Address)
if err != nil {
fmt.Printf("failed to listen:%v", err)
} //实现gRPC Server
s := grpc.NewServer()
//注册helloServer为客户端提供服务
pb.RegisterHelloServer(s, HelloServer) //内部调用了s.RegisterServer()
fmt.Println("Listen on" + Address) s.Serve(listen)
}
10.客户端代码
package main import (
pb "demo/example"
"fmt"
"golang.org/x/net/context"
"google.golang.org/grpc"
) const (
Address = "127.0.0.1:50052"
) func main() {
//连接gRPC服务器
conn, err := grpc.Dial(Address, grpc.WithInsecure())
if err != nil {
fmt.Println(err)
}
defer conn.Close() //初始化客户端
c := pb.NewHelloClient(conn) //调用方法
reqBody := new(pb.HelloRequest)
reqBody.Name = "gRPC"
r, err := c.SayHello(context.Background(), reqBody)
if err != nil {
fmt.Println(err)
}
fmt.Println(r.Message)
}
11.运行测试
服务端运行:
[root@wangjq demo]# go run server/main.go
Listen on127.0.0.: 客户端运行:
[root@wangjq demo]# go run client/main.go
hellogRPC.
golang grpc demo的更多相关文章
- golang 并发demo 写入 redis
		原文链接:golang 并发demo 写入 redis 源代码: package main import ( "fmt" "runtime" "str ... 
- Golang gRPC调试工具
		目录 Golang gRPC调试工具 1. 命令行工具 grpcurl 1.1 安装 1.2 验证 1.3 注册反射 1.4 使用示例 2. web调试工具grpcui 2.1 安装 2.2 验证 2 ... 
- golang gRPC初探
		gRPC使用protocol buffers作为Interface Definition Language (IDL). gRPC的底层信息交互格式也使用的是protocol buffers. 默认情 ... 
- Golang gRPC学习(04): Deadlines超时限制
		为什么要使用Deadlines 当我们使用gRPC时,gRPC库关系的是连接,序列化,反序列化和超时执行.Deadlines 允许gRPC客户端设置自己等待多长时间来完成rpc操作,直到出现这个错误 ... 
- Golang gRPC 示例
		1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应 ... 
- Golang gRPC 和 gRPC-gateway 结合使用
		一.安装 go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/g ... 
- Golang gRPC 使用
		一.概念 1.gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如JSON),可以用proto files创建gRPC服务 ... 
- [golang grpc] 框架介绍
		官方网站 http://www.grpc.io/ http://www.grpc.io/docs/quickstart/go.html grpc安装 • go安装 目前grpc需要go 1.5以上版本 ... 
- win7环境下,golang thrift demo代码编译不通过
		用官方的教程代码:http://thrift.apache.org/tutorial/go 用网友提供的代码:Golang RPC 之 Thrift 都出现如下情况 状况1: 编辑器中就会提醒 Can ... 
随机推荐
- gc 模块常用函数
			""" 1.gc.set_debug(flags) 设置gc的debug日志,一般设置为gc.DEBUG_LEAK 2.gc.collect([generation]) ... 
- 自学java,学多久可以自己找到工作?
			先以肯定的语气说明一下自学Java,多久可以找到工作: 按照目前Java的体系来说,Java的几个重点在于Javase.数据库.Spring全家桶系列的框架.而其他的在Java体系之内,会基础的操 ... 
- PHP setlocale() 函数
			实例 设置地区为 US English,然后再设置回系统默认: <?php高佣联盟 www.cgewang.comecho setlocale(LC_ALL,"US");ec ... 
- AC自动机&后缀自动机
			理解的不够深 故只能以此来加深理解 .我这个人就是蠢没办法 学长讲的题全程蒙蔽.可能我字符串就是菜吧,哦不我这个人就是菜吧. AC自动机的名字 AC 取自一个大牛 而自动机就比较有讲究了 不是寻常的东 ... 
- bzoj 4448 [Scoi2015]情报传递 主席树
			比较套路的题目. 可以发现难点在于某个点的权值动态修改 且我们要维护树上一条路径上的点权>x的个数. 每个点都在动态修改 这意味着我们的只能暴力的去查每个点. 考虑将所有可以动态修改的点变成静态 ... 
- Java异步之《我call(),Future在哪里》
			我们大家都知道,在 Java 中创建线程主要有三种方式: 继承 Thread 类: 实现 Runnable 接口: 实现 Callable 接口. 而后两者的区别在于 Callable 接口中的 ca ... 
- ORCHESTRATOR介绍及使用
			ORCHESTRATOR 一简介 MySQL高可用性和复制拓扑管理工具,支持复制拓扑结构的调整,自动故障转移和手动主从切换等.后端数据库用MySQL或SQLite存储元数据,并提供Web界面展示MyS ... 
- Swap常用操作与性能测试
			Swap分区通常被称为交换分区,这块儿分区位于硬盘的某个位置,当系统内存(物理内存)不够用的时候,如果开启了交换分区,部分内存里面暂时不用的数据就会Swap out(换出)到这块儿分区:当系统要使用这 ... 
- 解决IIS发布时CS0016未能写入输出文件错误
			今天遇到一个将asp.net项目部署到IIS后访问的时候报的一个错误: 在网上查询了相关资料后,解决方法如下: 找到C:\Windows\下的temp文件,右键属性>安全>编辑,给其中II ... 
- 2017面向对象程序设计(Java)第十三周助教工作总结
			时间飞逝,本学期即将接近尾声.不知不觉同学们已经学习java十三个星期了,想必同学们对Java课程体系及内容有了更加深入的理解,也应该摸索出了一套适用于自己的学习方法. 下面我对上周工作做以简单总结: ... 
