grpc之golang的简单使用
  Adknp2DJyaqB 2023年11月13日 22 0
  1. 安装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
  1. 安装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
  1. 新建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;
}
  1. 生成go代码
protoc --go_out=. --go-grpc_out=. carrier.proto

目录下面出现 carrier.proto carrier.pb.go carrier_grpc.pb.go image 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
}

  1. 根目录下新建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)
	}
}

  1. 新建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())
}

  1. 然后启动服务测试
go run server.go
go run carrierClient.go
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

Adknp2DJyaqB