window下golang使用grpc入门案例(代码片段)

author author     2022-10-30     533

关键词:

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

核心功能:

  1. 10种语言的语言客户端库
  2. 高效的线路和简单的服务定义框架
  3. 基于http / 2传输的双向流式传输
  4. 可插入的身份验证,跟踪,负载平衡和健康检查

主要使用场景:

  1. 在微服务式架构中有效地连接多点服务
  2. 将移动设备,浏览器客户端连接到后端服务
  3. 生成高效的客户端库

可以参考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

  1. 下载protoc-3.5.1-win32.zip 解压,配置环境变量 https://github.com/google/protobuf/releases
  2. window下验证安装
  3. 安装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.HelloReplyMessage: "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 官方源代码里都有,可自行测试

go语言入门篇-grpc基于golang&java简单实现

一.什么是RPC1.简介:RPC:RemoteProcedureCall,远程过程调用。简单来说就是两个进程之间的数据交互。正常服务端的接口服务是提供给用户端(在Web开发中就是浏览器)或者自身调用的,也就是本地过程调用。和本地过程调用相对的就... 查看详情

grpc和grpc-gateway的使用以及遇到的坑(代码片段)

...码2.4编写http转发代码2.5测试三、可能遇到的坑系统:windows10go版本:1.13.15一、gRPC的使用1.1gPRC和Protobuf的安装gogetgithub.com/golang/protobuf/protogogetgoogle.golang.org/grpcgogetgithub.com/golang/protobuf/protoc-gen-go装好上面三个之后,还需... 查看详情

3.微服务--grpc(代码片段)

...义方法参数和返回类型1.3安装gRPC和Protobuf?goget-u-vgithub.com/golang/protobuf/proto?gogetgoogle.golang.org/grpc(无法使用,用如下命令代替)?gitclonehttps://github.com/grpc/grpc-go.git$GOPATH/src/google.golang.org/grpc?gitclonehttps://github.com/golang/net.git$GOPATH/src/go... 查看详情

grpc-go使用笔记

 linux下配置GRpc-golang1、git中下载protobuf包2、解压(/usr/local/protobuf)unzipprotobuf-cpp-3.0.0-alpha-3.zip3、进入解压后的目录cdprotobuf/4、编译安装./configuremake&&sudomakeinstall5、获取grpc-golang插件,进入go安装目录下的bin 查看详情

grpc:使用golang开发grpc服务端和client

1,关于grpc-gogolang能够能够做grpc的服务端和client。官网的文档:http://www.grpc.io/docs/quickstart/go.htmlhttps://github.com/grpc/grpc-go和之前写的java的grpcclient调用同样。也须要使用protobuf的配置文件。可是golang以下的类库很的简单。并且golang... 查看详情

golang入门案例之socket

//服务端代码packagemainimport( "fmt" "net" "log" "os" "encoding/binary")funcmain(){ //建立socket,监听端口 netListen,err:=net.Listen("tcp","localhost:8090") CheckError(err) defernetListen.Close() Log("Waitingforc 查看详情

golang入门案例之httpclient请求

发请求,接收接送,并解析packagemainimport( "fmt" "net/http" "io/ioutil" "net/url" "encoding/json" "os")typeStudentstruct{ Namestring Ageint Guakebool Classes[]string Pricefloat32}func(s*Student)ShowStu(){ fmt.Pri 查看详情

golang语言入门及安装

...代码的速度,而且更加安全、支持并行进程。本次讲解在windows上安装go语言的开发环境首先进入go语言中文社区地址:https://studygolang.com/在此下载go语言的安装包后,然后进入安装也就是下一步---->下一步的老规则在装好后配置... 查看详情

grpc安装(代码片段)

...是gRPC的协议编译工具,写好proto之后,需要用这个编译。windows下直接下载编译好的包,然后将bin目录加到环境变量查看版本protoc--version3.安 查看详情

一个简单的案例入门grpc(代码片段)

这篇文章本来要在年前和小伙伴们见面,但是因为我之前的Mac系统版本是10.13.6,这个版本比较老,时至今天在运行一些新鲜玩意的时候有时候会有一些BUG(例如运行最新版的Nacos等),运行gRPC的插件也有BU... 查看详情

一个简单的案例入门grpc(代码片段)

这篇文章本来要在年前和小伙伴们见面,但是因为我之前的Mac系统版本是10.13.6,这个版本比较老,时至今天在运行一些新鲜玩意的时候有时候会有一些BUG(例如运行最新版的Nacos等),运行gRPC的插件也有BU... 查看详情

谈谈rpc——golang中jsonrpc和grpc的使用

前言不知从什么时候rpc这个东西开始进入我们的视野,一开始做开发的时候经常使用的都是http,偶尔使用的是socket进行通信,使用的是restful的方式。但是,一次偶然的机会你会发现RPC这个东西进入了你的视野,而且由于微服务... 查看详情

Golang 中的 Firestore gRPC API 示例用法

】Golang中的FirestoregRPCAPI示例用法【英文标题】:FirestoregRPCAPISampleUsageinGolang【发布时间】:2020-05-1122:30:19【问题描述】:一般来说,Firestore和gRPC的新手。我一直在试图弄清楚如何与golang的FirestoreRPCAPI进行交互。他们很好地记录... 查看详情

windows下golang使用protobuf(代码片段)

windows下安装protoc与protoc-gen-goProtobuf(ProtocolBuffer)是google的一种数据交换的格式,它独立于语言,独立于平台。google提供了多种语言的实现:java、c#、c++、go和python,每一种实现都包含了相应语言的... 查看详情

windows下使用jna在java中调用golang生成的dll

原文:https://studygolang.com/topics/6025/comment/17780 由于golang有自己的gc,所以在传递string值需要一些技巧  查看详情

在 golang 中更新 grpc 的接收和发送消息大小

】在golang中更新grpc的接收和发送消息大小【英文标题】:Updatingreceiveandsendmessagesizeforgrpcingolang【发布时间】:2019-01-1022:32:11【问题描述】:我有用Go编写的grpc服务器,我正在尝试使用以下代码将接收和发送消息大小更新为20MB,... 查看详情

gogrpc入门(代码片段)

...正文pb.go需要注意的是,在本个demo中,客户端与服务端都是Golang,所以在客户端与服务端都公用一个pb.go模板文件(如果是不同的语言生成的pb是对应语言),可以将pb.go文件放置在云上由双方引用,也可以生成两个副本放在两端项目中,本... 查看详情

window下golang包管理glide使用说明(代码片段)

golang是一门简洁高效的开发语言,但是包管理一直是一个痛点,如图:很多开源项目特别是github.com中的大量应用golang.org和google.golang.org中的源码,且由于被墙的原因也会导致各种不顺利,复制GOPATH里内容在团队人比较多的时候... 查看详情