window下golang使用gRPC入门案例&net core客户端
gRPC是google开源高性能分布式RPC框架,支持http/2 双向数据流传输及Protobuff,可以在任何环境下运行。 它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡,跟踪,运行状况检查和身份验证。 它也适用于分布式计算,将设备,移动应用程序和浏览器连接到后端服务。

核心功能:
- 10种语言的语言客户端库
- 高效的线路和简单的服务定义框架
- 基于http / 2传输的双向流式传输
- 可插入的身份验证,跟踪,负载平衡和健康检查
主要使用场景:
- 在微服务式架构中有效地连接多点服务
- 将移动设备,浏览器客户端连接到后端服务
- 生成高效的客户端库
可以参考gRPC官方文档 https://grpc.io/docs/
官方支持的语言一览:

RPC的框架还有 facebook的Thrift、阿里的Dubbo、rpcx等,可以自行百度查看资料。提供2篇关于rpc框架性能测试的文章
分布式RPC框架性能大比拼 http://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/
开源RPC(gRPC/Thrift)框架性能评测 https://www.cnblogs.com/softidea/p/7232035.html
一、检查golang的安装环境
https://golang.org/dl/ 需要墙,或者在这里下载 https://pan.baidu.com/s/12tTmrVIel6sfeBInpt9lQA 最新版本1.10 下载msi安装即可
window下go version 验证安装

二、安装、配置ProtoBuff
- 下载protoc-3.5.1-win32.zip 解压,配置环境变量 https://github.com/google/protobuf/releases

- window下验证安装

- 安装Go语言的protoc插件
go get -u github.com/golang/protobuf/protoc-gen-go
会在GOPATH下Bin目录编译生成protoc-gen-go.exe

三、下载gRPC
注意 :官方文档里的使用 go get -u google.golang.org/grpc 下载,实际情况即使用梯子貌似也下载不了
而且在github里gRPC貌似也已经按照语言来分开了,如图:

下载最新版本 https://github.com/grpc/grpc-go/releases 最新版本是 grpc-go-1.11.1.zip 解压到%GOPATH%下google.golang.org/grpc文件夹,如图:
PS: 不能直接 import github的地址,由于历史原因(grpc内部代码还是用的google.golang.org)和golang的包管理机制不健全

四、官方的grpc示例程序
1.server服务端
package main
import (
"log"
"net"
"golang.org/x/net/context"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)
const (
port = ":50051"
)
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "hi,你好 " + 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{})
// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
如果运行报错 cannot find package "golang.org/x/text/secure/bidirule"、cannot find package "golang.org/x/text/unicode/norm"
下载代码 https://github.com/golang/text 复制到%GOPATH%/src/golang.org/x/text文件夹下。
如果运行报错 cannot find package "google.golang.org/genproto/googleapis/rpc/status"
下载代码 https://github.com/google/go-genproto 复制到%GOPATH%/src/google.golang.org/genproto文件夹下。
官方的server/client源代码地址:https://github.com/grpc/grpc-go/tree/master/examples/helloworld
案例server源代码地址:https://github.com/nickchou/grpc-go
2.client客户端
grpc客户端,这里我们重新建一个.Net Core的项目(参考官网的 C#版本)
官方C# 版本的服务器、客户端代码:https://github.com/grpc/grpc/tree/master/examples/csharp/helloworld
新做的.Net Core 客户端,完整代码:https://github.com/nickchou/grpc-netcore
客户端代码如下
using System;
using Grpc.Core;
using Helloworld;
namespace Core.Client
{
class Program
{
static void Main(string[] args)
{
//创建一个长连接的channel(不加密、不安全的)
Channel channel = new Channel("127.0.0.1:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
String user = "zhangsan";
var reply = client.SayHello(new HelloRequest { Name = user });
Console.WriteLine("Greeting: " + reply.Message);
channel.ShutdownAsync().Wait();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}

1.上图右侧解决方案Greeter类库中的Helloworld.cs和HelloworldGrpc.cs 是generate_protos.bat 根据protos/helloworld.proto的定义用grpc.tools里的protoc.exe来生成的
2.注意右侧解决方案中的Nuget引用,grpc.tools实际也是Nuget引用但是.Net Core不像C#一样拉组件dll文件在package目录下,而是一个window账户的公共目录,所以是从公共目录中复制在解决方案里,方便根据bat批处理来生成文件。
protos/helloworld.proto文件内容如下:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
批处理generate_protos.bat的代码如下,由于是net core用所以改了部分
setlocal
@rem enter this directory
cd /d %~dp0
set TOOLS_PATH=grpc.tools\1.10.0\tools\windows_x86
%TOOLS_PATH%\protoc.exe -I protos --csharp_out Greeter protos/helloworld.proto --grpc_out Greeter --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe
endlocal
pause
3.执行结果

总结:
1、感觉c#客户端的还是比较麻烦,如果服务端要给客户端调用还是建议直接Greeter类库打包成DLL组件放Nuget给客户端调用会更方便一些,不要让调用方去生成grpc调用类
2、golang服务端主要是因为各种包管理配置比较复杂,后面重新整理下更好的golang的包管理方法
3、golang服务端总体代码来看还是比较简单方便,grpc虽然不是性能最高的,但是基于http2的应用总体感觉还是足够了。
4、仅供学习参考用 ,基于golang和c#的server/client 官方源代码里都有,可自行测试
window下golang使用gRPC入门案例&net core客户端的更多相关文章
- window下golang生成静态库给C语言调用
buidmod为c-archive能在window下生成 ,c-shared则不行 1.golang生成c-archive静态库 main.go package main import "C ...
- 使用Golang搭建gRPC服务提供给.NetCore客户端调用
目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...
- window下golang包管理glide使用说明
golang是一门简洁高效的开发 语言,但是包管理一直是一个痛点,如图 : 很多开源项目特别是github.com中的大量应用golang.org和google.golang.org中的源码,且由于被 ...
- window下Git和github入门
tip:使用简单的例子来制作一个使用指南过程,默认文件夹为demo.看了3个早晨,写一下留个记录,可能有些不成熟,如有错误欢迎指正. 参考一:http://www.liaoxuefeng.com/wi ...
- gRPC入门—golang实现
1.RPC 1.1 什么是RPC RPC(Remote Procedure Call),即远程过程调用,过程就是方法,简单来说,它就是一种能够像调用本地方法一样调用远程计算机进程中的方法的技术,在这种 ...
- grpc基础讲解和golang实现grpc通信小案例
grpc简介 gRPC由google开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC客户端和服务端可以在多种环境中运行和交互,例如用java写一个服务端,可以用go语言写客户端调用 g ...
- window下的Django入门
一.window下新建安装(参考书籍:<python编程:从入门到实践>) 新建一个文件夹 learning_log ,在终端中切换到该目录下,并创建一个虚拟工作环境,运行模块 venv ...
- window / Linux 下 Golang 开发环境的配置
一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...
- Window下UDP(socket)接和收数据案例
配置QT的环境变量,这台电脑à属性à高级系统设置à高级à环境变量à系统变量àpathàC:\Qt\Qt5.3.0\5.3\mingw482_32\bin;C:\Qt\Qt5.3.0\Tools\ ...
随机推荐
- NOIP模拟赛 不等数列
[题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2012取模. [输入格式] 第一行 ...
- 有重复元素的排列(DFS)
题目描述: 设R={ r1, r2 , …, rn}是要进行排列的n个元素.其中元素r1, r2 , …, rn均为小写字母并且可能相同.试设计一个算法,列出R的所有不同排列. 给定n 以及待排列的n ...
- PHP RBAC权限控制,基于CI框架(版本3.1.9)
2018年11月7日更新:目前功能已做到事件级别权限控制,如:后台用户的添加操作.删除操作和保存操作等具体到事件级的操作方法有权限则展示相应的操作菜单,没权限则隐藏相应菜单或提示无权限到目前算是真正做 ...
- 不依赖Hibernate的万能BaseDao---模仿了Hibernate底层的原理
今天写了个万能的BaseDao:有了这个BaseDao以后的Dao层直接继承这个BaseDao就能直接操作数据库了,增删改查,这是一个简易的Hibernate模型.写这个BaseDao的原因是最近在学 ...
- CentOS7.2下Hadoop2.7.2的集群搭建
1.基本环境: 操作系统: Centos 7.2.1511 三台虚机: 192.168.163.224 master 192.168.163.225 node1 192.168.163.226 ...
- HDU 5402 模拟 构造 Travelling Salesman Problem
题意: 有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径. 分析: 如果n和m有一个是偶数的话,那么只 ...
- 《Scrum实战》第3次课【富有成效的每日站会】作业汇总
1组 崔儒: http://kecyru.blog.163.com/blog/static/2741661732017626101944123/ 2017-07-26 孟帅: http://www.c ...
- js常见的方法
Ajax请求 jquery ajax函数 我自己封装了一个ajax的函数,代码如下: var Ajax = function(url, type success, error) { $.ajax({ ...
- [python学习篇][书籍学习][python standrad library][内建类型]迭代器类型
我们已经知道,可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如list.tuple.dict.set.str等:一类是generator,包括生成器和带yield的generato ...
- [python工具][1]sublime安装与配置
http://www.cnblogs.com/wind128/p/4409422.html 1 官网下载版本 http://www.sublimetext.com/3 选择 Windows - al ...