grpc学习golang版( 二、入门示例)

news2025/1/12 8:55:53

系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例


文章目录

  • 一、环境
  • 二、编写protobuf文件
  • 三、编写server服务端
  • 四、编写服务端
  • 五、测试


一、环境

确保环境已经配置完成,效果如下。不同环境可能导致后续生成的效果不一。

go version
protoc --version
protoc-gen-go --version

二、编写protobuf文件

新建go_grpc_study目录,新建go_grpc_study/grpc_proto目录,新建hello.proto文件
目录结构如下


编写hello.proto文件,内容如下:

// 指定proto版本
syntax = "proto3"; 

// 指定默认包名
package hello_grpc;     

// 指定golang包名
option go_package = "/hello_grpc";

//定义rpc服务
service HelloService {
  // 定义函数
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// HelloRequest 请求内容
message HelloRequest {
  string name = 1;
  string message = 2;
}

// HelloResponse 响应内容
message HelloResponse{
  string name = 1;
  string message = 2;
}

go_grpc_study/grpc_proto目录下新建Terminal,执行生成文件,命令如下

protoc --go_out=. --go-grpc_out=. hello.proto

目录结构变更后为

三、编写server服务端

新建server目录,新建main.go文件
目录结构如下

编写server/main.go文件

package main

import (
	"context"
	"fmt"
	"go_grpc_study/grpc_proto/hello_grpc"
	"google.golang.org/grpc"
	"google.golang.org/grpc/grpclog"
	"net"
)

// 得有一个结构体,需要实现这个服务的全部方法,叫什么名字不重要
// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type HelloServer struct {
	hello_grpc.UnimplementedHelloServiceServer
}

func (HelloServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (pd *hello_grpc.HelloResponse, err error) {
	fmt.Println("入参:", request.Name, request.Message)
	pd = new(hello_grpc.HelloResponse)
	pd.Name = "你好"
	pd.Message = "ok"
	return
}

func main() {
	// 监听端口
	listen, err := net.Listen("tcp", ":8080")
	if err != nil {
		grpclog.Fatalf("Failed to listen: %v", err)
	}

	// 创建一个gRPC服务器实例。
	s := grpc.NewServer()
	// 将server结构体注册为gRPC服务。
	hello_grpc.RegisterHelloServiceServer(s, &HelloServer{})
	fmt.Println("grpc server running :8080")
	// 开始处理客户端请求。
	err = s.Serve(listen)
}

具体步骤如下:

  • 1)定义一个结构体,必须包含pb.UnimplementedGreeterServer 对象
  • 2)实现 .proto文件中定义的API
  • 3)将服务描述及其具体实现注册到 gRPC 中

四、编写服务端

新建client目录,新建main.go文件
目录结构如下

编写clinet/main.go文件

package main

import (
	"context"
	"fmt"
	"go_grpc_study/grpc_proto/hello_grpc"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"log"
)

func main() {
	addr := ":8080"
	// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。
	// 此处使用不安全的证书来实现 SSL/TLS 连接
	conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))
	}
	defer conn.Close()
	// 初始化客户端
	client := hello_grpc.NewHelloServiceClient(conn)
	result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{
		Name:    "Donkor",
		Message: "hello",
	})
	fmt.Println(result, err)
}

具体步骤如下:

  • 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接
  • 2)使用 hello_grpc.NewHelloServiceClient(conn)初始化客户端
  • 3)通过客户端调用ServiceAPI方法client.SayHello

五、测试

server目录下,启动服务端

go run main.go

clinet目录下,启动客户端

go run main.go

服务端运行结果

客户端运行结果


完成ヾ(◍°∇°◍)ノ゙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1862737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端返回base64文件流下载

后端返回base64文件流: 前端处理: downloadTemplate () {this.$API.downloadTemplate().then(({ data }) > {const binaryString atob(data) // 解码base64字符串const byteArray new Uint8Array(binaryString.length) // 创建一个Uint8Arrayfor (let i 0; i…

AI时代下:面对高要求低薪酬,我们如何破局?

在人工智能(AI)技术日新月异的今天,职场生态正经历着颠覆性的变革。AI技术的广泛应用极大地提高了工作效率,为企业带来了前所未有的发展契机,然而,这也给我们这些职场人带来了前所未有的挑战。在这些挑战中…

# Kafka_深入探秘者(6):kafka 物理存储

Kafka_深入探秘者(6):kafka 物理存储 一、kafka 存储结构 1、kafka 存储结构概述图 2、kafka 存储结构概述 每一个 partion (文件夹)相当于一个巨型文件被平均分配,到多个大小相等 segment(段) 数据文件里。但每一个段 segment file 消息数…

CV每日论文--2024.6.24

1、Whiteboard-of-Thought: Thinking Step-by-Step Across Modalities 中文标题:思维白板:跨模式逐步思考 简介:这段话描述了一种利用思维白板提示来增强大型语言模型在视觉推理任务中的性能的方法。 人类在解决需要视觉思考的问题时,通常会…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手,该工具基于GPT-4-200k设计并实现其功能,可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …

嵌入式通信协议----Zigbee

一、简介 1.概念 Zigbee 是一种广泛用于连接物联网(IoT)设备的无线通信协议。它基于 IEEE 802.15.4 标准,使用低功耗数字无线电来创建个人区域网络(PAN)。Zigbee 网络的特点是数据速率低、功耗低、覆盖范围短&#xf…

Mybatis-plus学习|性能分析插件、条件构造器、代码自动生成器

性能分析插件 我们在平时的开发中,会遇到一些慢sql。测试!druid…. MP也提供性能分析插件,如果超过这个时间就停止运行! 1、导入插件 该插件只允许在开发和测试环境中使用,故先设置开发环境为开发模式 在MP配置类中注册这个插件&#xff0…

微软专家分享 | AIGC开发者沙龙上海站来啦!

为了向技术开发者、业务人员、高校学生、以及个体创业人员等AI技术关注者们提供更深入的行业洞察、技术交流平台和创新思维的启发,AIGC开放社区联合微软Reactor特别组织了一系列城市巡回沙龙分享活动。在上海站中,我们有幸邀请到多位微软专家进行深入的主…

车辆数据的提取、定位和融合 精确车辆定位(其三.一 共十二篇)随机复合

第一篇: System Introduction 第二篇:State of the Art 第三篇:localization 第四篇:Submapping and temporal weighting 第五篇:Mapping of Point-shaped landmark data 第六篇:Clustering of landma…

A股周一走势历史罕见,你知道是为什么吗?

今天的A股,让人历史罕见,你知道是为什么吗?盘面出现2个重要信号,一起来看看: 1、今天大盘低开低走,跌懵了,两市板块全部在等待翻红,这让人历史罕见。 2、盘面出现2个重要信号&#x…

virutalBox安装debian并配置docker环境

下载镜像 https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso 虚拟机安装 如何在Virtual Box 上安装Debian系统_virtual box debian iso netinst-CSDN博客 启动命令行模式 如何设置Debian图形启动或命令行界面启动&#xff1…

实验室信息化管理系统LIMS直击实验室管理痛点,提升效率与规范

实验室信息化管理系统LIMS直击实验室管理痛点,提升效率与规范 在实验室管理的实践中,您是否也面临过以下挑战:如何高效协调和管理多个检测项目?如何让管理经验与检测数据有效积累?如何应对项目监控与管理的复杂性&…

C语言数据结构-分析期末选择题考点(一)

昔我往矣,杨柳依依 今我来思,雨雪霏霏 契子✨ 有道是:得选择题者得天下。临近考试,便总结一下数据结构选择题的常考题型吧,以及预测一下考点,一来是为了备考,二来可以水文。祝各位老铁 “挂柯南…

数据结构-线性表的链式表示

目录 前言一、线性表的链式表示和实现1.1 线性表的表示1.2 基本操作的实现1.3 线性表的链式表示的优缺点 总结 前言 本篇文章主要介绍线性表的链式表示 一、线性表的链式表示和实现 1.1 线性表的表示 线性表的链式表示又称为链式存储结构或链式映像 链式存储定义&#xff1…

1.2 DataX 数据同步工具详细教程

DataX 是阿里巴巴开源的一款高效的数据同步工具,旨在实现多种异构数据源之间的高效数据同步。以下是对 DataX 的详细介绍: 架构 DataX 的架构主要包括以下几个核心组件: DataX Core:负责任务调度、插件加载、日志管理等核心功能…

达梦数据库(DM8)替换授权dm.key遇到的错误, lic info is different between dm.key and sysinfo.

1、报错贴图 2、报错日志提示 version info: security lic info is different between dm.key and sysinfo. 原因说明:dm.key授权与服务器的硬件环境不匹配引起的报错,如:cpu、操作系统版本有关。

C++——布隆过滤器

目录 布隆过滤器的提出 布隆过滤器的概念 布隆过滤器的基本原理和特点 布隆过滤器的实现 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺陷 布隆过滤器使用场景 布隆过滤器的提出 在注册账号设置昵称的时候,为了保证…

word文档怎么加密?电脑文件加密的详细步骤【分享4个】

为了保护Word文档不被未经授权的人员访问或修改,我们通常会采用加密的方式来增加其安全性。那么Word文档怎么加密?电脑文档安全成为了大家所关心的话题。 本文针对不同的情况,本文分享了4种电脑文件加密的方法,每一种加密方法都比…

数据分析必备:一步步教你如何用matplotlib做数据可视化(12)

1、Matplotlib 3D线框图 线框图采用值网格并将其投影到指定的三维表面上,并且可以使得到的三维形式非常容易可视化。plot_wireframe()函数用于此目的 import matplotlib.pyplot as plt import numpy as np import math import seaborn as sns plt.rcParams[font.s…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…