RPC-thrift实践
参考:https://www.cnblogs.com/52fhy/p/11146047.html
参考:https://juejin.cn/post/7138032523648598030
实践
- 安装thrift
- brew install thrift
- thrift -version
- 编写thrift文件
- 新建文件夹thrift
- 新建文件
- 结构体文件
- Struct.thrift
- 服务文件
- Service.thrift
- 结构体文件
namespace go TestThriftstruct MyStructReq {1:required string reqMessage;
}struct MyStructResp {1:required string respMessage;
}
include "Struct.thrift"namespace go TestThriftservice MyService {Struct.MyStructResp MyQuery(1:required Struct.MyStructReq req)
}
- 生成idl文件
- Interface Definition Language
thrift -r --gen go XXX.thrift
- 编写服务程序(go)
cd testmkdir thrift_go_servicego mod init thrift_go_service- 生成idl文件,代码中需要依赖这个
thrift -r --gen go ~/PycharmProjects/thrift/Service.thrift
- 编写代码
package mainimport ("context""fmt""github.com/apache/thrift/lib/go/thrift""net""os""strconv""thrift_go_service/gen-go/TestThrift"
)type MyHandler struct {
}func (my *MyHandler) MyQuery(ctx context.Context, req *TestThrift.MyStructReq) (resp *TestThrift.MyStructResp, err error) {resp = &TestThrift.MyStructResp{}s := map[string]string{"hhh": "nihao","what": "why",}if v, ok := s[req.ReqMessage]; ok {resp.RespMessage = vreturn}resp.RespMessage = strconv.Itoa(len(req.ReqMessage))return
}func main() {transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()serverTransport, err := thrift.NewTServerSocket(net.JoinHostPort("localhost", "9001"))if err != nil {fmt.Println("err:", err)os.Exit(1)}handler := &MyHandler{}processor := TestThrift.NewMyServiceProcessor(handler)server := thrift.NewTSimpleServer4(processor, serverTransport, transportFactory, protocolFactory)err = server.Serve()if err != nil {fmt.Println("err:", err)}
}
- 编写客户端的代码
mkdir thrift_go_clientgo mod init thrift_go_client- 生成idl文件,代码中需要依赖这个
thrift -r --gen go ~/PycharmProjects/thrift/Service.thrift
- 编写代码
package mainimport ("context""fmt""github.com/apache/thrift/lib/go/thrift""net""os""thrift_go_client/gen-go/TestThrift"
)func main() {tSocket, err := thrift.NewTSocket(net.JoinHostPort("localhost", "9001"))if err != nil {fmt.Println("err:", err)os.Exit(1)}transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())transport, _ := transportFactory.GetTransport(tSocket)protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()client := TestThrift.NewMyServiceClientFactory(transport, protocolFactory)defer transport.Close()if err := transport.Open(); err != nil {fmt.Println("err:", err)os.Exit(1)}ctx := context.Background()d, err := client.MyQuery(ctx, &TestThrift.MyStructReq{ReqMessage: "hhh"})fmt.Println(d)
}
问题
go版本问题
启动service服务时候
✘ XXX@XXX ~/XXX/GoProjects/thrift_go_service go run main.go
# github.com/apache/thrift/lib/go/thrift
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/deserializer.go:83:12: syntax error: unexpected [, expecting semicolon or newline or }
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pointerize.go:24:13: syntax error: unexpected [, expecting (
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:28:13: syntax error: unexpected any, expecting ]
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:30:16: syntax error: unexpected newline, expecting name or (
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:31:1: syntax error: non-declaration statement outside function body
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:38:13: syntax error: unexpected [, expecting (
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:38:37: method has no receiver
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:40:21: method has no receiver
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:40:21: syntax error: unexpected *, expecting name or (
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:46:16: method has no receiver
../../../go/pkg/mod/github.com/apache/thrift@v0.17.0/lib/go/thrift/pool.go:46:16: too many errors
note: module requires Go 1.18
- 提示需要升级go版本
- brew install go@1.18
- 切换版本:
- 参考:https://learnku.com/go/wikis/61549
- brew unlink go
- brew link go@1.18
- go version
ide的thrift文件打开方式
- ide中可以配置thrift插件
- 参考:https://blog.csdn.net/x369201170/article/details/51604284
- ide中修改.thrift文件的打开方式
- 参考:https://blog.csdn.net/qq_25046261/article/details/81666118
- 安装了thrift插件之后,可以找到对应的默认打开方式
- thrift的执行文件地址:
which thrift
- thrift的执行文件地址:
- 查看thrift的执行目录
- 参考:https://www.cnblogs.com/MakeView660/p/11398492.html
*which thrift
- 参考:https://www.cnblogs.com/MakeView660/p/11398492.html
如果服务端和客户端依赖的idl文件不一样,能行吗
- 可行
- 只要结构体名、函数名一致
- 这种情况出现在idl接口文件升级的时候
相关文章:
RPC-thrift实践
参考:https://www.cnblogs.com/52fhy/p/11146047.html 参考:https://juejin.cn/post/7138032523648598030 实践 安装thrift brew install thriftthrift -version 编写thrift文件 新建文件夹thrift新建文件 结构体文件 Struct.thrift 服务文件 Service.…...
Maven:工程的拆分与聚合
Maven 拆分与聚合创建父工程创建子模块pom.xml配置示例拆分与聚合 在 Maven 中, 拆分是将一个完整的项目分成一个个独立的小模块,聚合是将各个模块进一步组合,形成一个完整的项目。接下来简单示例拆分与聚合的过程。 创建父工程 父工程,一个pom工程,目录结构简单,只需有…...
使用uniapp创建小程序和H5界面
uniapp的介绍可以看官网,接下来我们使用uniapp创建小程序和H5界面,其他小程序也是可以的,只演示创建这2个,其实都是一套代码,只是生成的方式不一样而已。 uni-app官网 1.打开HBuilder X 选择如图所示,下…...
密度峰值聚类算法(DPC)
密度峰值聚类算法目录DPC算法1.1 DPC算法的两个假设1.2 DPC算法的两个重要概念1.3 DPC算法的执行步骤1.4 DPC算法的优缺点matlab代码密度计算函数计算delta寻找聚类中心点聚类算法目录 DPC算法 1.1 DPC算法的两个假设 1)类簇中心被类簇中其他密度较低的数据点包围…...
RabbitMQ相关问题
文章目录避免重复消费(保证消息幂等性)消息积压上线更多的消费者,进行正常消费惰性队列消息缓存延时队列RabbitMQ如何保证消息的有序性?RabbitMQ消息的可靠性、延时队列如何实现数据库与缓存数据一致?开启消费者多线程消费避免重复消费(保证消…...
操作系统 三(存储管理)
一、 存储系统的“金字塔”层次结构设计原理:cpu自身运算速度很快。内存、外存的访问速度受到限制各层次存储器的特点:1)主存储器(主存/内存/可执行存储器)保存进程运行时的程序和数据,内存的访问速度远低于…...
day34 贪心算法 | 860、柠檬水找零 406、根据身高重建队列 452、用最少数量的箭引爆气球
题目 860、柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个…...
使用canvas给上传的整张图片添加平铺的水印
写在开头 哈喽,各位倔友们又见面了,本章我们继续来分享一个实用小技巧,给图片加水印功能,水印功能的目的是为了保护网站或作者版权,防止内容被别人利用或白嫖。 但是网络中,是没有绝对安全的,…...
[安装之4] 联想ThinkPad 加装固态硬盘教程
方案:保留原有的机械硬盘,再加装一个固态硬盘作为系统盘。由于X250没有光驱,这样就无法使用第二个2.5寸的硬盘。还好,X250留有一个M.2接口,这样,就可以使用NGFF M.2接口的固态硬盘。不过,这种接…...
Java数据类型、基本与引用数据类型区别、装箱与拆箱、a=a+b与a+=b区别
文章目录1.Java有哪些数据类型2.Java中引用数据类型有哪些,它们与基本数据类型有什么区别?3.Java中的自动装箱与拆箱4.为什么要有包装类型?5.aab与ab有什么区别吗?1.Java有哪些数据类型 8种基本数据类型: 6种数字类型(4个整数型…...
GoLang设置gofmt和goimports自动格式化
目录 设置gofmt gofmt介绍 配置gofmt 设置goimports goimports介绍 配置goimports 设置gofmt gofmt介绍 Go语言的开发团队制定了统一的官方代码风格,并且推出了 gofmt 工具(gofmt 或 go fmt)来帮助开发者格式化他们的代码到统一的风格…...
【k8s】如何搭建搭建k8s服务器集群(Kubernetes)
搭建k8s服务器集群 服务器搭建环境随手记 文章目录搭建k8s服务器集群前言:一、前期准备(所有节点)1.1所有节点,关闭防火墙规则,关闭selinux,关闭swap交换,打通所有服务器网络,进行p…...
DIDL4_前向传播与反向传播(模型参数的更新)
前向传播与反向传播前向传播与反向传播的作用前向传播及公式前向传播范例反向传播及公式反向传播范例小结前向传播计算图前向传播与反向传播的作用 在训练神经网络时,前向传播和反向传播相互依赖。 对于前向传播,我们沿着依赖的方向遍历计算图并计算其路…...
链表学习之链表划分
链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 链表划分 将单向链表值划分为左边小、中间相等、右边大的形式。中间值为pivot划分值。 要求:调整之后节点的相对次序不变,时间复…...
(考研湖科大教书匠计算机网络)第五章传输层-第一、二节:传输层概述及端口号、复用分用等概念
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:传输层概述(1)概述(2)从计算机网络体系结构角度看传输层(3)传输层意义二&am…...
C#:Krypton控件使用方法详解(第七讲) ——kryptonHeader
今天介绍的Krypton控件中的kryptonHeader,下面开始介绍这个控件的属性:控件的样子如上图所示,从上面控件外观来看,这个控件有三部分组成。第一部分是前面的图片,第二部分是kryptonHeader1文本,第三部分是控…...
5年软件测试工程师分享的自动化测试经验,一定要看
今天给大家分享一个华为的软件测试工程师分享的关于自动化测试的经验及干货。真的后悔太晚找他要了, 纯干货。一定要看完! 1.什么是自动化测试? 用程序测试程序,用代码取代思考,用脚本运行取代手工测试。自动化测试涵…...
什么是猜疑心理?小猫测试网科普小作文
什么是猜疑心理?猜疑心理是说一个人心中想法偏离了客观事实,牵强附会,往往是指不好的一面,对别人的一言一行都充满了不良的解读,认为这些对自己都有针对性,目的性,对自己都是不利的。猜疑心理重…...
Redis命令行对常用数据结构String、list、set、zset、hash等增删改查操作
1.Redis命令的小套路 - NX:not exist - EX:expire - M:multi 2.基本操作 ①切换数据库 Redis默认有16个数据库。 115 # Set the number of databases. The default database is DB 0, you can select 116 # a different one on a per-con…...
mycobot 使用教程
(1) 树莓派4B ubuntu系统调整swap空间与使SD卡快速扩容参考:https://www.bilibili.com/read/cv14825069https://blog.csdn.net/weixin_45824920/article/details/114381292?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edef…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
