9 sunshyran

尚未进行身份认证

人各有志,求同存异;学无止境,完美逼近

等级
TA的排名 1w+

一个简单RPC框架是如何炼成的(VI)——引入服务注册机制

开局篇我们说了,RPC框架的四个核心内容:RPC数据的传输,RPC消息协议,RPC服务注册,RPC消息处理。接下来处理RPC服务的注册机制。所谓注册机制,就是Server需要声明支持哪些rpc方法,然后当客户端发送调用某个声明的rpc方法之后,服务端能自动找到执行该请求的具体方法。1.引入服务注册的方式也是为了代码解耦,将req的处理与具体的req消息内容解耦。2.上面我们引入了两种服务注册的方式,一种方式是普通的方式,逐个添加方法。另一种方式通过python的“反射”技术,自动查找一个服务

2015-07-20 22:52:08

一个简单RPC框架是如何炼成的(V)——引入传输层

开局篇我们说了,RPC框架的四个核心内容RPC数据的传输。RPC消息协议RPC服务注册RPC消息处理  接下来处理数据传输。实际应用场景一般都是基于socket。socket代码比较多,使用起来也比较麻烦。而且具体的传输通道使用socket或者其他的方式,如更上层的http,或者android里的binder,都是可替换的,只是具体的一种实现而已。所以,这里我就偷个懒,只是

2015-07-20 22:47:41

一个简单RPC框架是如何炼成的(IV)——实现RPC消息的编解码

之前我们制定了一个很简单的RPC消息的格式,但没有实现相应的encode和decode方法,下面我们处理掉这个编解码问题。这里我还是简单原则,重点在于晓义嘛。利用python里的两个运算。str和eval,实现编解码。

2015-07-19 19:29:16

一个简单RPC框架是如何炼成的(III)——实现带参数的RPC调用

上一篇,我们制定了一个很简单的RPC消息的格式,但是还遗留了两个问题我们并没有实现相应的encode和decode方法,没有基于可以跨设备的字符串传输,而是直接的内存变量传递。现在的RPCrequest不支持带参数的请求命令。如add(a,b),如何在RPC消息中描述参数a,b。我先来实现第二个问题,即带参数的RPC调用。其实,也没什么太大不同。既然是要带参数,那

2015-07-19 08:39:23

一个简单RPC框架是如何炼成的(II)——制定RPC消息

开局篇我们说了,RPC框架的四个核心内容RPC数据的传输。RPC消息协议RPC服务注册RPC消息处理下面,我们先看一个普通的过程调用classClient(object):def__init__(self):self.remote=None###内部是委托给远程remote对象来获取结果。

2015-07-16 21:22:09

一个简单RPC框架是如何炼成的(I)——开局篇

开场白,这是一个关于RPC的相关概念的普及篇系列,主要是通过一步步的调整,提炼出一个相对完整的RPC框架。RPC(RemoteProcedureCallProtocol)——远程过程调用协议,基于C/S模型。有四个核心内容:RPC数据的传输,RPC消息的表示与编解码,RPC服务注册,RPC消息的任务处理机。这个RPC框架的搭建,庄稼人将采用python作为开发语言,是从原始的普通调用开始,然后一步步的演化,最后生成一个完整的Rpc框架

2015-07-16 21:20:04

读书报告之《修改代码的艺术》 (III)

《修改代码的艺术》,每次读来,都会相当重构,正如作者自己就说到的:从技术上讲,书中列到的解依赖技术,都是重构技术,因为他们都保持了代码的行为。这里庄稼人再多引用《大话重构》中的一句话:先重构我们的系统,使之可以应付那个需求,然后再添加代码,实现新需求。是的,正如读书报告(I)中所阐述的,引入单元测试,本质上就是做定制需求。作为最后一篇,来总结一下最后的解依赖技术。核心思想就是泛化,这里

2015-07-06 22:11:56

读书报告之《修改代码的艺术》 (II)续2

修改ifelse最忌惮的是天马行空,自负自己对代码的理解,直接重新改写条件语句。但另一方面,相信各位看官也注意到了,理解又是必不可少的,完全死死的做逻辑变形是异常繁琐的(这个在第二个例子中尤为明显),具体如何操作,不好意思,这就是"修改代码的艺术"。口才不行,修行还靠个人。 不要做不成熟的优化。相对来说,代码的清晰度高于性能的优化,而且很多时候两者并不是冲突的,当代码更清新了,往往有更好的优化方案。 举例中的一些代码风格,比如return快速返回,不是每个人都能接受。求同存异,这也是个人座右铭。

2014-09-08 22:27:52

读书报告之《修改代码的艺术》 (II)续

这里作为(II)的续篇,继续距离复杂的嵌套ifelse的处理。为了保持篇幅不会太长,所以截断了,以一篇新的文章形式给出。化简复杂的ifelse语句,基本的手段针对头重脚轻的ifelse,使用return快速返回,从而减少嵌套层数。合并分支。有些分支的执行内容相同,往往意味着可以合并为一个分支扁平化。第二个例子,比较复杂一点,给定一个日期,即年月日,让

2014-09-06 09:50:10

读书报告之《修改代码的艺术》 (II)

4.修改时应当测试哪些方法作者提出了影响结构图的概念。说穿了,就是CallRelation和ReferenceRelation,就是查看某个方法(变量)被哪些方法引用,以及自身又引用了哪些方法,依次类推。这个复杂的关系网实际就是一颗风险评估树(图)。通过这棵树,我们可以知道某个修改会影响到哪些节点。这项参数,既是风险的直接量化指标,同时又是验证修改的测试指标。这是很朴素的思想,不管有意无意,你肯定已经在这么做了,不要告诉我你的boss从来没问过你这样的问题:“这个修改有风险吗?”。

2014-09-05 23:39:09

读书报告之《修改代码的艺术》 (I)

《修改代码的艺术》,英文名《WorkingEffectivelywithLegacyCode》,中文翻译的文笔上绝对谈不上“艺术”二字,愧对艺术二字(当然译者不是这个意思)。书中第三部分不论是例子还是解说都有点混乱,远不如《重构——改善既有代码设计》一书。此书精华在于第一、二部分。如何学习这本书,作为一个最底层的码农,作为长期在别人代码上修修补补的苦逼二手货开发人员,我只能给的建议就是

2014-09-05 00:20:38

python 计算校验和

校验和是经常使用的,这里简单的列了一个针对按字节计算累加和。其实,这种累加和,使用将字节翻译为无符号整数和带符号整数,结果是一样的。使用python计算校验和时记住做截断就可以了。这里仅仅是作为一个代码样本,权作标记,直接上代码'''Createdon2014年9月4日@author:lenovo'''importrandom'''实际计算校验和时,解释为无符号整

2014-09-04 22:05:28

python常用的十进制、16进制、字符串、字节串之间的转换(长期更新帖)

进行协议解析时,总是会遇到各种各样的数据转换的问题,这里详细列举了整数之间的进制转换,以及整数、字符串、字节串三者之间的相互转换。当然仅仅是抛砖引玉,有更好更简单的方法,欢迎欢迎

2014-08-27 00:19:41

doxygen + doxypypy + docstring 生成python文档

虽然doxygen声称可以同时支持两种风格的python注释,原生的docstring和类似javadoc风格的##。但实际对原生的docstring支持并不好。这里介绍了一个开源的doxypypy工具,可以将原生的docstring转换为类javadoc风格的##,从而实现doxygen对python原生docstring的完美支持,同时也自然而然支持使用@tag。

2014-08-24 21:18:45

用python实现wireshark的follow tcp stream功能

长话短说,wireshark有一个followtcpstream功能,这个功能很方便。美中不足的是提取出的stream数据没有时间戳等其他信息,在分析数据的延时和丢包问题时就有些力不从心了。这里简单用python实现了一个简单followtcpstream功能,同时保留了tcp信息。原理很简单,仍然是基于wireshark,里面有一个Exportpacketdissect

2014-08-20 22:09:12

repo sync 时自动切换当前分支的remote track分支的问题

使用reposync时,如果当前仓库有检出本地分支,假设为dev,对应的远程track分支为origin/dev。而manifest.xml中指定的track分支为origin/master,那么在reposync时会自动将当前的dev分支的远程track分支修改为origin/master,不仅如此,同时还会将origin/master上的修改rebase到本地的这个dev分支上。

2014-07-23 23:34:44

Git图形用户工具介绍及比较

GITK简介 gitk-Thegitrepositorybrowser       Displayschangesinarepositoryoraselectedsetofcommits.Thisincludesvisualizing      thecommitgraph,showinginformation

2014-07-23 22:01:16

命令行执行python模块时提示包找不到的问题

庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具。多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可以运行任意一个python脚本,而使用命令行运行却不行?命令行下(或者双击执行)总是提示“ImportError:Nomodulenamedxxx”?pydev究竟做了什么魔术呢?长

2014-05-11 17:01:14

多分支开发策略

分支策略                                                                                                                                   author:crylearner 日常开发中几个常见过程ü 功能开发(开发人员)ü bu

2014-01-25 23:32:33

通用makefile是如何炼成的(XI)--最后的完结篇,envsetup.sh

长话短说,没有envsetup.sh,当你需要单独编译一个模块,或者做点其他工作时,你总是会感到为什么命令行总是那么麻烦!有了envsetup.sh,对命令行人生有新的感悟,原来我也可以做一个简单的“菜鸟”。这个envsetup.sh是从android的代码中考过来的,做了很大的简化。google他奶奶的太细心和繁琐了,这里用不着可用通过usage命令查询,目前仅支持genmk

2014-01-14 22:39:31

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!