微服务架构下的服务通讯


微服务架构下的服务通讯 ⽼雷 leizongmin ucdok.com 我们是 初创团队 团队⼈员 紧凑 产品快速 迭代 应付未来可能的系统 压⼒ ⼀登后台架构的演变 单进程 SDK ⼈脸识别模块 API服务器 多进程 SDK ⼈脸识别模块 API服务器 ⼈脸识别模块 API服务器 Nginx 独⽴出⼈脸识别服务 SDK ⼈脸识别服务 ⼈脸识别服务 API服务器 ⼈脸识别服务 ⼈脸识别服务 更多服务 SDK ⼈脸识别服务 ⼈脸识别服务 API服务器 ⼈脸识别服务 ⼈脸识别服务 发短信服务 发邮件服务 更多应⽤ SDK ⼈脸识别服务 ⼈脸识别服务 API服务器 ⼈脸识别服务 ⼈脸识别服务 发短信服务 发邮件服务 管理后台 开发者中⼼ 活动⻚⾯ 微服务 每个服务⼩⽽简单 微服务 可使⽤不同的语⾔开发 每个服务⼩⽽简单 微服务 可使⽤不同的语⾔开发 运⾏在 独⽴的进程中 每个服务⼩⽽简单 微服务 可使⽤不同的语⾔开发 运⾏在 独⽴的进程中 松耦合,独⽴部署 每个服务⼩⽽简单 搞⼀个 这样的东⻄ 会不会 很⿇烦 团队⼈员 紧凑 产品快速 迭代 应付未来可能的 系统 压⼒ 其实就是 远程调⽤ 服务注册 服务注册中⼼ ⼈脸识别服务 API服务器 注册可提供的服务 查询可提供某个服务 的服务器1 2 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 接收调⽤请求 发送调⽤请求12 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 返回处理结果 接收处理结果1 2 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 接收调⽤请求 发送调⽤请求 发邮件服务 1 2 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 返回处理结果 接收处理结果 发邮件服务 1 2 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 发邮件服务 发短信服务 API服务器 总线式服务通讯 消息队列 /⺴关 ⼈脸识别服务 API服务器 发邮件服务 发短信服务 API服务器 集中式管理 ⽅便监控 中⼼节点⼒⼤ 点对点式服务通讯 ⼈脸识别服务 API服务器 发送调⽤请求 返回处理结果 1 2 点对点式服务通讯 ⼈脸识别服务 API服务器 发送调⽤请求 返回处理结果 发邮件服务 1 2 点对点式服务通讯 ⼈脸识别服务 API服务器 发邮件服务 发短信服务 API服务器 API服务器 点对点式服务通讯 ⼈脸识别服务 API服务器 发邮件服务 发短信服务 API服务器 API服务器 配置复杂 代码演⽰ 初始化 var server = clouds.createServer({ redis: { host: '127.0.0.1', port: 6379, db: 1 }, heartbeat: 2 }); var client = clouds.createClient({ redis: { host: '127.0.0.1', port: 6379, db: 1 }, timeout: 2 }); 注册服务 server.register('hello', function (name, callback) { callback(null, 'hello, ' + name); }); server.register('say', function (name, msg, callback) { callback(null, msg + ', ' + name); }); 调⽤服务 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); 实现原理 A Redis服务器 ⼈脸识别服务 API服务器 SETEX S:method:id 0 ttl 注册服务 KEYS S:method:* 查找可⽤服务器1 2 注册服务 Redis服务器 ⼈脸识别服务 API服务器 SETEX S:method:id 0 ttl 注册服务 KEYS S:method:* 查找可⽤服务器 服务提供者掉线后 S:method:id⾃动失效3 1 2 服务通讯 Redis服务器 ⼈脸识别服务 API服务器 SUBSCRIBE L:id1 SUBSCRIBE L:id21 2 服务通讯 Redis服务器 ⼈脸识别服务 API服务器 PUBLISH L:id1 xxxxon message: xxxx2 1 调⽤服务 Redis服务器 ⼈脸识别服务 API服务器 KEYS S:method:* 获取可⽤服务器列表 随机选择⼀个服务器 1 2 调⽤服务 Redis服务器 ⼈脸识别服务 API服务器 PUBLISH L:server_id 发送调⽤请求每个请求带上 唯⼀ msg_id on message 接收到调⽤请求 1 2 调⽤服务 Redis服务器 ⼈脸识别服务 API服务器 PUBLISH L:client_id 返回处理结果,带上 msg_id on message 接收到处理结果 执⾏ callback 1 2 3 失败处理 Redis服务器 ⼈脸识别服务 API服务器 调⽤请求超过指定时间 没返回结果 选择另⼀台可⽤服务器 重新发送调⽤请求 1 2 优点 只需配置 Redis连接即可,⽆其他依赖 优点 只需配置 Redis连接即可,⽆其他依赖 服务提供者可动态加⼊ 优点 只需配置 Redis连接即可,⽆其他依赖 服务提供者可动态加⼊ 借助 Redis在其他语⾔的客户端实现跨语⾔ 优点 只需配置 Redis连接即可,⽆其他依赖 服务提供者可动态加⼊ 借助 Redis在其他语⾔的客户端实现跨语⾔ 数据使⽤ JSON格式 ,灵活 优点 只需配置 Redis连接即可,⽆其他依赖 服务提供者可动态加⼊ 借助 Redis在其他语⾔的客户端实现跨语⾔ 数据使⽤ JSON格式 ,灵活 借助 Redis3.0的集群解决 压⼒问题 性能怎样 性能测试 平均完成⼀次请求耗时( ms ) 1ms 2ms 3ms 4ms 5ms 6ms 100并发 1000并发 10000并发 clouds (redis) clouds (clouds-controller) eureca.io dnode amqp-rpc 100并 发 1000 并发 10000 并发 clouds 54 314 2948 clouds- controller 79 222 1780 eurec a.io 70 351 3364 dnode 84 1203 50466 amqp- rpc 126 669 7205 未来的改进 单点故障 API⺴关发微信服务 发邮件服务 ⼈脸识别服务 活动⻚⾯ 管理后台 API服务器 发短信服务 ⼈脸识别服务 API服务器 开发者中⼼ 单点故障 API⺴关发微信服务 发邮件服务 ⼈脸识别服务 活动⻚⾯ 管理后台 API服务器 发短信服务 ⼈脸识别服务 API服务器 开发者中⼼ API⺴关 调⽤监控 调⽤计数 服务健康检查 负载均衡 发邮件服务 ⼈脸识别服务 管理后台 活动⻚⾯ 发短信服务 ⼈脸识别服务 API服务器 开发者中⼼ API⺴关 API⺴关 ⼤流量数据传输通道 ⼈脸识别服务 API服务器 API⺴关 数据量太⼤ 开辟新通道 优化服务寻址 ⼈脸识别服务 API服务器 API⺴关 ⼈脸识别服务 API服务器 问题这么多 为什么 不使⽤ 成熟的现成产品 我们还处于⼀个 开荒时代 服务通讯 ZooKeeper Redis RabbitMQ ZeroMQ Thrift Etcd Doozer SkyDNS 服务发现 clouds var server = clouds.createServer({ connection: controller.createConnection({ host: '127.0.0.1', port: 6480 }), heartbeat: 2 }); Q & A https://github.com/leizongmin/clouds
还剩64页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

ggger

贡献于2015-08-03

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf