rpc
文章平均质量分 73
10km
这个作者很懒,什么都没留下…
展开
-
thrift:拦截器ThriftEventHandler获取调用参数
之前写过一篇博客介绍了如何在在spring的拦截器一层获取POST请求参数。当我在thrift环境使用ThriftEventHandler拦截请求获取请求参数,也遇到了类似的问题:这个阶段,因为请求方法的参数还没有被反序列化,所以要想获取HTTP的请求参数,就要自己从HttpServletRequest中获取。要从请求内容里获取参数,就要从TProtocol里获取到,然后解析出数据就可以了。原创 2024-08-24 15:56:56 · 329 阅读 · 0 评论 -
c++ thrift 库调试信息输出
thrift是一个跨平台的RPC框架,用了很久,但一直不知道如何输出它的内部日志,很长时间了,因为用不上,拿倒也相安无事。今天遇到thrift 底层socket通讯的问题,一直找不到原因,就把TSocket.cpp代码撸了一遍,才搞明白thrift库输出日志的方式。thrift有一个类型为apache::thrift::TOutput的全局变量GlobalOutput(定义在thrift/TOutput.h),通过调用其 setOutputFunction函数设置一个实现输出日志的回调函数,就可以让Th原创 2021-01-14 13:26:45 · 743 阅读 · 0 评论 -
通过升级cmake版本解决NDK编译报错:no member named ‘signbit‘ in the global namespace;
今天在ubuntu16下使用NDK(r19)编译thrift c++库时报了很多类似如下的错误:/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/cmath:314:9: error:no member named ‘signbit’ in the global namespace; did you mean‘__signbit’?using ::signbit;~~^/usr/原创 2020-12-04 12:50:44 · 4372 阅读 · 1 评论 -
windows下Android NDK R19 交叉编译 thrift C++ 库(cmake)
在NDK下编译thrift C++库,先要要编译android版的boost,这个不是本文讨论的内容,关于编译android 版本的boost,参见这个开源项目 Boost-for-Android,很好用。我用Boost-for-Androidk顺利编译了boost 1.69.(Android NDK r19)有了android版的boost就可以编译thrift C++库了。在这里走了不少弯路。先说明一下我的编译环境:操作系统:Windows 7cmake 3.11.1,编译thrift需要cm原创 2020-12-03 18:07:46 · 1215 阅读 · 0 评论 -
eRPC:通过实现双向请求的串行通讯传输(dual serial transport)支持client/server混合运行
Dual serial transport概述eRPC 的默认的设计模型是简单的主从模式,也就是设备A上运行服务,另一个设备B主动发起请求调用A的服务,但在实际的应用中,我们需要双向的请求,也就是说设备A,设备B互为主从,两台设备上都会运行服务供对方调用。在这种模式下,原有的串行通讯传输(SerialTransport)实现就不能满足要求,因为设备接收到的数据无法知道是给server的请求(Requst),还是给client的响应(Response)。如果要实现上述的双向请求并不复杂,只要修改串行通讯原创 2020-11-16 18:30:03 · 1580 阅读 · 0 评论 -
eRPC:修改erpcgen代码生成模板增加#if#endif宏定义,解决多个eRPC服务共用时类型重复定义问题
最近在用eRPC(https://github.com/EmbeddedRPC/erpc)实现通信时,发现一个问题,当有两个以上eRPC服务共用时会存在类型重定义问题,比如binary_t会在每个eRPC服务的头文件中定义一次。解决这个问题只能修改erpcgen的模板,还好,eRPC模板代码结构比较清晰,很快就找到生成eRPC服务接口头文件的位置(${ERPC_ROOT}/erpcgen/src/templates/c_common_header.template)只要添加类似如下的宏定义就可以解决问原创 2020-10-24 17:40:31 · 635 阅读 · 0 评论 -
erpc(EmbeddedRPC)入门笔记
RPC最近在忙一个IOT设备的项目,想设计一个通信系统通过串口控制设备(freertos)的运行。按照传统的设计思路,先要定义一套串口通信协议,在这套协议中传输层协议、应用层协议一个都不能少。每一层协议都要自己实现。数据编码/解码,数据校验,容错,这些非常基础的东西都要自己实现。等这些协议都实现了,才是能开始设计真正的业务逻辑。和同事商议后,一致认为要是照这么干,黄花菜都凉了。我们的生命不能...原创 2020-04-18 11:53:26 · 6730 阅读 · 0 评论 -
Microsoft/thrifty:解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题
thrifty是什么thrifty,对,没有拼写错,就是thrifty,是Microsoft的一个开源项目(https://github.com/Microsoft/thrifty),你可以简单理解为它是一个android版本的thrift框架,是facebook贡献给apache基金会的thrift框架在android平台的实现,与thrift完全兼容。为什么Microsoft会重复制造轮子...原创 2019-01-04 12:55:22 · 765 阅读 · 1 评论 -
Microsoft/thrifty:RPC方法返回NULL的异常处理
我们知道:thrift框架是不允许返回值为null的,如果返回值为null,client端会抛出异常,我在之用facebook/swift框架时就遇到了这个问题,这是当时解决问题的记录《thrift:返回null的解决办法》,现在使用Microsoft/thrifty框架实现的客户端同样也存在这个问题。下面是thifty-compiler生成的client端存根代码的receive方法的部分片段...原创 2019-01-10 18:31:11 · 1306 阅读 · 1 评论 -
Microsoft/thrifty vs facebook/swift: TTransportException:Buffer doesn‘t have enough bytes to read 异常
基于thrift的RPC系统中,如果service端是基于facebook的[swift](https://github.com/facebook/swift)开源框架实现的,而client是基于Microsoft的[thrifty](https://github.com/Microsoft/thrifty)开源框架实现的,那么在client向service端发送请求时,service端就可能会抛出本文标题所说的异常。原创 2019-01-08 23:27:50 · 1299 阅读 · 1 评论 -
facebook/swift:构建thrift http server(1)
如何基于facebook/swift构建一个支持HTTP访问的thrift服务?说来话长。我将用分几篇博客介绍这个问题的解决思路和具体实现。背景说明我有一个项目facelog,是基于facebook/swift框架(java)开发的。在实际的项目应用时,需要从浏览器端能调用facelog的接口方法,要实现这个功能,一个笨办法就是专门写一个java web应用,相当于一个二传手,对浏览器需要访问...原创 2019-05-04 00:46:23 · 1183 阅读 · 1 评论 -
facebook/swift:构建thrift http server(2)--HttpServerCodec
在为facelog选择XHR实现方案时,我反复看过[facebook/swift](https://github.com/facebookarchive/swift),了解到它依赖的底层通讯框架是[netty](https://github.com/netty/netty),说实话,我之前对netty并不太了解,藉于这次任务需要,我才花时间进一步了解了一下netty是什么。我好像明白facebook/swift为什么要基于netty设计了,netty本就是一个高效的异步通讯框架,你可以利用它实现你想要的任原创 2019-05-04 19:27:44 · 1373 阅读 · 1 评论 -
facebook/swift:构建thrift http server(3)--CORS跨域
在上一篇文章中我已经通过替换`frameCodec`为`HttpServerCodec`将`ThriftServer`改造为可以接收HTTP响应的netty server。完成代码修改后,赶紧用浏览器测试一下:通过拦截到的这个已经解码成`DefaultHttpRequest`对象的HTTP请求,至少可以判断替换的`HttpServerCodec`编解码器已经生效了,但这第一个HTTP请求居然不是浏览器端发出的`POST`,而是我不认识的`OPTIONS`,何解?这就引出了XHR请求的另一个问题C原创 2019-05-04 21:48:34 · 857 阅读 · 1 评论 -
facebook/swift:构建thrift http server(4)--ThriftXHRDecoder,ThriftXHREncoder
在上一篇博客中解决了thrift http sever的CORS跨域问题,但前端依然没有服务端的正常响应。看来还存在问题。继续研究Netty的代码。## ThriftMessage通过跟踪服务端收到的HTTP POST请求在管道(ChannelPipeline)中的传递流程找到了问题:原创 2019-05-04 23:03:53 · 458 阅读 · 1 评论 -
thrifty-compiler maven插件
之前写过一篇文章介绍如何用thrifty-compiler 通过IDL生成client代码《Microsoft/thrifty:解决thrifty-compiler.jar运行报错不能编译IDL生成java class代码问题》但是Microsoft/thrifty官方并没有提供maven插件用于在maven中调用thrifty-compiler,我的项目是用maven组织的所以在pom....原创 2019-07-07 13:02:44 · 328 阅读 · 0 评论 -
thrift/swift:服务端数据类型和client端数据类型之间的直接转换
需求描述我们知道,thrift/swift框架中,服务端的数据类型与client的类型是相互独立的,比如服务端有一个ClassA类型,到了client端,同样也会生成一个同名的类。服务端和client相互通信时,client的 ClassA会被转成数据流(二进制或HTML或JSON…),通过网络传输到服务端,服务端收到数据流后再转换服务端的ClassA,反之亦然。这个过程是由thrift框架自...原创 2018-03-04 10:13:44 · 1586 阅读 · 1 评论 -
thrift/swift:ThriftMethodProcessor代码分析
thrift是一种跨语言的RPC框架,为了保证在各种语言下都能正确表述,IDL语言在设计的时候就只能选取各种语言的共性。 比如对于null,虽然在java中定义一个字段为Integer类型,那么这个字段就可以为null,但thrift不允许primitive类型的数据字段为null,因为在c/c++的struct的字段中没有null的概念。做为方法的参数传递,primitive类型也是同样的道理...原创 2017-12-16 15:57:21 · 726 阅读 · 0 评论 -
thrift/swift:对swift2thrift-generator-cli IDL生成工具的改进
swift2thrift-generator-cli是thrift/swift提供的一个IDL文件命令行生成工具,它可以根据一个java服务接口类(interface,class)生成对应的IDL文件。 对于基于java做thrift框架的开发项目来说,这可是个神器,如果你的服务端是java开发的,就不需要手工写IDL文件(反正打死我也是不会手写的,太多了),使用这个命令行工具,可以一秒钟生成...原创 2017-12-22 22:33:40 · 1750 阅读 · 0 评论 -
解决axis2处理java.util.Date类型对象时丢弃时间部分的问题
我目前在做的一个项目以axis2为webservice框架,客户端和服务器端要传输很多复杂对象,在这方面,axis2做得不错,基本满足了我的需要,但当我把客户端提供给要使用的同事时,同事发现了一个问题:就是所有java.util.Date类型的对象,不论从服务器发到客户端的还是从客户端发送到服务器的,都只剩下日期部分(年/月/日),时间部分(时/分/秒)则被抹掉了。。。百思不得其姐啊。。。原创 2015-09-21 09:46:48 · 3717 阅读 · 3 评论 -
axis2:用ant脚本生成webservice client 端的java/c代码
Axis2是下一代 Apache Axis。Axis2 虽然由 Axis 1.x 处理程序模型提供支持,但它具有更强的灵活性并可扩展到新的体系结构。Axis2 基于新的体系结构进行了全新编写,而且没有采用 Axis 1.x 的常用代码。支持开发 Axis2 的动力是探寻模块化更强、灵活性更高和更有效的体系结构,这种体系结构可以很容易地插入到其他相关 Web 服务标准和协议(如 WS-Security原创 2016-08-05 10:05:10 · 1988 阅读 · 3 评论 -
gsoap入门:gsoap的plugin机制说明塈使用plugin实现调试soap函数时显示request/response xml文本
昨天调用gsoap函数时出错了,通过输出错误信息,知道了是服务器端的错误(参见前一篇博客《gsoap入门:获取gsoap的错误信息》)。 但仍然是一头雾水,不知道服务器端为什么报错,还需要更详细的信息,所以想到了能不能获取ressponse xml。 于是满世界找如何能获取gsop发送和接收的xml文本的办法,在google上找到了线索:gsoap的插件(plugin)机制: gsoap 的插原创 2016-08-12 11:07:36 · 1894 阅读 · 1 评论 -
ksoap2:实现gzip压缩发送request data
ksoap能不能支持gzip数据压缩传输?我们知道webservice调用生成的xml数据挺大的,如果能压缩传输可以显著减少网络延迟,提高系统的整体性能。那么ksoap2支持gzip压缩传输么?这就是我这两天要搞清楚的问题。接收response数据ksoap2用于数据发送接收的类是由继承抽象类org.ksoap2.transport.Transport实现的HttTransportSE实现的原创 2016-09-09 10:02:49 · 1108 阅读 · 1 评论 -
axis2:ServiceClient增加GZIP压缩支持
使用axis2的ServiceClient,以RPC或Stub方式实现webservice调用时,如果要对数据进行GZIP压缩,也挺简单,只要给ServiceClient设置 MC_GZIP_REQUEST和MC_ACCEPT_GZIP 属性就可以了。 示例代码如下: Options options = serviceClient.getOptions();原创 2016-09-08 13:07:07 · 1614 阅读 · 0 评论 -
gsoap:启用http compression(gzip)进行数据压缩传输
什么是http compress?HTTP compression即网页压缩,简单说就是web服务器和浏览器客户端传送数据时,将网页数据/客户端响应数据在发送给对方前先进行压缩再传输的一种方式。 使用网页压缩可以减少数据传输大小,减少数据在网上络上传递的时间消耗,提高web服务器和客户端之间的响应速度,改善客户体验。 HTTP compression是由web服务器和浏览器之间共同遵守的协议,也原创 2016-09-06 16:27:37 · 3048 阅读 · 2 评论 -
gsoap:stub代码(C++)在mingw下与C++11代码一起编译出错
理论上,gsoap生成的代码是可以在各种编译器下编译的。但现实是我用gsoap生成的c++代码,在windows/mingw就没办法编译,在windows/vs2015下可以正常编译,在linux/gcc也能 正常编译,给人的感觉似乎是没有在mingw下做过基本测试(真的是这样吗???)。简单的错误仔细研究了编译错误,其实都很简单,都是没有正确判断win32下的编译器类型。 例如下面这段代码(ve原创 2016-09-06 00:35:50 · 1512 阅读 · 1 评论 -
gsoap入门:Schema类型映射塈将xsd:date类型转为struct tm
typemap.dat的作用在使用wsdl2h生成.h文件时,有一个参数-t 用于指定typemap.dat,如果你不指定这个参数,wsdl2h也能正常执行,后续soapcpp2也能正常生成c/c++代码.那么这个typemap.dat有什么用呢?根据gsoap官网的解释,typename.dat是类型映射定义文件,用于定义schema 类型和c/c++类型的之间的对应关系,比如: xsd:str原创 2016-08-20 12:17:28 · 1907 阅读 · 0 评论 -
gsoap入门:获取服务器(axis2)端的异常(exception)对象
我们的webservice服务器端是以axis2为基础构建的,客户端提交的soap请求参数不正确或其他情况下,会抛出异常给客户端。这些异常在SOAP这一层是以Fault类型的消息呈现的,比如目前有如下异常: DeleteImgFail // 图像文件删除失败 DuplicateReord // 数据库记录重复 ImageError // 图像读写或格式错误 NotFaceDet原创 2016-08-13 17:40:39 · 1712 阅读 · 1 评论 -
gsoap入门:解决axis2服务器返回错误:com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix “ns1“
我们的项目中webservice服务器已经搭建好,基于用axis2提供名为FaceDbService的人脸识别服务。现在的任务是用gosap开发C++版本的客户端,所以最近在尝试用gsoap生成的c++代码来调用webservice. 关于生成gsoap C++客户端代码及编译,参见我的前一篇博客《gsoap入门:C/C++代码生成及编译》。测试代码下面是测试代码#include原创 2016-08-13 12:51:18 · 13258 阅读 · 1 评论 -
gsoap入门:获取gsoap的错误信息
今天学习gsoap的函数调用方式,一上来就出错了,错误原因还没找到,但为了查找出错原因,需要打出错误信息,于是学会了在调用gsoap的函数出错时获取错误信息的方式:struct soap soap;//... 执行gsoap调用if (soap.error!= SOAP_OK) { // 只打错误码,貌似没啥用, std::printf("soap err,err原创 2016-08-11 16:23:20 · 5968 阅读 · 1 评论 -
gsoap入门:C/C++代码生成及编译
gsoap是什么先来一段百度百科,说说gsoap是什么: gSOAP一种跨平台的开源的C/C++软件开发工具包。生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的具体架构解析器,它们都受益于一个XML接口。 这个工具包提供了一个全面和透明的XML数据绑定解决方案,Autocoding节省大量开发时间来执行SOAP/XML Web服务中的C/C++。此外,使用X原创 2016-08-10 19:07:17 · 8266 阅读 · 1 评论 -
java:axis2环境下获取方法参数名的另一种方法
java本身提供的方法不能获取方法的参数名的,只能获取每个参数的类型 比如:public String concatString(String param1,String param2){ return param1+param2; }想获取”param1”,和”param2”这个参数名,肯定是不行的。关于获取方法的参数名字(不是参数类型),一般的做法是借助第三方包java原创 2015-09-24 16:48:30 · 1330 阅读 · 1 评论 -
thrift/swift/nifty:获取客户端ip的简单方法
一个RPC方法中需要知道客户端的IP要怎么实现? 网上看了一堆关于thrift获取获取client ip的文章,基本都要自己写一个TServerEventHandler或TProcessor来实现。如下,所有的文章讲到的都是这两种方法。 《两种方式获取Thrift调用的客户端IP地址》虽然没有再深入研究,但我想如果用thrift这应该是正确的办法。 但是看着好烦呐,不就获取个ip...原创 2017-11-17 16:44:00 · 1926 阅读 · 2 评论 -
Stub方式接口化封装axis2 webservice:实现衍生对象与原始对象的相互转换
本文适合正做做涉及webservice项目开发,对axis2 webservice有一定了解的开发者。 在使用axis2 webservice时,对于初始学者,最方便的方式就是就wsdl2java工具生成Stub代码,然后就可以方便的调用Stub代码提供的类,像本地方法一样调用webservice接口。 我们知道,axis2生成的webservice接口可以很方便的传递复杂类型对象(对应于WSD原创 2015-09-22 18:49:51 · 3666 阅读 · 1 评论