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\ ...
随机推荐
- Python爬虫系列-分析Ajax请求并抓取今日头条街拍图片
1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. 2.抓取详情页内容 解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 3.下载图片与保存数据库 将 ...
- vue $emit子组件传出多个参数,如何在父组件中在接收所有参数的同时添加自定义参数
Vue.js 父子组件通信的十种方式 前言 很多时候用$emit携带参数传出事件,并且又需要在父组件中使用自定义参数时,这时我们就无法接受到子组件传出的参数了.找到了两种方法可以同时添加自定义参数的方 ...
- Python基础——列表(list)
创建列表(list) 通过[]来创建list结构,里面放任何类型都可以,没有长度限制. list1=[] type(list1) list1=[1,2,3,4] list1 list1=['] lis ...
- Python学习笔记:py2exe打包Python程序
使用py2exe将一个Python程序打包成一个exe程序,这样Python程序也可以在没有安装Python的环境中运行Python程序了.使用这个工具需要写一个用于打包的setup.py文件(名称可 ...
- STM32的IAP方案
from: http://bbs.eeworld.com.cn/thread-294115-1-1.html 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 + 温度显示 + 闹钟响铃 + 计 ...
- 数学基础:HUD1124-Factorial(N!末尾0的个数)
Factorial Problem Description The most important part of a GSM network is so called Base Transceiver ...
- selenium2元素定位Xpath和cssSelector
Selenium2中元素有以下几种定位方法, 常用的有Id,xpath, cssSelector XPATH介绍: XPATH是一种选择器 XPATH在firefox中用firepath验证 XP ...
- python for data analysis chapter1~2
Q1:numpy与series的区别:index Tab补全(任意路径Tab) 内省(函数:?显示文档字符串,??显示源代码:结合通配符:np.* load *?) %load .py ctrl-c( ...
- HDU 5399 数学 Too Simple
题意:有m个1~n的映射,而且对于任意的 i 满足 f1(f2(...fm(i))) = i 其中有些映射是知道的,有些是不知道的,问一共有多少种置换的组合. 分析: 首先这些置换一定是1~n的一个置 ...
- 新线程 handler
class CalculateThread extends Thread { private Handler handler; @Override public void run() { super. ...