AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

微服务架构下的服务通讯 by 老雷

发布者 microservice
发布于 1442971824984  浏览 4792 关键词 微服务, 架构 
分享到

第1页

微服务架构下的服务通讯



第2页

⽼老雷 leizongmin ucdok.com



第5页

我们是初创团队



第6页

团队⼈人员紧凑



第7页

产品快速迭代



第8页

应付未来可能的系统压⼒力



第9页

⼀一登后台架构的演变



第10页

API服务器 SDK

⼈人脸识别模块

单进程



第11页

API服务器 ⼈人脸识别模块 SDK Nginx

API服务器 ⼈人脸识别模块

多进程



第12页

⼈人脸识别服务 ⼈人脸识别服务 SDK API服务器 ⼈人脸识别服务

⼈人脸识别服务

独⽴立出⼈人脸识别服务



第13页

发短信服务



⼈人脸识别服务



⼈人脸识别服务 SDK API服务器

⼈人脸识别服务



发邮件服务



⼈人脸识别服务



更多服务



第14页

API服务器 SDK



发短信服务 ⼈人脸识别服务 ⼈人脸识别服务 ⼈人脸识别服务 ⼈人脸识别服务 发邮件服务

更多应⽤用



管理后台 活动⻚页⾯面 开发者中⼼心



第15页

微服务

每个服务⼩小⽽而简单



第16页

微服务

每个服务⼩小⽽而简单 可使⽤用不同的语⾔言开发



第17页

微服务

每个服务⼩小⽽而简单 可使⽤用不同的语⾔言开发 运⾏行在独⽴立的进程中



第18页

微服务

每个服务⼩小⽽而简单 可使⽤用不同的语⾔言开发 运⾏行在独⽴立的进程中 松耦合,独⽴立部署



第19页

搞⼀一个这样的东⻄西 会不会很⿇麻烦



第20页

团队⼈人员紧凑

产品快速迭代

应付未来可能的 系统压⼒力



第21页

其实就是远程调⽤用



第22页

服务注册



服务注册中⼼心



1 注册可提供的服务





查询可提供某个服务 的服务器



⼈人脸识别服务



API服务器



第23页

总线式服务通讯



2 接收调⽤用请求



消息队列/⺴⽹网关 1 发送调⽤用请求



⼈人脸识别服务



API服务器



第24页

总线式服务通讯



1 返回处理结果



消息队列/⺴⽹网关 2 接收处理结果



⼈人脸识别服务



API服务器



第25页

总线式服务通讯



消息队列/⺴⽹网关



2 接收调⽤用请求 ⼈人脸识别服务



1 发送调⽤用请求 API服务器



发邮件服务



第26页

总线式服务通讯



消息队列/⺴⽹网关



1 返回处理结果 ⼈人脸识别服务



2 接收处理结果 API服务器



发邮件服务



第27页

总线式服务通讯



发短信服务



消息队列/⺴⽹网关



API服务器



⼈人脸识别服务 发邮件服务



API服务器



第28页

总线式服务通讯



发短信服务



消息队列/⺴⽹网关



API服务器



集中式管理



中⼼心节点⼒力⼤大



⼈人脸识别服务



⽅方便监控



API服务器



发邮件服务



第29页

点对点式服务通讯



⼈人脸识别服务



1 发送调⽤用请求 2 返回处理结果



API服务器



第30页

点对点式服务通讯



⼈人脸识别服务



API服务器



1 发送调⽤用请求



2 返回处理结果



发邮件服务



第31页

点对点式服务通讯



发短信服务



API服务器



⼈人脸识别服务



API服务器



发邮件服务



API服务器



第32页

点对点式服务通讯



发短信服务



API服务器



⼈人脸识别服务



配置复杂



API服务器



发邮件服务



API服务器



第33页

代码演⽰示



第34页

初始化



var server = clouds.createServer({ var client = clouds.createClient({



redis: {



redis: {



host: '127.0.0.1',



host: '127.0.0.1',



port: 6379,



port: 6379,



db: 1 db: 1



}, },



heartbeat: 2



timeout: 2



}); });



第35页

注册服务

server.register('hello', function (name, callback) { callback(null, 'hello, ' + name);

}); server.register('say', function (name, msg, callback) {

callback(null, msg + ', ' + name); });



第36页

调⽤用服务

client.call('hello', ['world'], function (err, ret) { if (err) console.error(err); else console.log(ret);

});

var say = client.bind('say'); say('world', 'hello', function (err, ret) {

if (err) console.error(err); else console.log(ret); }); var say = client.bind('say', 2);



第37页

实现原理



第38页

A



Redis服务器





SETEX S:method:id 0 ttl 注册服务





KEYS S:method:* 查找可⽤用服务器



⼈人脸识别服务



API服务器



第39页

注册服务





服务提供者掉线后 S:method:id⾃自动失效



Redis服务器





SETEX S:method:id 0 ttl 注册服务





KEYS S:method:* 查找可⽤用服务器



⼈人脸识别服务



API服务器



第40页

服务通讯



Redis服务器



1 SUBSCRIBE L:id1



2 SUBSCRIBE L:id2



⼈人脸识别服务



API服务器



第41页

服务通讯



Redis服务器



2 on message: xxxx



1 PUBLISH L:id1 xxxx



⼈人脸识别服务



API服务器



第42页

调⽤用服务



⼈人脸识别服务



Redis服务器





KEYS S:method:* 获取可⽤用服务器列表



2 随机选择⼀一个服务器



API服务器



第43页

调⽤用服务





on message 接收到调⽤用请求



Redis服务器 PUBLISH L:server_id

1 发送调⽤用请求每个请求带上 唯⼀一 msg_id



⼈人脸识别服务



API服务器



第44页

调⽤用服务



Redis服务器





PUBLISH L:client_id 返回处理结果,带上 msg_id





on message 接收到处理结果



3 执⾏行callback



⼈人脸识别服务



API服务器



第45页

失败处理



⼈人脸识别服务



Redis服务器





调⽤用请求超过指定时间 没返回结果





选择另⼀一台可⽤用服务器 重新发送调⽤用请求



API服务器



第46页

优点

只需配置Redis连接即可,⽆无其他依赖



第47页

优点

只需配置Redis连接即可,⽆无其他依赖 服务提供者可动态加⼊入



第48页

优点

只需配置Redis连接即可,⽆无其他依赖 服务提供者可动态加⼊入 借助Redis在其他语⾔言的客户端实现跨语⾔言



第49页

优点

只需配置Redis连接即可,⽆无其他依赖 服务提供者可动态加⼊入 借助Redis在其他语⾔言的客户端实现跨语⾔言 数据使⽤用JSON格式,灵活



第50页

优点

只需配置Redis连接即可,⽆无其他依赖 服务提供者可动态加⼊入 借助Redis在其他语⾔言的客户端实现跨语⾔言 数据使⽤用JSON格式,灵活 借助Redis3.0的集群解决压⼒力问题



第51页

性能怎样



第52页

平均完成⼀一次请求耗时(ms)



clouds (redis) eureca.io amqp-rpc

6ms 5ms 4ms 3ms 2ms 1ms

100并发



性能测试

clouds (clouds-controller) dnode



100并 1000 10000 发 并发 并发



clouds 54 314 2948



1000并发



cloudscontroller





222 1780



eurec a.io





351 3364



dnode 84 1203 50466



amqprpc





10000并发



669 7205



第53页

未来的改进



第54页

单点故障

⼈人脸识别服务



API服务器



⼈人脸识别服务 发微信服务



API⺴⽹网关



API服务器 活动⻚页⾯面



发邮件服务 发短信服务



管理后台 开发者中⼼心



第55页

单点故障

⼈人脸识别服务



API服务器



⼈人脸识别服务 发微信服务



API⺴⽹网关 API⺴⽹网关



API服务器 活动⻚页⾯面



发邮件服务 发短信服务



管理后台 开发者中⼼心



第56页

调⽤用监控



调⽤用计数



服务健康检查



第57页

负载均衡

⼈人脸识别服务



API服务器



⼈人脸识别服务



API⺴⽹网关



活动⻚页⾯面



发邮件服务 发短信服务



API⺴⽹网关



管理后台 开发者中⼼心



第58页

⼤大流量数据传输通道



API⺴⽹网关



⼈人脸识别服务



数据量太⼤大 开辟新通道



API服务器



第59页

优化服务寻址



⼈人脸识别服务



API⺴⽹网关



⼈人脸识别服务



API服务器



API服务器



第60页

问题这么多 为什么不使⽤用 成熟的现成产品



第61页

我们还处于⼀一个 开荒时代



第62页

clouds



服务发现 ZooKeeper

Etcd Doozer SkyDNS



服务通讯 Redis

RabbitMQ ZeroMQ

Thrift



第63页

var server = clouds.createServer({ connection: controller.createConnection({ host: '127.0.0.1', port: 6480 }), heartbeat: 2

});



第65页

Q&A

https://github.com/leizongmin/clouds



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。