当前位置: 首页 > news >正文

gRPC RPC技术demo

假如已经安装好了protoc,下载地址:下载地址

新建一个项目如:demo01
初始化:go mod init demo01
安装这两个包:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest		
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

在demo01下新建pb文件夹,然后在pb文件夹下新建pb.proto
pb.proto代码:

syntax = "proto3";

option go_package = "./;pb";

package pb;

service Greeter{
    rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// 请求数据格式
message HelloRequest{
    string name = 1;
}

// 返回数据格式
message HelloResponse{
    string message = 1;
}

如果语法不高亮的话,可以在vscode安装插件:vscode-poroto3
分别在终端执行:

protoc --go_out=./pb ./pb/hello.proto
protoc --go_grpc_out=./pb ./pb/hello.proto

就会在pb文件夹下生成 hello_grpc.pb.go与hello.pb.go这两个文件
在demo01新建server,然后在server下新建main.go文件,main.go代码如下:

package main

import (
	"context"
	pb "demo01/pb"
	"fmt"
	"log"
	"net"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)

const (
	port = ":50051"
)

// 服务对象
type server struct {
	pb.UnimplementedGreeterServer
}

// sayhello实现服务的接口 在proto中定义的所有服务都是接口
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest)(*pb.HelloResponse,error){
	return &pb.HelloResponse{Message: "Hello " + in.Name},nil
}

func main() {
	lis, err := net.Listen("tcp", port)	
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	// 起一个服务
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})

	// 注册反射服务 这个服务是CLI使用的 跟服务本身没有关系
	fmt.Printf("\"开始提供服务\": %v\n", "开始提供服务")
	reflection.Register(s)
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve %v",err)
	}
}

在demo01新建client,然后在client下新建main.go文件,main.go代码如下:

package main

import (
	"context"
	pb "demo01/pb"
	"time"
	"log"
	"os"
	"google.golang.org/grpc"
)
const (
	address = "localhost:50051"
	defaultName = "world"
)

func main() {
	// 建立连接
	conn, err := grpc.Dial(address, grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect :%v",err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)
	name := defaultName
	if len(os.Args) > 1{
		name = os.Args[1]
	}
	// 1秒的上下文
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
	if err != nil {
		log.Fatalf("could not greet: %v",err)
	}
	log.Printf("Greeting: %s",r.Message)
	
}

进入server文件夹下执行:go run main.go 用来启动服务端
进入client文件夹下执行:go run main.go baixiaobai 用来启动客户端

相关文章:

  • 记录一下ts学习整理的一些知识点
  • java计算机毕业设计基于安卓Android的急救服务APP
  • MyBatis Plus (四) --------- 条件构造器 EntityWrapper
  • 神经网络算法应用案例,神经网络是机器算法吗
  • 2023中国(江西)国际餐饮品牌连锁加盟展览会2月26日开幕
  • Java ServiceLoader、Spring SpringFactoriesLoader、SPI方式解耦第三方组件
  • 聚焦个性化与场景化,全新升级的三星电视看点何在?
  • LeetCode每日一题JAVA、JavaSrcipt题解——2022.08.21-08.31
  • 哪种神经网络最好使用,哪种神经网络最好用
  • 02- Spring IOC与DI
  • 基于jeecgboot流程管理平台的自定义业务表单集成方法
  • 矩阵类问题处理技巧
  • MyBatis Plus (三) --------- 入门 HelloWorld
  • 云安全践行者:亚马逊云科技如何打好“安全”牌?
  • 第8章 Spring AOP
  • 30秒的PHP代码片段(1)数组 - Array
  • Git初体验
  • Laravel 实践之路: 数据库迁移与数据填充
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • passportjs 源码分析
  • PV统计优化设计
  • socket.io+express实现聊天室的思考(三)
  • Spark RDD学习: aggregate函数
  • SpingCloudBus整合RabbitMQ
  • Vue 动态创建 component
  • vue-cli在webpack的配置文件探究
  • vue数据传递--我有特殊的实现技巧
  • 动态规划入门(以爬楼梯为例)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 计算机常识 - 收藏集 - 掘金
  • 近期前端发展计划
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 我的业余项目总结
  • 我有几个粽子,和一个故事
  • 用Visual Studio开发以太坊智能合约
  • 正则表达式小结
  • 最简单的无缝轮播
  • #FPGA(基础知识)
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #if和#ifdef区别
  • (6)添加vue-cookie
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)Linux——Linux常用指令
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (转载)Linux网络编程入门
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ***测试-HTTP方法
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .Family_物联网
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .Net中ListT 泛型转成DataTable、DataSet