Linux中使用twirp搭建rpc框架

1.安装protobuf-compiler

执行apt-get update命令时因为使用的是官方源,速度会慢,而且有的包会下载不全,建议先把源换成国内的源,我用的是网易的,体验很不错

换源操作:https://www.cnblogs.com/webnote/p/5767853.html

然后使用以下两条命令

sudo apt-get update
sudo apt install protobuf-compiler

2.安装go环境

切换到usr/local

cd /usr/local

获取安装包

wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
# 解压文件
tar xfz go1.13.4.linux-amd64.tar.gz -C /usr/local

设置$GOPATH路径

cd /home
mkdir gopath
cd gopath/
mkdir bin
chmod 777 bin
mkdir pkg
chmod 777 pkg
mkdir src
chmod 777 src
#修改~/.bashrc
vim ~/.bashrc
#添加Gopath路径
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin
export GOPATH=/home/gopath
# 激活配置
source ~/.bashrc

验证是否配置成功

go version
#结果是:go version go1.13.4 linux/amd64 说明go安装成功了

3.安装git

这里有详细教程:https://www.cnblogs.com/lxm20145215----/p/5905765.html

最后记得要把git命令路径添加到环境变量里面

#修改~/.bashrc
vim ~/.bashrc
#修改Gopath路径
export PATH=$PATH:/usr/local/go/bin:/usr/bin/git:$GOPATH/bin
# 激活配置
source ~/.bashrc

4.安装 protoc-gen-go

go get -u github.com/golang/protobuf/protoc-gen-go

在这一步我遇到一个问题,就是命令执行完后没反应,如果你也遇到这个问题,可以用以下链接的方法去解决

https://blog.csdn.net/qq_37822034/article/details/106689613

5.安装 protoc-gen-twirp

go get -u github.com/twitchtv/twirp/protoc-gen-twirp

6.编写protobuf服务的定义

在刚刚克隆下来的twitchtv文件夹下创建一个twirpexample文件夹,在twirpexample文件夹下创建rpc/haberdasher/service.proto,编写service.proto,完整路径(/home/gopath/src/github.com/twitchtv/twirpexample/rpc/haberdasher/service.proto)

syntax = "proto3";
 
package twirp.example.haberdasher;
option go_package = "haberdasher";
 
// Haberdasher service makes hats for clients.
service Haberdasher {
  // MakeHat produces a hat of mysterious, randomly-selected color!
  rpc MakeHat(Size) returns (Hat);
}
 
// Size of a Hat, in inches.
message Size {
  int32 inches = 1; // must be > 0
}
 
// A Hat is a piece of headwear made by a Haberdasher.
message Hat {
  int32 inches = 1;
  string color = 2; // anything but "invisible"
  string name = 3; // i.e. "bowler"
}

7.生成*.pb.go和*.twirp.go

切换到twirpexample目录,执行下面的命令

protoc --go_out=.  --proto_path=. ./rpc/haberdasher/service.proto --twirp_out=.

解释一下,--go_out就是生成的*.pb.go文件存放的位置,--proto_path就是待转换的*.proto文件存放的位置,--twirp_out就是生成的*.twirp.go文件存放的位置

执行这个命令时,我又遇到了问题,报了以下错误:Unrecognized syntax identifier "proto3". This parser only recognizes "proto2".

意思就是刚刚使用sudo apt install protobuf-compiler下载的protobuf-complier只能识别proto2语法,但我使用的是proto3语法,如果你也出现了这个问题,可以用以下链接的方法去解决:https://blog.csdn.net/qq_45835827/article/details/105490115

8.实现服务器的业务逻辑(接口的方法)

在twirpexample文件夹下,创建internal/haberdasherserver/server.go,编写server.go

package haberdasherserver
 
import (
    "context"
    "math/rand"
 
    "github.com/twitchtv/twirp"
    pb "github.com/twitchtv/twirpexample/rpc/haberdasher"
)
 
// Server implements the Haberdasher service
type Server struct {}
 
func (s *Server) MakeHat(ctx context.Context, size *pb.Size) (hat *pb.Hat, err error) {
    if size.Inches <= 0 {
        return nil, twirp.InvalidArgumentError("inches", "I can't make a hat that small!")
    }
    return &pb.Hat{
        Inches:  size.Inches,
        Color: []string{"white", "black", "brown", "red", "blue"}[rand.Intn(4)],
        Name:  []string{"bowler", "baseball cap", "top hat", "derby"}[rand.Intn(3)],
    }, nil
}

9.创建提供服务的服务器

在twirpexample文件夹下,创建cmd/server/main.go,编写main.go

package main
 
import (
    "net/http"
 
    "github.com/twitchtv/twirpexample/internal/haberdasherserver"
    "github.com/twitchtv/twirpexample/rpc/haberdasher"
)
 
func main() {
  server := &haberdasherserver.Server{} // implements Haberdasher interface
  twirpHandler := haberdasher.NewHaberdasherServer(server, nil)
 
  http.ListenAndServe(":8080", twirpHandler)
}

10.创建客户端

在twirpexample文件夹下,创建cmd/client/main.go,编写main.go

package main
 
import (
    "context"
    "net/http"
    "os"
    "fmt"
    "github.com/twitchtv/twirpexample/rpc/haberdasher"
)
 
func main() {
    client := haberdasher.NewHaberdasherProtobufClient("http://localhost:8080", &http.Client{})
 
    hat, err := client.MakeHat(context.Background(), &haberdasher.Size{Inches: 12})
    if err != nil {
        fmt.Printf("oh no: %v", err)
        os.Exit(1)
    }
    fmt.Printf("I have a nice new hat: %+v", hat)
}

11.测试

在cmd/server/main.go中执行go run main.go开启服务器,在cmd/client/main.go中执行go run main.go开启客户端访问相应的服务

如果你在执行这两个命令时出现报错:cannot find module providing package,可以用以下链接的方法去解决:https://blog.csdn.net/HYZX_9987/article/details/101059186

如果你在执行这两个命令时出现报错:cannot find package "google.golang.org/protobuf/runtime/protoimpl" in any of...,可以用以下链接的方法去解决:https://blog.csdn.net/weixin_44448273/article/details/105571483

解决完所有问题后,结果终于出来了

 

你可能感兴趣的:(入职前培训)