第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