佛系学习Vert.x之Bean序列化与Redis集成

大噶好我又来了,没了解过Vert.x的同学可以先看一下上一篇文章

Vert.x

OK, 这次我们来看点新东西。这次我们要做的场景是:发起一个POST请求新建一个User,这个请求提交了一个Json文件到我们的Server,然后Server接受到这个Json之后序列化成了我们定义的Bean。在验证完Json的合法性之后通过集成的RedisClient存入redis。有一些概念我们需要先了解一下:EventBus、Verticle。


首先是EventBus,"eventBus是vertx的神经系统" by 官方文档。eventBus允许我们程序中不同模块互相之间交换数据,而这些模块可以不使用同一种编程语言编写。简单的说就像是一个回转寿司店,不同的模块就是不同桌的客人,但是这些客人都可以在中间环形的传送带上取到自己想食的寿司(寿司师傅也会把捏好的寿司放在传送带上给客人),聪明的你肯定已经发现了这个寿司就是不同模块之间交换的数据,可以是各种类型。但是在vertx中,两个模块之间如果想要交换数据必须指定一个address,就好比你要去xxx寿司店才能吃到xx师傅捏的xx寿司。

接下来是Verticle,Verticle基本可以看作是Akka中的actor-model,但是严格上讲也不是完全相同的实现方式。在vertx中使用verticle可以大幅度的降低并发编程的难度,每一个verticle都是独立的线程,互相之间不共享数据与耦合,我们的一个程序中可以有任意多个verticle实例,每个实例可以负责不同的业务逻辑。既然verticle都是独立线程,那么它们之间是怎么交换数据呢?(你真是太聪明了)当然是使用eventBus啦,比如我们有V1和V2两个verticle,它们两个共同指定了"interesting"这个address,那么V1向这个地址发送数据,V2此时就可以获取到这个数据再进行后续的处理。而这个流程和消息订阅/发布系统是极为相似的,大家可以类比的理解一下。


那么我们开始,首先是定义Bean,PojoBase集成了序列化接口所以我们需要UID(IDE帮我们生成了):

一个单纯的类

在编写Verticle之前先来看一下架构:

一共5个verticle

从PersistenceVerticle开始看。每个verticle都继承了AbstractVerticle,为了部署每一个实例都需要重写父类的start方法,这里的PersistenceVerticle只是单纯的启动了RedisClientVerticle做了一层解耦:

PersistenceVerticle

接下来看RedisClientVerticle:

RedisClientVerticle

这一篇我们只用redis最最简单的set和get,所以只需要传一个host地址进去作为参数,通过vertx实例我们启动好了redis客户端然后打一个log美滋滋。还记得eventBus的address吗,之后这个MessageConsumer就是用来处理adress,我们注册newUser和getUser作为eventBus的地址便于接受其他verticle发来的数据,这个数据的类型就是泛型的类型啦。

因为vertx基于netty,所以我们都是用异步的方式来处理所有的逻辑,实现俩handler来完成get和set:

get/set

把user类中的id作为redis里的key值,这里拼接了一个"Vertx_X"作为key,value是user的toString的结果。到这里redis的部分基本就完成了,get和set都会返回一个异步的结果,我们通过这个结果来判断是否set/get成功。关于bean的序列化我们在后面讲。


首先我们部署web服务器的verticle:

WebStartVerticle

接下来是重写start方法启动httpserver:

启动httpserver

这个地方是并发的写法,当httpserver启动后调用future的complete方法完成最终的启动,在startRouter里面设置了几个路由:

启动路由

这个地方声明了一个Router对象,BodyHandler是为了用来接受和传递json数据,consumes和produces设置了数据传递的格式,接下来我们处理GET和POST请求:

创建一个user

这个地方我另写了一个webhandler类来处理请求,这个createUser方法首先接受routingContext作为参数,这个参数就像是Servlet里面的HttpServletRequest/Response保存了请求和返回的各类信息,第二个参数是Handler<AsyncResult<JsonObect>>类型的,因为我们使用的是异步的写法,返回了一个异步的结果,实现如下:

处理POST请求

在Vertx中提供了Json.decode和encode两个方法序列化json数据,第二个参数是要序列化转化的Bean类,这个地方就是转化成User,之后序列化成功后我们把结果封装进异步结果在返回给路由,如果捕获到了异常就封装一个异常返回,当路由得到了成功序列化的user后就发送给事先设置好的address:

发送数据

另一端RedisClientVerticle会订阅这个"newUser"的address,当有数据发来的时候就对这个message进行处理,set进redis。


那么getUser同理,首先是路由:

getUser

这里用了router的路径参数:id这个写法,接下来是handler:

获取id作为key

我们把得到的id作为key封装进异步结果然后传给路由,路由接受到成功结果后发给redis:

getUser是address

RedisClientVerticle取到数据后会进入redis查询,然后reply方法返回查询到的数据:

返回数据

到这里主要的逻辑我们就写完了,那么怎么把这两部分统一到一起启动呢?你写一个main同时启动两个verticle啊,是的,我们写一个main:

main启动

然后stream操作不懂的赶紧卸载你的jdk6,上次我就说了


我们把main跑起来试试效果:

RIP

然后结果是:

RIP

然后我们再get id 2:

RIP

完全没有问题,至此就结束啦!


最近还看了Netty,然后工作的原因一直在搞Spring这一块的东西。对比起来看reactive和servlet那一套各有各的好吧,不过我自己还是挺喜欢reactive这套方法的2333。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342