下载通用编译器

地址:https://github.com/protocolbuffers/protobuf/releases
选择对应的版本,解压后将文件夹下bin目录配置到环境变量
安装go编译器
$ go install google.golang.org/protobuf/cmd/protoc-gen-go
$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc
创建文件夹,创建两个项目

记得 go mod init 项目名
然后 go mod tidy
Demo.proto内容
// 这个就是protobuf的中间文件
// 指定的当前proto语法的版本,有2和3
syntax = "proto3";
// 输出路径
option go_package="../pdfile";
// 定义request model
message GrpcDemoRequest{
int32 number1 = 1; // 1代表顺序
int32 number2 = 2;
}
// 定义response model
message GrpcDemoResponse{
int32 sum = 1; // 1代表顺序
}
// 定义服务主体
service ProdService{
// 定义方法
rpc GetSum(GrpcDemoRequest) returns(GrpcDemoResponse);
}
这里我们实现GetSum的功能是,传过来的GrpcDemoRequest结构体内 n1+n2 然后通过GrpcDemoResponse返回。
proto文件定义了方法和方法的参数,方法的内容要通过编译后的文件以接口的方式来实现
编译文件,终端进入到pdfile文件夹下,运行命令
protoc --go_out=. --go-grpc_out=. Demo.proto
会在pdfile下生成两个文件

生成后的go文件不要改动
如果导入包报红

鼠标悬浮点击Sync
Demo_grpc.pd.go
我们要实现的就是51 52 行的方法,下面红框是示例,到时候我们复制一下拿来用

在pdfile文件夹下创建Demo_imp.go

代码
package pdfile
import (
"context"
)
type DemoServiceServer struct {
}
func (d *DemoServiceServer) GetSum(ctx context.Context,req *GrpcDemoRequest) (*GrpcDemoResponse, error) {
resp := GrpcDemoResponse{
Sum: req.Number1+req.Number2,
}
return &resp,nil
}
func (d *DemoServiceServer) mustEmbedUnimplementedProdServiceServer() {}
服务注册
回到我们srv下的main文件
package main
import (
"google.golang.org/grpc"
"net"
"srv/pdfile"
)
func main() {
server := grpc.NewServer()
demoServer := &pdfile.DemoServiceServer{}
pdfile.RegisterProdServiceServer(
server,
demoServer,
)
listenin ,err := net.Listen("tcp","0.0.0.0:8858")
if err != nil {
panic(err)
}
_ = server.Serve(listenin)
}
客户端调用
将pdfile文件夹拷贝到cli文件夹下

修改cli main文件
package main
import (
"cli/pdfile"
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
func main() {
conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
demoServiceClient := pdfile.NewProdServiceClient(conn)
// 直接像调用本地方法一样调用GetSum方法
resp, err := demoServiceClient.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
Number1: 10,
Number2: 5,
})
if err != nil {
log.Fatal("调用gRPC方法错误: ", err)
}
fmt.Println(resp)
}
运行srv 然后运行 cli

完成
封装方便调用
新建文件

package grpc_conn
import (
"cli/pdfile"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
)
var Grpc_conn pdfile.ProdServiceClient
func init() {
conn, err := grpc.Dial("127.0.0.1:8858",grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatal(err)
}
Grpc_conn = pdfile.NewProdServiceClient(conn)
}
新建测试模块

package test
import (
"cli/grpc_conn"
"cli/pdfile"
"context"
"fmt"
"log"
"testing"
)
func TestDemo1(t *testing.T) {
resp, err := grpc_conn.Grpc_conn.GetSum(context.Background(), &pdfile.GrpcDemoRequest{
Number1: 10,
Number2: 5,
})
if err != nil {
log.Fatal("调用gRPC方法错误: ", err)
}
fmt.Println(resp)
}
运行test

我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我