go-gRPC快速入门

参考文献:gRPC中文文档 http://doc.oschina.net/grpc?t=60133

一、环境安装
  1. protobuf 下载
    https://github.com/protocolbuffers/protobuf/releases
    下完之后配置环境变量即可
  2. 安装go需要的依赖
// grpc 包
go get -u google.golang.org/grpc

// 安装protoc转go的插件
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc

// 安装 protoc-gen-go
go get github.com/golang/protobuf/protoc-gen-go 

// Ps: 超时可以配置国内镜像
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
二、编写proto文件
// 使用版本
syntax = 'proto3';

// 生成的包名
option go_package = './pdfile/service';

// 包名
package aaaaaaaaaa;

// 实体对象
message user {
  string name = 1;
  int32 age = 2;
  // 生成的是指针
  optional string password = 3;
  // 生成的是切片
  repeated string addr = 4;
}

message req {
  message date{
    string a = 1;
  }
  string status = 2;
}

service UserService{
  rpc getUserInfo ( user ) returns ( req );
}
三、go 生成grpc文件
// 生成在一个文件下
protoc --go_out=plugins=grpc:./  .\pdfile\user.proto

// 生成两个, 会有例子
protoc --go_out=./service  --go-grpc_out=./service  .\pdfile\user.proto
四、实现接口
package serviceImpl

import (
	"context"
)

// 实例化对象
var UserService = &userService{}

type userService struct {
}

/**
接口定义
UserServiceServer is the server API for UserService service.
type UserServiceServer interface {
	GetUserInfo(context.Context, *User) (*Req, error)
}
*/

/* 实现接口 */
func (p *userService) GetUserInfo(context context.Context, request *User) (*Req, error) {

	return &Req{
		Status: "调用成功。",
	}, nil

}

五、服务端
package main

import (
	"google.golang.org/grpc"
	"log"
	"net"
	"test/pdfile/serviceImpl"
)

func main() {

	rpcService := grpc.NewServer()

	// 注册方法
	serviceImpl.RegisterUserServiceServer(rpcService, serviceImpl.UserService)

	// 启动服务
	lesten, err := net.Listen("tcp", ":8005")
	if err != nil {
		log.Fatal("启动监听出错", err)
	}

	err = rpcService.Serve(lesten)
	if err != nil {
		log.Fatal("启动服务出错", err)
	}

	log.Fatalln("启动服务成功。")
}

六、客户端
package main

import (
	"context"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
	"test/pdfile/serviceImpl"
)

/**
客户端
*/

func main() {
	// 连接gRpc
	conn, err := grpc.Dial(":8005", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal("连接服务失败!")
	}
	// 退出时关闭
	defer conn.Close()

	// 得到客户端
	userServiceClient := serviceImpl.NewUserServiceClient(conn)

	// 调用方法
	password := "123"
	request := &serviceImpl.User{
		Name:     "chang",
		Age:      10,
		Password: &password,
		Addr:     nil,
	}

	req, err := userServiceClient.GetUserInfo(context.Background(), request)
	if err != nil {
		log.Fatal("调用接口失败》》》userServiceClient")
	}
	println(req.String())

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值