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

Gone框架介绍29 - 在Gone中使用gRPC通信

gone是可以高效开发Web服务的Golang依赖注入框架
github地址:https://github.com/gone-io/gone
文档地址:https://goner.fun/zh/

文章目录

  • 使用gRPC通信
    • 编写proto文件,生成golang代码
    • 编写服务端代码
    • 注册客户端
    • 编写配置文件
    • 测试
    • 总结

使用gRPC通信

首先创建一个grpc目录,在这个目录中初始化一个golang mod:

mkdir grpc
cd grpc
go mod init grpc

编写proto文件,生成golang代码

  • 编写协议文件
    定义一个简单的Hello服务,包含一个Say方法
    文件名:proto/hello.proto
syntax = "proto3";option go_package="/proto";package Business;service Hello {rpc Say (SayRequest) returns (SayResponse);
}message SayResponse {string Message = 1;
}message SayRequest {string Name = 1;
}
  • 生成golang代码
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/hello.proto

其中,protoc的安装参考Protocol Buffer 编译器安装

编写服务端代码

文件名:server/main.go

package mainimport ("context""github.com/gone-io/gone""github.com/gone-io/gone/goner""github.com/gone-io/gone/goner/cmux""google.golang.org/grpc""grpc/proto""log"
)type server struct {gone.Flagproto.UnimplementedHelloServer // 嵌入UnimplementedHelloServer
}// 重载协议中定义的服务
func (s *server) Say(ctx context.Context, in *proto.SayRequest) (*proto.SayResponse, error) {log.Printf("Received: %v", in.GetName())return &proto.SayResponse{Message: "Hello " + in.GetName()}, nil
}// 实现 gone_grpc.Service接口的RegisterGrpcServer方法,该方法在服务器启动时会被自动调用
func (s *server) RegisterGrpcServer(server *grpc.Server) {proto.RegisterHelloServer(server, s)
}func main() {gone.Prepare(func(cemetery gone.Cemetery) error {_ = cmux.Priest(cemetery) // 注册cmux,可以让gRPC服务 和 HTTP服务共享一个端口_ = goner.GrpcServerPriest(cemetery) // 注册gRPC服务器cemetery.Bury(&server{}) // 注册gRPC服务return nil}).// 启动服务Serve()
}

注册客户端

文件名:client/main.go

package mainimport ("context""fmt""github.com/gone-io/gone""github.com/gone-io/gone/goner""google.golang.org/grpc""grpc/proto""log"
)type helloClient struct {gone.Flagproto.HelloClient // 嵌入HelloClienthost string `gone:"config,server.host"`port string `gone:"config,server.port"`
}// 实现 gone_grpc.Client接口的Address方法,该方法在客户端启动时会被自动调用
// 该方法的作用是告诉客户端gRPC服务的地址
func (c *helloClient) Address() string {return fmt.Sprintf("%s:%s", c.host, c.port)
}// 实现 gone_grpc.Client接口的Stub方法,该方法在客户端启动时会被自动调用
// 在该方法中,完成 HelloClient的初始化
func (c *helloClient) Stub(conn *grpc.ClientConn) {c.HelloClient = proto.NewHelloClient(conn)
}func main() {gone.Prepare(func(cemetery gone.Cemetery) error {_ = goner.GrpcClientPriest(cemetery) // 注册gRPC客户端注册器Gonercemetery.Bury(&helloClient{}) //注册我们的实现的helloClientreturn nil}).Run(func(in struct {hello *helloClient `gone:"*"`// 在Run方法的参数中,注入 helloClient}) {// 调用Say方法,给服务段发送消息say, err := in.hello.Say(context.Background(), &proto.SayRequest{Name: "gone"})if err != nil {log.Printf("er:%v", err)return}log.Printf("say result: %s", say.Message)})
}

编写配置文件

文件名:config/default.properties

# 设置grpc服务的端口和host
server.port=9001
server.host=127.0.0.1# 设置客户端使用的grpc服务端口和host
server.grpc.port=${server.port}
server.grpc.host=${server.host}

测试

  • 先运行服务端:
go run server/main.go

程序等待请求,屏幕打印内容:

2024-06-19 22:02:41.971|INFO|/Users/jim/works/gone-io/gone/goner/grpc/server.go:84||Register gRPC service *main.server
2024-06-19 22:02:41.971|INFO|/Users/jim/works/gone-io/gone/goner/grpc/server.go:88||gRPC server now listen at 127.0.0.1:9001
  • 然后,另外开窗口启动客户端:
go run client/main.go

程序执行完退出,屏幕打印内容如下:

2024-06-19 22:06:20.713|INFO|/Users/jim/works/gone-io/gone/goner/grpc/client.go:59||register gRPC client *main.helloClient on address 127.0.0.1:90012024/06/19 22:06:20 say result: Hello gone
  • 回到服务端窗口,可以看到服务器接收到请求,新打印一行日志:
2024/06/19 22:06:08 Received: gone

总结

在Gone中使用gRPC,需要完成以下几步:

  • 编写服务端

    1. 编写服务端Goner,匿名嵌入proto协议生成代码的 默认实现
    2. 重载proto文件中定义的接口方法,编写提供服务的具体业务逻辑
    3. 实现gone_grpc.Service接口的RegisterGrpcServer方法,在该方法中完成服务注册
    4. 将 服务端Goner 注册到 Gone框架
    5. 启动服务
  • 编写客户端

    1. 编写客户端Goner,嵌入proto协议生成代码的客户端接口
    2. 实现gone_grpc.Client接口的AddressStub方法,Address方法返回服务端地址,Stub初始化客服端接口
    3. 将 客户端Goner 注册到 Gone框架
    4. 启动客户端,调用客服端接口方法

本文的代码开源在: https://github.com/gone-io/gone/tree/main/example/grpc

相关文章:

Gone框架介绍29 - 在Gone中使用gRPC通信

gone是可以高效开发Web服务的Golang依赖注入框架 github地址:https://github.com/gone-io/gone 文档地址:https://goner.fun/zh/ 文章目录 使用gRPC通信编写proto文件,生成golang代码编写服务端代码注册客户端编写配置文件测试总结 使用gRPC通…...

开源一套Trados Sdlxliff 对比工具

开源一套Trados Sdlxliff 对比工具 在Trados翻译过程中经常对需要进行版本控制和对比,例如对比不同设置下生成的sdlxliff文件,对比不同的机器翻译结果以及对比机器翻译和人工翻译,对比翻译和审校等等。 当然SDL官方也提供了对比工具 https:…...

百度网盘 url 正则表达式

匹配 https://pan.baidu.com/s/1NmVIJiI2Ot8MkI-vxxNPTg?pwdxxxx https://pan.baidu.com/s/[a-zA-Z0-9\-]*(\?pwd[a-zA-Z0-9]{4})?该正则表达式匹配以 https:// 开头,后面跟着 pan.baidu.com/s/ 或 yun.baidu.com/s/,最后跟着一串由大小写字母、数字…...

【stable diffusion】ComfyUI扩展安装以及”127.0.0.1拒绝了我们的连接请求“解决记录

目录 扩展安装”127.0.0.1拒绝了我们的连接请求“解决记录操作1操作2操作3操作4总结扩展安装 虽然大家都推荐将扩展包直接放到extension文件夹的方式,但我还是推荐直接在sd webui的扩展处下载,酱紫比较好维护一点,我个人感觉。 按照上图顺序点击会出现”URLError: <url…...

OceanBase 列存中多列过滤性能解析

今天有同事问我&#xff0c;列存大宽表场景下&#xff0c;如果在多个列上有等值过滤条件&#xff0c;OceanBase 的性能是不是无法满足要求&#xff1f; Hi 晓楚&#xff0c;帮评估个OTS替换场景 大概1亿大宽表&#xff0c;查询姿势就是任意字段的组合&#xff0c;进行等值查询g…...

嵌入式实验---实验二 中断功能实验

一、实验目的 1、掌握STM32F103中断程序设计流程&#xff1b; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、在上一章的实验基础上&#xff0c;添加一个按键和一个LED&#xff1b; 2、使用中断的方式实现以下两个功能&#xff1a; &#xff08;1&#xff09;KEY1按键…...

在 Visual Studio 2022 (Visual C++ 17) 中使用 Visual Leak Detector

在 Visual C 2022 中使用 Visual Leak Detector 1 问题描述1.1 内存泄漏的困扰和解决之道1.2 内存泄漏检测工具的选择1.3 VLD的现状 2 安装和设置VLD的环境变量2.1 安装VLD文件2.2 VLD安装后的目录和文件说明2.2.1 include子目录说明2.2.2 lib子目录说明2.2.2.1 目录整理 2.2.3…...

基于IDEA的Maven(properties属性配置)

&#xff08;property &#xff1a;财产&#xff09;properties&#xff1a;它的复数。 同样也是基于上篇博客进行学习。&#xff08;具体的全部项目代码和结构可以去查看上篇...&#xff09; <properties><!--当前jdk版本 , 这一步可以完全省略--><maven.com…...

边缘计算(Edge Computing)_关键概念/优势/应用场景

边缘计算&#xff08;Edge Computing&#xff09;是一种计算范式&#xff0c;它将数据处理和分析从传统的集中式数据中心和云计算平台移至更接近数据生成源头的位置&#xff08;即“边缘”&#xff09;&#xff0c;例如物联网设备、传感器、路由器或其他边缘设备。边缘计算旨在…...

idea关联gitlab仓库,访问报错

1、登录方式 idea中集成了gitlab的最新版的插件后&#xff0c;登录强制使用token登录&#xff0c;不能使用账号密码登录。 2、版本问题报错 安装了插件后&#xff0c;如果本地部署的gitlab版本低&#xff0c;则直接导致gitlab生成的token也无法登录&#xff0c;操作会报错&am…...

【Hive】new HiveConf()时加载的配置浅析

简单看下源码&#xff1a; org.apache.hadoop.hive.conf.HiveConf HiveConf中有静态代码块&#xff0c;内容就是调用findConfigFile方法&#xff0c;尝试读取hive-default.xml&#xff0c;hive-site.xml&#xff0c;hivemetastore-site.xml&#xff0c;hiveserver2-site.xml。…...

Glide 缓存机制研究及同命名图片的替换回显

背景&#xff1a; 相册-图片后处理场景&#xff0c;需要先展示一张原图&#xff0c;同时后台对图片进行算法优化&#xff0c;完成优化之后无缝替换原图展示&#xff0c;同时保证后续都展示算法优化后的图片 图片加载采用 Glide 库实现 画重点&#xff1a; 相册场景&#xff…...

一键简易桌签(带背景)-Word插件-大珩助手

问题整理&#xff1a; 如何Word中设计简易桌签&#xff1f;如何设置带背景图的桌签&#xff1f; Word大珩助手是一款功能丰富的Office Word插件&#xff0c;旨在提高用户在处理文档时的效率。它具有多种实用的功能&#xff0c;能够帮助用户轻松修改、优化和管理Word文件&…...

如何解决centos停止维护后更换Debian11平替?

再有9天时间centos7.x就将停止维护,最近很多人已经再更换系统了!有推荐alibabacloud,opencloud,debian,ubuntu,centos-stream,tencentos,anolis,rockey,almal,oracle,arch,Fedora,opensuse 很多人不知道选什么,这里就主要介绍一下 如果你是使用宝塔面板 并且想要无缝衔…...

服务器雪崩的应对策略之----熔断机制

熔断机制&#xff08;Circuit Breaker&#xff09;是一种保护系统稳定性的重要手段。它的主要目的是防止系统在依赖的服务出现问题时&#xff0c;继续发送请求&#xff0c;从而保护系统免受进一步的影响。熔断机制通过监控请求的成功和失败率&#xff0c;在检测到故障率超过预设…...

RestClient操作索引库和文档

导入依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>导入依赖成功之后就可以开始我们的测…...

【设计模式深度剖析】【11】【行为型】【解释器模式】| 以算术表达式求值为例加深理解

&#x1f448;️上一篇:状态模式 设计模式-专栏&#x1f448;️ 文章目录 解释器模式定义英文原话直译 解释器模式中的角色1. 抽象表达式&#xff08;AbstractExpression&#xff09;2. 终端表达式&#xff08;TerminalExpression&#xff09;3. 非终端表达式&#xff08;Non…...

MySQL8,Navicat能登陆成功,密码却忘记了

执行成功的图&#xff1a; 以下为步骤&#xff1a;本文一共8个简单步骤。 环境&#xff1a;mysql8、window10、navicat11 1、打开本地电脑window10的命令窗&#xff08;俗称黑窗口&#xff09;&#xff0c;windowR 2、输入regegit&#xff0c;回车&#xff0c;打开注册表 3、…...

游戏中的寻路算法研究

1)Unity NavMesh研究 思考&#xff1a;毫无疑问&#xff0c;unity中自带的navmesh寻路是比较健全的&#xff0c;无奈在服务器中无法使用&#xff0c;这样子我们没办法做怪的导航&#xff0c;但是可以先体验下都有哪些api&#xff0c;并且可以可视化的看效果。 1)打开导航网格…...

【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项

文章目录 前言一、什么是 SMB&#xff1f;&#x1f4e2;二、如何识别中小企业的需求三、中小企业营销活动的类型四、AWS 合作伙伴可获得的其他 AWS 机会4.1 AWS IQ4.2 APN 客户参与 (ACE) 计划 前言 AWS 中小型企业 &#xff08;SMB&#xff09; 能力合作伙伴专注于帮助中小型…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...