- 安装protoc 登陆网站 https://github.com/protocolbuffers/protobuf/releases,下载最新版. 解压到目录 /home/wms/Downloads/,然后添加环境变量.
unzip -q protoc-24.3-linux-x86_64.zip
echo export PATH=$PATH:/home/wms/Downloads/protoc-24.3/bin>>/etc/profile
source /etc/profile
protoc --version
- 安装golang生成代码插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
echo export PATH=$PATH:$(go env GOPATH)/bin>>/etc/profile
source /etc/profile
- 新建carrier.proto文件 在项目新建proto/carrier文件夹,然后新建carrier.proto
syntax = "proto3";
//option java_package = "com.colobu.rpctest";
package carrier;
option go_package = "/";
// The greeting service definition.
service Carrier {
// Sends a greeting
rpc GetCarrier (CarrierRequest) returns (CarrierMsg) {}
rpc GetCarriers (CarriersRequest) returns(CarriersReply){}
}
// The request message containing the user's name.
message CarrierRequest {
string Name = 1;
}
// The response message containing the greetings
message CarriersRequest{
int64 Page = 1;
int64 PageSize = 2;
}
message CarriersReply{
int64 Page = 1;
int64 PageSize = 2;
repeated CarrierMsg CarrierInfo = 3;
}
message CarrierMsg{
int64 Id = 1;
string Name = 2;
}
- 生成go代码
protoc --go_out=. --go-grpc_out=. carrier.proto
目录下面出现 carrier.proto carrier.pb.go carrier_grpc.pb.go 5. 实现rpc方法 根目录下建立server文件夹,然后新建carrier.go文件
package server
import (
"context"
"log"
"rpc/data"
rca "rpc/proto/carrier"
)
type Carrier struct {
rca.UnimplementedCarrierServer
}
func (carrier *Carrier) GetCarrier(ctx context.Context, in *rca.CarrierRequest) (*rca.CarrierMsg, error) {
return &rca.CarrierMsg{Id:1,Name:"test"}, nil
}
func (carrier *Carrier) GetCarriers(ctx context.Context, in *rca.CarriersRequest) (*rca.CarriersReply, error) {
return &rca.CarriersReply{Page:1,PageSize:10,CarrierInfo:nil}, nil
}
新建register.go
package server
import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
carrier "rpc/proto/carrier"
file "rpc/proto/file"
greeter "rpc/proto/greeter"
token "rpc/proto/token"
)
func Register() *grpc.Server {
s := grpc.NewServer(grpc.Creds(insecure.NewCredentials()))
greeter.RegisterGreeterServer(s, &Greeter{})
carrier.RegisterCarrierServer(s, &Carrier{})
token.RegisterTokenServer(s, &Token{})
file.RegisterFileServer(s, &File{})
return s
}
- 根目录下新建server.go文件
package main
import (
"flag"
"fmt"
"log"
"net"
"rpc/server"
)
var (
port = flag.Int("port", 50051, "The server port")
)
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := server.Register()
fmt.Println("*************************************************")
fmt.Println(" rpc")
fmt.Println(" 服务端口", lis.Addr())
fmt.Println("*************************************************")
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
- 新建client文件用来放测试用的客户端,也可以放在不同项目,或者其他机器上,或者使用postman测试也可以。我是为了方便放一起。
package main
import (
"context"
"flag"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"log"
rca "rpc/proto/carrier"
"time"
)
type CAuth struct {
}
func (c CAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
//TODO implement me
return map[string]string{
"accessToken": "",
}, nil
}
func (c CAuth) RequireTransportSecurity() bool {
return false
}
func main() {
var addr = flag.String("addr", "ip:50051", "the address to connect to")
flag.Parse()
var opts []grpc.DialOption
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
opts = append(opts, grpc.WithPerRPCCredentials(new(CAuth)))
conn, err := grpc.Dial(*addr, opts...)
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := rca.NewCarrierClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r1, err := c.GetCarrier(ctx, &rca.CarrierRequest{Name: "sdfsdfsdf"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Carrier: %s", r1.GetName())
}
- 然后启动服务测试
go run server.go
go run carrierClient.go