﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xiaomage234-随笔分类-architecture</title><link>http://www.blogjava.net/xiaomage234/category/54660.html</link><description>生命本就是一次凄美的漂流，记忆中放不下的，永远是孩提时代的那一份浪漫与纯真！</description><language>zh-cn</language><lastBuildDate>Mon, 15 May 2017 20:16:46 GMT</lastBuildDate><pubDate>Mon, 15 May 2017 20:16:46 GMT</pubDate><ttl>60</ttl><item><title>IM系统架构设计之浅见【转】</title><link>http://www.blogjava.net/xiaomage234/archive/2017/05/15/432528.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 15 May 2017 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2017/05/15/432528.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/432528.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2017/05/15/432528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/432528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/432528.html</trackback:ping><description><![CDATA[from:http://mobile.51cto.com/hot-439693.htm<br /><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">背景：除去大名鼎鼎的QQ这款即时聊天工具，还有许多细分行业的IM，比如淘宝阿里旺旺、网易泡泡、YY语音......。恰巧公司产品也要开发一款基于我 们自己行业的类IM系统，很有幸我担当了这个产品的架构师，核心代码编写、实现者。下面把我近年来从技术上我对IM系统（即时消息的传输，不包括语音，视频，文件的传输）的理解和设计分享出来，浅薄之见，望大家别见笑，欢迎给出批评意见。</p><h3>一.网络传输协议的选择</h3><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">目前我知晓的所有IM系统传输即时消息无外乎使用UDP、TCP、基于TCP的http这几种协议中的一种或几种。比如QQ主要采用UDP协议，MSN主要采用TCP协议，而且他们也都支持HTTP协议的代理模式。更多资料，请参加这篇文章<a target="_blank" href="http://www.cnblogs.com/maowang1991/p/3572327.html" style="color: #004276;">《一些常用软件的网络端口协议分类介绍》</a>。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">我们该如何选择呢？</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">UDP协议实时性更好，但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题，实现起来过于复杂；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">HTTP协议属于扩展支持，我们在产品的初始阶段可以不用支持；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">那就非TCP协议莫属了，要考虑的同样也有很多，特别是如果有海量用户的需求。如何保证单机服务器高并发量，如何做到灵活，扩展的架构。</p></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">Tips:&nbsp;<a target="_blank" href="http://www.zhihu.com/question/20292749" style="color: #004276;">QQ 为什么采用 UDP 协议，而不采用 TCP 协议实现？</a></p><h3>二.应该选择什么格式的数据协议</h3><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">二进制格式？文本格式？这个话题转到我的这篇文章<a target="_blank" href="http://yaocoder.blog.51cto.com/2668309/995210" style="color: #004276;">《网络传输数据格式的选择》</a>，从我们当前的需求和产品周期上我觉得选择JSON形式的数据协议是最好的。</p><h3>三.架构设计</h3><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">首先我们来提炼一下一个IM系统的主要需求，包括账号，关系链，在线状态显示，消息交互......。</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">架构考量：</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">由于采用可靠传输协议TCP，考虑到负载问题（短连接实现账号、关系链相关业务，长连接实现上线、信息推送）；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">后台架构的灵活性、可扩展性，支持分布式部署&#8212;&#8212;把网络层、业务逻辑层、数据层分离，网络层和业务层支持负载均衡策略、数据层支持分布式存储；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">客户端SDK的易用性：把网络层、数据层分离、业务逻辑层分离；</p></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">后台架构简化图</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;"><a target="_blank" href="http://s9.51cto.com/wyfs02/M02/28/68/wKioL1N5aXTzJmkqAADPN-OmLtU615.png" style="color: #004276;"><img width="480" height="318" border="0" alt="" src="http://s9.51cto.com/wyfs02/M02/28/68/wKioL1N5aXTzJmkqAADPN-OmLtU615.png" style="border: 0px;" /></a></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">架构示意图</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;"><a target="_blank" href="http://s1.51cto.com/wyfs02/M01/28/68/wKiom1N5acHQgPTgAAIdkDkPfvs757.jpg" style="color: #004276;"><img width="480" height="340" border="0" alt="" src="http://s1.51cto.com/wyfs02/M01/28/68/wKiom1N5acHQgPTgAAIdkDkPfvs757.jpg" style="border: 0px;" /></a></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">架构细化图</p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;"><a target="_blank" href="http://s9.51cto.com/wyfs02/M00/28/68/wKioL1N5abSTiTpcAAO7q3GDlNM469.jpg" style="color: #004276;"><img width="480" height="340" border="0" alt="" src="http://s9.51cto.com/wyfs02/M00/28/68/wKioL1N5abSTiTpcAAO7q3GDlNM469.jpg" style="border: 0px;" /></a></p><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">说明</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">从&lt; 架构细化图&gt;中可以看出对于上线服务由于建立的是TCP长连接，对于单台服务器往往由于硬件资源、系统资源、网络资源的限制无法做到海量用户的同时 在线，所以设计为根据服务器负载支持多服务器上线，同时由于多服务器上线造成了对整个系统交互（不同的客户端的交互，协作部门应用服务和客户的交互）的分 割，引入消息转发服务器作为粘合点。另外对于多服务器上线造成的统一账户信息（在线状态，消息）数据的分割，引入统一的数据层（内存存储 层：session、状态信息存储、消息队列存储；数据库：账号信息存储）做到业务和数据的分离，也就做到了支持分布式部署。参见我的这篇文章<a target="_blank" href="http://yaocoder.blog.51cto.com/2668309/1351638" style="color: #004276;">《构建高性能服务的考量》</a></p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">对于部分业务服务：做到网络层、业务层、数据层的完全分离。首先对于TCP短连接来说不会如长连接那般消耗资源，即使后期遇到海量的并发访问请求依然可以从容的通过负载均衡策略和数据分布式部署策略进行解决。参见我的这篇文章<a target="_blank" href="http://yaocoder.blog.51cto.com/2668309/1374280" style="color: #004276;">《服务端架构中的&#8220;网关服务器&#8221;》</a></p></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">服务端平台及技术选型</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">系统开发平台： CentOS&#8212;&#8212;Linux发行版的一种，稳定可靠、可定制优化、支持丰富；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">网络支撑层： libevent&#8212;&#8212;减小开发成本，增强稳定性；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">缓存存储层： Redis&#8212;&#8212;支持丰富的存储结构，支持分布式存储；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">数据库： MySQL&#8212;&#8212;最适合互联网的数据库，免授权、高效稳定、可控性高；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">开发语言： C/C++；</p></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">部分热点问题考量</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">系统性能考量：</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; list-style: none outside none; word-wrap: break-word; word-break: normal;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">编码角度：采用高效的网络模型，线程模型，I/O处理模型，合理的数据库设计和操作语句的优化；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">垂直扩展：通过提高单服务器的硬件资源或者网络资源来提高性能；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">水平扩展：通过合理的架构设计和运维方面的负载均衡策略将负载分担，有效提高性能；后期甚至可以考虑加入数据缓存层，突破IO瓶颈；</p></li></ul></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">系统的高可用性：（防止单点故障）</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; list-style: none outside none; word-wrap: break-word; word-break: normal;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">在架构设计时做到业务处理和数据的分离，从而依赖分布式的部署使得在单点故障时能保证系统可用。</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">对于关键独立节点可以采用双机热备技术进行切换。</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来解决。</p></li></ul></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">主要学习资料： 请自行google。</p><ul style="margin: 0px 0px 0px 35px; padding: 0px; color: #333333; list-style: none outside none; word-wrap: break-word; word-break: normal; font-family: 宋体; background-color: #f8f8f8;"><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">《1.4亿在线背后的故事》；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">《BasicDB的架构演变》；</p></li><li style="margin: 0px; padding: 0px 0px 0px 10px; list-style: none outside none; word-wrap: break-word; word-break: normal; background: url(&quot;http://images.51cto.com/images/art1105/images/list.jpg&quot;) 0px 50% no-repeat;"><p style="margin: 10px 0px; padding: 0px; background-color: transparent; text-indent: 28px;">《微信之道－至简》；</p></li></ul><p style="margin: 10px 0px; padding: 0px; color: #333333; background-color: #f8f8f8; text-indent: 28px; font-family: 宋体;">本文出自51博客 &#8220;<a href="http://yaocoder.blog.51cto.com/" style="color: #004276;">永远的朋友</a>&#8221; ，转载请务必保留此出处<a href="http://yaocoder.blog.51cto.com/2668309/1412029" style="color: #004276;">http://yaocoder.blog.51cto.com/2668309/1412029</a></p><img src ="http://www.blogjava.net/xiaomage234/aggbug/432528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2017-05-15 14:22 <a href="http://www.blogjava.net/xiaomage234/archive/2017/05/15/432528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个完整的微服务系统，应该包含哪些功能？</title><link>http://www.blogjava.net/xiaomage234/archive/2016/08/13/431556.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Sat, 13 Aug 2016 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2016/08/13/431556.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/431556.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2016/08/13/431556.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/431556.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/431556.html</trackback:ping><description><![CDATA[from:http://www.infoq.com/cn/articles/what-complete-micro-service-system-should-include?utm_source=infoq&amp;utm_medium=popular_widget&amp;utm_campaign=popular_content_list&amp;utm_content=homepage<br /><br /><br /><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">近几年，微服务架构迅速在整个技术社区窜红，它被认为是IT软件架构的未来方向，大神Martin Fowler也给微服务极高的评价。那为什么我们需要微服务，微服务的真正优势到底是什么，一个完整的微服务系统，应该包含哪些功能，本文作者刘彦夫在软件设计和开发领域有10多年工作经验，他将会从他的角度给出答案。</p><h2>对微服务的基本理解</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">顾名思义，微服务要从两个方面来理解，一个是&#8220;微&#8221;，一个是&#8220;服务&#8221;。体型小到一定程度才能叫&#8220;微&#8221;，这个程度是什么呢？一个身高1米6，体重90斤的MM，我们说她苗条。微服务也一样，根据亚马逊CEO Bezos给出的有趣定义，单个微服务的设计、开发、测试和运维的所有人加在一起吃饭，只需要两个批萨就够了，这是就是著名的two pizza team rule。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;"><span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">具备什么样的能力才能算是&#8220;服务&#8221;？</span>这个话题很大，我这里按照自己的片面理解总结一下，所谓服务就一定会区别于系统的功能，服务是一个或者一组相对的较小且独立的功能单元，是用户可以感知的功能最小集，比如：购物车，订单，信用卡结算等都可以作为单个服务独立提供。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">这个理解显然不够深刻，为了进一步理解为什么微服务在近两年业界迅速窜红，理解为什么微服务会被认为是IT软件架构的未来方向，<span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">就要理解为什么我们需要微服务？它能给企业带来什么价值。</span>传统企业的IT软件大多都是各种独立系统的堆砌，这些系统的问题总结来说就是扩展性差，可靠性不高，维护成本高。后来有了一个叫SOA的软件架构专门针对这些问题给出了一套解决方案，很多企业也因此将自身IT系统迁移到SOA架构上。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">但是，由于SOA早期均使用了总线模式，这种总线模式是与某种技术栈强绑定的，比如：J2EE。这导致很多企业的遗留系统很难对接，切换时间太长，成本太高，新系统稳定性的收敛也需要一些时间。最终SOA开起来很美，但却成为了企业级奢侈品，中小公司都望而生畏。</p><h2>依然SOA</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">微服务，从本质意义上看，还是SOA架构。但内涵有所不同，微服务并不绑定某种特殊的技术，在一个微服务的系统中，可以有Java编写的服务，也可以有Python编写的服务，他们是靠Restful架构风格统一成一个系统的。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">最粗浅的理解就是将微服务之间的交互看作是各种字符串的传递，各种语言都可以很好的处理字符串，所以微服务本身与具体技术实现无关，扩展性强。另一个不同是微服务架构本身很轻，底层也有类似于SOA的总线，不过非常轻薄，现在看到的就两种方式：MQ和HTTP，而HTTP都不能完全等同于总线，而仅仅是个信息通道。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">所以，基于这种简单的的协议规范，无论是兼容老旧系统，还是上线新业务，都可以随着时代的步伐，滚动升级。比如：你去年还在使用.NET技术，今年就可以平滑的过度到Go了，而且系统已有服务不用改动。所以微服务架构，既保护用户已有投资，又很容易向新技术演进。</p><h2>微服务水下的冰山</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">人月不是银弹，微服务更不是银弹，好像软件微服务化了，软件系统就能够应对各种问题了。其实微服务的水面下藏着巨大的冰山。下面是微服务提供的能力，以及背后需要付出的代价。</p><ol style="margin: 10px 0px 10px 10px; padding: 0px 0px 0px 20px; border: 0px; width: 549px; clear: left; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; line-height: 25.2px; background-color: #ffffff;"><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">单个微服务代码量小，易修改和维护。但是，系统复杂度的总量是不变的，每个服务代码少了，但服务的个数肯定就多了。<span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">就跟拼图游戏一样，切的越碎，越难拼出整幅图。</span>一个系统被拆分成零碎的微服务，最后要集成为一个完整的系统，其复杂度肯定比大块的功能集成要高很多。</p><div style="margin: 0px; border: 0px; height: 0px; clear: both; font-size: 0px;"></div></li><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">单个微服务数据独立，可独立部署和运行。虽然微服务本身是可以独立部署和运行的，但仍然避免不了业务上的你来我往，这就涉及到要对外通信，当微服务的数量达到一定量级的时候，如何提供一个高效的集群通信机制成为一个问题。</p></li><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">单个微服务拥有自己的进程，进程本身就可以动态的启停，为无缝升级的打好了基础，但谁来启动和停止进程，什么时机，选择在哪台设备上做这件事情才是无缝升级的关键。这个能力并不是微服务本身提供的，而是需要背后强大的版本管理和部署能力。</p></li><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">多个相同的微服务可以做负载均衡，提高性能和可靠性。正是因为相同微服务可以有多个不同实例，让服务按需动态伸缩成为可能，在高峰期可以启动更多的相同的微服务实例为更多用户服务，以此提高响应速度。同时这种机制也提供了高可靠性，在某个微服务故障后，其他相同的微服务可以接替其工作，对外表现为某个设备故障后业务不中断。同样的道理，微服务本身是不会去关心系统负载的，那么什么时候应该启动更多的微服务，多个微服务的流量应该如何调度和分发，这背后也有一套复杂的负载监控和均衡的系统在起作用。</p><div id="lowerFullwidthVCR" style="margin: 0px; border: 0px;"></div></li><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">微服务可以独立部署和对外提供服务，微服务的业务上线和下线是动态的，当一个新的微服务上线时，用户是如何访问到这种新的服务？<span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">这就需要有一个统一的入口，新的服务可以动态的注册到这个入口上，用户每次访问时可以从这个入口拿到系统所有服务的访问地址，类似于到餐厅吃饭，新菜要写到&#8220;菜单&#8221;中，以供用户选择</span>。这个统一的系统入口并不是微服务本身的一部分，所以这种能力需要系统单独提供。</p></li><li style="margin: 4px 0px; padding: 0px 0px 0px 10px; border: none; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; line-height: 1.8; clear: none; width: 539px; float: none !important;">还有一些企业级关注的系统问题，比如，安全策略如何集中管理？系统故障如何快速审计和跟踪到具体服务？整个系统状态如何监控？服务之间的依赖关系如何管理？等等这些问题都不是单个微服务考虑的范畴，而需要有一个系统性的考虑和设计，让每个微服务都能够按照系统性的要求和约束提供对应的安全性，可靠性，可维护性的能力。</p></li></ol><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">综上所述，微服务关键其实不仅仅是微服务本身，而是系统要提供一套基础的架构，这种架构使得微服务可以独立的部署、运行、升级，不仅如此，这个系统架构还让微服务与微服务之间在结构上&#8220;松耦合&#8221;，而在功能上则表现为一个统一的整体。这种所谓的&#8220;统一的整体&#8221;表现出来的是统一风格的界面，统一的权限管理，统一的安全策略，统一的上线过程，统一的日志和审计方法，统一的调度方式，统一的访问入口等等。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">这些系统性的功能也需要有一些服务来提供，这些服务不会直接呈现给最终用户，也就是微服务系统冰山下面的部分，我们可以简称它为微服务系统的&#8220;底座&#8221;。所有的微服务都像一个APP，插在这个底座的上面，享受这个底座提供的系统能力比如：元数据存放、灰度发布、蓝绿部署等等。</p><h2>微服务系统底座</h2><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">一个完整的微服务系统，它的底座最少要包含以下功能：</p><ul style="margin: 0px 0px 15px 10px; padding: 0px; border: 0px; clear: left; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; line-height: 25.2px; background-color: #ffffff;"><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">日志和审计，主要是日志的汇总，分类和查询</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">监控和告警，主要是监控每个服务的状态，必要时产生告警</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">消息总线，轻量级的MQ或HTTP</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">注册发现</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">负载均衡</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">部署和升级</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">事件调度机制</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">资源管理，如：底层的虚拟机，物理机和网络管理</p></li></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">以下功能不是最小集的一部分，但也属于底座功能：</p><ul style="margin: 0px 0px 15px 10px; padding: 0px; border: 0px; clear: left; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; line-height: 25.2px; background-color: #ffffff;"><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">认证和鉴权</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">微服务统一代码框架，支持多种编程语言</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">统一服务构建和打包</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">统一服务测试</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">微服务CI/CD流水线</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">服务依赖关系管理</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">统一问题跟踪调试框架，俗称调用链</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">灰度发布</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">蓝绿部署</p></li><h2><ul style="margin: 0px 0px 15px 10px; padding: 0px; border: 0px; clear: left;"></ul>令人困惑的几个问题</h2></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;"><span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">微服务的底座是不是必须的？</span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">是的，基本上是必须的。你可以不用代码实现一个资源管理服务，可以手工用Excel管理你的所有机器资源，但是不代表微服务系统没有这个功能，只不过这个功能是人工实现的。再举个例子，日志系统如果只是简单的打印文件，那么多个微服务的日志就需要手工收集，人工分类和筛选。所以，微服务的底座最小集一定会存在，问题是看怎样实现它。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">这里仅仅是总结了对微服务系统的基本理解，而实现这个架构有很多技术，这里不进行详细展开。实践方面，推荐王磊的《微服务架构与实践》，他描述了使用Ruby相关的技术实现了一整套微服务系统，特别是书中后面的实践部分讲解了如何将已有的系统演化为微服务架构，是很好的参考和指导材料。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;"><span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">是不是所有软件都能做微服务？</span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">这个命题有些微妙，也很难说清楚，回答这个命题本身就是一种挑战，可能最终也没有正确答案。不过，我还是把我自己的理解写在这里，让大家去拍砖。在我这里，答案是否定的。我只需举出一个反例，比如：存储系统，其架构是传统的分层架构，每一层都使用下面一层的服务，并为上一层提供服务。虽然可以将这种架构调整为基于服务的架构，但没办法做成微服务。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">区别在哪里呢？核心的区别在于独立性上，微服务大多是可以独立的运行和使用的，而存储这种非常底层和基础的系统，每层部件都不能单独被使用，比如：Pool管理、CHUNK管理、VOL管理、NFS文件系统，这些功能都无法离开另外一些功能而独立运行，要对外提供可用的存储功能，一大堆功能必须一起上。这种系统做到极致，最多也就能够使其部件可以独立的部署和升级，俗称打热补丁。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">这也就是为什么这种底层传统系统架构通常是单块架构的原因。由于单块架构的各个部分调用关系紧密，做成微服务后系统集成成本会大大增加，不仅如此，这样的架构做成微服务并不能提高交付效率，因为各个部分根本就无法独立的运行和测试。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;"><span style="font-weight: 600; margin: 0px; border: 0px; padding: 0px;">什么样的软件做成微服务？</span></p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">能不能做成微服务，取决于四个要素：</p><ul style="margin: 0px 0px 15px 10px; padding: 0px; border: 0px; clear: left; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; line-height: 25.2px; background-color: #ffffff;"><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">小：微服务体积小，2 pizza团队。</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">独：能够独立的部署和运行。</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">轻：使用轻量级的通信机制和架构。</p></li><li style="margin: 0px 0px 0px 15px; padding: 0px; border: 0px; float: none; clear: none;"><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 1.8; clear: none; width: 585px;">松：为服务之间是松耦合的。</p></li></ul><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">针对于小、轻、松都是可以通过某些技术手段达到目的，而独立的部署和运行，则是和业务本身有关系，如果你这个系统提供的业务是贴近最终用户的，并且这些功能之间的耦合性很小，则微服务就可以按照业务功能本身的独立性来划分，则这类系统做成微服务是非常合适的。如果系统提供的业务是非常底层的，如：操作系统内核、存储系统、网络系统、数据库系统等等，这类系统都偏底层，功能和功能之间有着紧密的配合关系，如果强制拆分为较小的服务单元，会让集成工作量急剧上升，并且这种人为的切割无法带来业务上的真正的隔离，所以无法做到独立部署和运行，也就更加无法做到真正的微服务了。</p><hr style="margin: 0px; border: 0px; padding: 0px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; line-height: 25.2px; background-color: #ffffff;" /><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">感谢<a href="http://www.infoq.com/cn/author/%E9%83%AD%E8%95%BE" style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">郭蕾</a>对本文的审校。</p><p style="margin: 0px 0px 15px; padding: 0px; border: 0px; float: none; line-height: 25.2px; clear: none; width: 610px; font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', 微软雅黑, STHeiti, 'WenQuanYi Micro Hei', SimSun, Helvetica, sans-serif; background-color: #ffffff;">给InfoQ中文站投稿或者参与内容翻译工作，请邮件至<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#100;&#105;&#116;&#111;&#114;&#115;&#64;&#99;&#110;&#46;&#105;&#110;&#102;&#111;&#113;&#46;&#99;&#111;&#109;" style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">editors@cn.infoq.com</a>。也欢迎大家通过新浪微博（<a href="http://www.weibo.com/infoqchina" style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">@InfoQ</a>，<a href="http://weibo.com/u/1451714913" style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">@丁晓昀</a>），微信（微信号：<a href="http://weixin.sogou.com/gzh?openid=oIWsFt0HnZ93MfLi3pW2ggVJFRxY" style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">InfoQChina</a>）关注我们。</p><img src ="http://www.blogjava.net/xiaomage234/aggbug/431556.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2016-08-13 10:53 <a href="http://www.blogjava.net/xiaomage234/archive/2016/08/13/431556.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hydra - 京东开源的基于Dubbo的调用分布跟踪系统</title><link>http://www.blogjava.net/xiaomage234/archive/2015/03/09/423321.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Mon, 09 Mar 2015 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2015/03/09/423321.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/423321.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2015/03/09/423321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/423321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/423321.html</trackback:ping><description><![CDATA[<div id="content" mod-cs-content="" text-content=""  clearfix"="" style="zoom: 1; width: 760px; overflow: visible; line-height: 1.5; margin: 7px 0px 10px; padding: 20px; color: #454545; font-family: Tahoma, Helvetica, Arial, STHeiti; background-color: #ffffff;"><p style="margin: 0px; padding: 0px;">from:&nbsp;<span style="line-height: 1.5;">http://wapapp.baidu.com/tianhuimin/item/6e144c362eced2ff96f88d42</span></p><p style="margin: 0px; padding: 0px;">1&nbsp;概述1.1&nbsp;研发背景</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">支撑互联网应用的各种服务通常都是用复杂大规模分布式集群来实现的。而这些互联网应用又构建在不同的软件模块集上，这些软件模块，有可能是由不同的团队开&nbsp;发、可能使用不同的编程语言来实现、有可能布在了几千台服务器，横跨多个不同的数据中心。因此，就需要一些可以帮助理解系统行为、用于分析性能问题的工&nbsp;具。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">hydra分布式跟踪系统就为了解决以上这些问题而设计的。</p>1.2&nbsp;理论依据<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">Google的论文《Dapper,&nbsp;a&nbsp;Large-Scale&nbsp;Distributed&nbsp;Systems&nbsp;Tracing&nbsp;Infrastructure》是我们设计开发的指导思想(原文和译文地址&nbsp;https://github.com/bigbully/Dapper-translation)。Google针对自己的分布式跟踪系统Dapper&nbsp;在生产环境下运行两年多时间积累的经验，在论文中重点提到了分布式跟踪系统对业务系统的零侵入这个先天优势，并总结了大量的应用场景，还提及它的不足之&nbsp;处。我们通过对这篇论文的深入研究，并参考了Twitter同样依据这篇论文的scala实现Zipkin，结合我们自身的现有架构，我们认为分布式跟踪&nbsp;系统在我们内部是非常适合的，而且也是急需的。</p>1.3&nbsp;功能概述<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">hydra目前的功能并不复杂，他可以接入一些基础组件，然后实现在基础组件上收集在组建上产生的行为的时间消耗，并且提供跟踪查询页面，对跟踪到的数据进行查询和展示。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">我们会在之后的功能介绍中对hydra现有功能进行说明。</p>2&nbsp;领域模型<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">分布式跟踪的领域模型其实已经很成熟，早在1997年IBM就把ARM2.0(Application&nbsp;Response&nbsp;Measurement)作为一个公开的标准提供给了Open&nbsp;Group，无奈当时SOA的架构还未成熟，对业务的跟踪还需要直接嵌入到业务代码中，致使跟踪系统无法顺利推广。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">如今互联网领域大多数后台服务都已经完成了SOA化，所以对业务的跟踪可以直接简化为对服务调用框架的跟踪，所以越来越多的跟踪系统也涌现出来。&nbsp;在hydra系统中，我们使用的领域模型参考了Google的Dapper和Twitter的Zipkin(http://twitter.github.io/zipkin/)。</p>2.1&nbsp;hydra中的跟踪数据模型<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">参考Dapper和Zipkin的设计，hydra也提炼出了自己的领域模型，如图所示:</p><img width="640" height="398" src="http://g.hiphotos.baidu.com/album/pic/item/314e251f95cad1c88959439b7e3e6709c83d51af.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Trace:一次服务调用追踪链路。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Span:追踪服务调基本结构，多span形成树形结构组合成一次Trace追踪记录。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Annotation:在span中的标注点，记录整个span时间段内发生的事件。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">BinaryAnnotation:属于Annotation一种类型和普通Annotation区别，这键值对形式标注在span中发生的事件，和一些其他相关的信息。</p></li></ul><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">Annotation在整个跟踪数据模型中最灵活的，灵活运用annotation基本能表达你所想到的跟踪场景。在hydra中(参考了zipkin)定义4种不同value的annotation用来表达记录span&nbsp;4个最基本的事件。通过这4个annotation能计算出链路中业务消耗和网络消耗时间。</p>2.2&nbsp;dubbo服务调用框架的模型<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">公司内部，尤其是我们部门有很多业务系统使用dubbo作为服务调用框，所以我们的分布式跟踪系统第一个接入组件就是dubbo。&nbsp;另一个原因也是因为我们团队对dubbo有着非常深入的理解，加之dubbo本身的架构本身十分适合扩展，作为服务调用框架而言，跟踪的效果会非常明显，&nbsp;比如Twitter的Zipkin也是植入到内部的Finagle服务调用框架上来进行跟踪的。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">由于现阶段hydra主要接入了dubbo服务调用框架,所以在这必须了解dubbo的几个模型，如下图所示:</p><img width="640" height="348" src="http://b.hiphotos.baidu.com/album/pic/item/b21bb051f8198618b79550384bed2e738ad4e6b8.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Application:一类业务类型的服务，下面可能包含多个接口服务，可能出现多种类型业务跟踪链路。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">InterfaceService:接口服务，一个服务接口提供多种业务处理方法。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Method:接口服务中具体处理业务的方法。</p></li></ul>2.3&nbsp;Hydra中跟踪模型和dubbo模型之间关系<img width="800" height="518" src="http://c.hiphotos.baidu.com/album/pic/item/38dbb6fd5266d0165be12194962bd40734fa3595.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">如图所示的应用场景对A服务的调用。A服务在被调用的过程中会继续调用服务B和服务C,而服务C被调用之后又会继续调用服务D和服&nbsp;务E。在我们的领域模型中，服务A被调用到调用完成的过程，就是一次trace。而每一个服务被调用并返回的过程（一去一回的箭头）为一个span。可以&nbsp;看到这个示例中包含5个span，client-A，A-B，A-C，C-D，C-E。span本身以树形结构展开，A-C是C-D和C-E的父&nbsp;span，而client-A是整个树形结构的root&nbsp;span。之后要提到的一个概念就是annotation，annotation代表在服务调用过程中发生的一些我们感兴趣的事情，如图所示C-E上标出&nbsp;来的那四个点，就是四个annotation，来记录事件时间戳，分别是C服务的cs（client&nbsp;send），E服务的ss（server&nbsp;receive）,E服务的ss（server&nbsp;send）,&nbsp;C服务的cr（client&nbsp;receive）。如果有一些自定义的annotation我们会把它作为BinaryAnnotation，其实就是一个k-v对，记录任何跟踪系统想&nbsp;记录的信息，比如服务调用中的异常信息，重要的业务信息等等。</p>3&nbsp;功能介绍<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">当前hydra1.0版的功能主要分为两个部分，跟踪查询和跟踪展示。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">如图所示为查询页面：</p><img width="640" height="311" src="http://h.hiphotos.baidu.com/album/pic/item/d53f8794a4c27d1e95c484781ad5ad6edcc438af.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">在hydra针对业务提出两个相关的概念：应用和服务。不同的业务的所属不同的应用(相当于dubbo中的Application)，服务（相当于dubbo中的interface）挂在应用之下。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">在hydra的查询界面中首先要选择想要关注的应用名，然后通过自动完成的方式输入应用下的服务。选择服务的开始时间和需要查看的跟踪次数。另外hydra需要确定返回数据的总量，防止查询出大数据量导致页面失去响应。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">另外我们提供对额外的筛选条件：调用响应时间、是否发生异常。调用响应时间指的是这一次服务调用从调用开始到调用结束的时间，是否发生异常则包括一次服务调用中所有历经的服务抛出的异常都会捕获到。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">对于查询之后的数据，hydra提供在前台进行排序的功能。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">对于每一次跟踪，我们可以进一步展示他的服务调用层级与响应时间的时序图。如下图所示：</p><img width="800" height="347" src="http://g.hiphotos.baidu.com/album/pic/item/738b4710b912c8fcfd114971fd039245d78821af.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">我们参考Dapper中论述的场景，在时序图中用绿色代表服务调用时间，浅蓝色代表网络耗时，另外如果服务调用抛出异常被&nbsp;hydra捕捉到的话，会用红色表示。鼠标移动到时序图中的每一个对象上，会Tip展现详细信息，包括服务名、方法名、调用时长、Endpoint、异常&nbsp;信息等。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">左侧的树形结构图可以收起和展开，同时右侧的时序图产生联动，利于调整关注点在不同的服务上。</p>4&nbsp;整体架构4.1&nbsp;完整版<img width="640" height="445" src="http://g.hiphotos.baidu.com/album/pic/item/ac6eddc451da81cb77043c715366d016082431af.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">对于分布式跟踪系统而言，必须对接入的基础组件进行改造，我们对dubbo的改造很简单，只是在过滤器链上增加一个过滤器，我们将其封装成一个hydra-dubbo的jar包，由dubbo直接依赖。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">所有跟踪所需的通用性的API我们封装在hydra-client中，遍于接入各种组件。&nbsp;hydra-manager用来完成每个服务的注册、采样率的调成、发送seed生成全局唯一的traceId等通用性的功能。所有hydra-manager数据统一用mysql进行存储。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">我们使用hydra-collector和hydra-collector-service进行跟踪数据的异步存储，中间使用metaQ进行缓冲。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">hydra-manager和hydra-collector使用dobbo提供服务。</p>4.2&nbsp;精简版<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">考虑到数据量不大的情况，以及部署的复杂度。我们提供了两种更简便的架构</p><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">如果考虑到数据量没有那么大，可以不使用hbase，用mysql代替，即精简版1。因为毕竟hadoop集群和hbase集群的部署和维护工作量很大。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">如果并发量也不是很大的话，可以不使用消息中间件，也就是精简版2，如图所示。在hydra-collector端直接进行数据落地，当然仍然是异步的。</p></li></ul><img width="596" height="464" src="http://c.hiphotos.baidu.com/album/pic/item/c2cec3fdfc03924594575eb38694a4c27c1e25af.jpg" alt="Hydra - 京东开源的基于Dubbo的调用分布跟踪系统" style="border: 0px; margin-bottom: 8px; clear: both; max-width: 758px; vertical-align: top;" /><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">在使用mysql进行存储的时候我们并未进行分库分表，因为考虑到存储的是监控数据，时效性较高，而长期的监控数据的保留意义并不大。所以我们在主表上有明确的时间戳字段，使用者可以自行决定何时对保存的历史数据进行迁移。</p>5&nbsp;Quick&nbsp;Start5.1&nbsp;部署简介<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">Hydra分布式跟踪系统可以跟踪环境的数据量大小选择上文所述的三种部署方式</p><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">高并发，大数据量：hydra-client&nbsp;|&nbsp;Queue&nbsp;|&nbsp;hbase</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">高并发，小数据量：hydra-client&nbsp;|&nbsp;Queue&nbsp;|&nbsp;mysql</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">低并发，小数据量：hydra-client&nbsp;|&nbsp;mysql</p></li></ul><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">因为是quick&nbsp;start，这里只介绍低并发和小数据量的情况。不过这里会详细介绍如何通过配置文件的修改来切换这三种部署方式。</p>5.2&nbsp;硬件要求<ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1或多台业务系统集群机</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1套zookeeper单点或集群机</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1台机器部署Hydra-manager</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1或多台机器部署Hydra-Collector</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1台机器部署Hydra-web</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">1台数据库服务器</p></li></ul>5.3&nbsp;软件要求<ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Dubbo:Hydra是基于alibaba的dubbo框架基准上做的服务跟踪系统，理论上原有的Dubbo框架服务群中所有应用不需要额外的配置，皆可以平滑的接入Hydra系统。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Zookeeper:各个服务点依赖于zookeeper来读取Hydra-manager和Hydra-collector获取数据交互路由点，来完成跟踪数据的推送和跟踪的控制。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Mysql:跟踪数据的持久化存储。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">Tomcat:前端web应用容器</p></li></ul>5.4&nbsp;源码获取<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">可以暂时使用master，后续版本会归并到dubbo管理端</p>5.5&nbsp;项目构建打包<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">maven项目不用多说。mvn&nbsp;clean&nbsp;install。不过不得不说的是，hydra项目中包含一些涉及数据库读写的单元测试(mysql，hbase），配置文件分别在:</p><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">modules/hydra-manager-db/src/test/resources/mysql.properties</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">modules/hydra-store/hydra-mysql/src/test/resources/mysql.properties</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">modules/hydra-store/hydra-hbase/src/test/resources/hbase-site.xml</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">modules/hydra-store/hydra-hbase/src/test/resources/hydra-hbase-test.xml</p></li></ul><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">mysql需要创建测试用数据库和测试用表，hbase需要创建测试用表</p><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">docs/table-hbase/initTable<br />(hbase建表时可以根据hbase集群的具体情况调整域分区，涉及到table-mysql中对TB_PARA_SERVICE_ID_GEN初始化数据的设计)</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">docs/table-mysql</p></li></ul><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">当然对于不需要使用hbase的同学也可以自行移除modules/hydar-store/hydra-hbase。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">当然用maven构建跳过测试也是可以的。使用mvn&nbsp;clean&nbsp;install&nbsp;-Dmaven.test.skip=true</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">需要打包的子项目会通过maven:assemblly插件打成tar.gz包在各自的target目录下。</p>5.6&nbsp;安装部署5.6.1&nbsp;Hydra-client<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">hydra-client中包含hydra与dubbo的集成，以及hydra跟踪收集的相关功能。如果需要进行dubbo服务的跟踪，只需要把这个jar包放在dubbo服务的classpath下，就会<span style="color: aqua;">自动开启跟踪功能！</span></p>5.6.2&nbsp;Hydra-manager<ol style="margin: 5px 2px 5px 50px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署：scp&nbsp;-r&nbsp;target/*.tar.gz&nbsp;username@ip:dirname</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">配置：cd&nbsp;basedir/conf&nbsp;（需要修改配置）</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">启动：cd&nbsp;basedir/bin<br />sh&nbsp;manager.sh&nbsp;start</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">停止：cd&nbsp;basedir/bin<br />sh&nbsp;manager.sh&nbsp;stop</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">输入：cd&nbsp;basedir/log<br />tail&nbsp;-f&nbsp;manager.log</p></li></ol>5.6.3&nbsp;Hydra-collector<ol style="margin: 5px 2px 5px 50px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署：scp&nbsp;-r&nbsp;target/*.tar.gz&nbsp;username@ip:dirname</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">配置：cd&nbsp;basedir/conf&nbsp;（需要修改配置）</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">启动：cd&nbsp;basedir/bin<br />sh&nbsp;collector-mysql.sh&nbsp;start&nbsp;<br />(这里注意一下，如果在hydra-collector中需要发送到Queue中，则需要启动collector.sh,jar包会加载不同的配置文件。)</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">停止：cd&nbsp;basedir/bin<br />sh&nbsp;collector-mysql.sh&nbsp;stop</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">输入：cd&nbsp;basedir/log<br />tail&nbsp;-f&nbsp;*.log</p></li></ol>5.6.4&nbsp;Hydra-web<ol style="margin: 5px 2px 5px 50px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">需要在web.xml中修改引入的配置文件为hydra-mysql.xml，注掉hydra-hbase.xml</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署：scp&nbsp;-r&nbsp;target/*.war&nbsp;username@ip:$TOMCAT_WEBAPPS</p></li></ol>6&nbsp;模拟场景6.1&nbsp;场景描述<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">我们模拟了两个测试场景，均是基于dubbo服务调用</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">场景exp1:</p><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; font-size: 12px; font-family: tahoma, helvetica, arial;">A&nbsp;--&gt;&nbsp;B&nbsp;--&gt;&nbsp;C &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</pre><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">即服务A调用服务B,服务B调用服务C。测试用例在modules/hydra-example/hydra-exmple-exp1/。熟悉dubbo的同学一定不会陌生。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">场景exp2:</p><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; font-size: 12px; font-family: tahoma, helvetica, arial;">A&nbsp;--&gt;&nbsp;B&nbsp;--&gt;&nbsp;C1&nbsp;--&gt;&nbsp;E &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;C2&nbsp;--&gt;&nbsp;D1&nbsp;--&gt;&nbsp;C1&nbsp;--&gt;&nbsp;E &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;&nbsp;D2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</pre><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">场景2很复杂，基本涵盖了对同步调用跟踪的大多数可能遇到的场景。测试用例在modules/hydra-example/hydra-exmple-exp2/。</p>6.2&nbsp;模拟场景dubbo服务的部署<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">Hydra默认使用了hydra-exmple中的两个应用场景来做，你可以在hydra-test/hydra-test-integration打包中获得应用场景。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">获得tar.gz包或者zip包后，将服务分布式部署到不同的机器上，以模拟应用场景,一下介绍场景一的部署方法，场景二的部署方法类似。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">hydra-test-intergration&nbsp;分为windows版和linux版(默认)，见如下打包方法。</p><ul style="margin: 0px 2px 0px 45px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">打包：linux:&nbsp;mvn&nbsp;package&nbsp;-Pruntime-env-linux<br />window:&nbsp;mvn&nbsp;package&nbsp;-Pruntime-env-windows</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署:&nbsp;scp&nbsp;-r&nbsp;target/*.tar.gz&nbsp;username@ip:dirname</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">配置:&nbsp;cd&nbsp;basedir/conf<br />修改&nbsp;*exp1.properties</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">启动：&nbsp;cd&nbsp;basedir/bin<br />cd&nbsp;exp1<br />sh&nbsp;startA.sh<br />cd&nbsp;..<br />sh&nbsp;startTrigger-exp1.sh&nbsp;start</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">停止:&nbsp;cd&nbsp;basedir/bin<br />sh&nbsp;startTrigger-exp1.sh&nbsp;stop<br />All.sh&nbsp;stop</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">输出:&nbsp;cd&nbsp;basedir/log<br />tail&nbsp;-f&nbsp;*.log</p></li></ul>6.3&nbsp;部署举例<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">以下演示安装样例：</p><ol style="margin: 5px 2px 5px 50px; padding: 0px; list-style: none; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;"><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署zookeeper单点或集群环境，以保证获得最佳SOA，zookeeper的部署请参照官方文档。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署实验场景exp1，只需要部署hydra-test-integration模块打包的tar.gz包，拷贝三份分布式部署。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署一个触发器Trigger，以激活服务的调用。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署一个Manager，以管理各个跟踪点的跟踪上下文。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署一个或者多个Collector消费机集群，以搜集来自Hydra-client推送过来的跟踪数据。</p></li><li style="margin: 0px; padding: 0px;"><p style="margin: 0px; padding: 0px;">部署一个web应用，已提供给前端展现应用系统服务上下文。</p></li></ol><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">exp1场景说明：</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">有三个服务应用A、B、C和一个触发RPC调用的应用Trigger，服务调用关系为A-B-C，&nbsp;每隔500s触发一个调用，持续时间为1天。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">部署地址举例：</p>角色ipportZK192.168.200.110-1122181~A192.168.200.11020990B192.168.200.11120991C192.168.200.11220992Trigger192.168.200.113-Manager192.168.228.8120890Collector192.168.228.81-8220889Web192.168.228.818080MySql-DB192.168.228.8133067&nbsp;测试相关7.1&nbsp;测试说明<p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">本测试针对Hydra-Client模块进行功能测试和压力测试，以便在Hydra开发的过程中及时发现重要bug和帮助优化Hydra系统性能。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">本测试目前只针对Hydra-client的测试，重点关注业务系统接入Hydra和不接入Hydra前后性能影响，以保证Hydra系统接入端的低侵入性和稳定性。</p><p style="margin: 10px 0px; padding: 0px; font-family: arial, sans-serif, verdana, helvetica; color: #404040; line-height: 25px; background-color: #fafafa;">针对Hydra-Client的测试，在部署上，只用部署应用场景（带Hydra_client）和Benchmark触发点，然后在应用Benchmark和应用场景上埋点分析Hydra性能。<br /></p><p style="margin: 0px; padding: 0px;"><br /></p><p style="margin: 0px; padding: 0px;">资料来源：<a href="http://www.open-open.com/lib/view/open1370253915148.html" target="_blank" style="color: #4bc1c1;">http://www.open-open.com/lib/view/open1370253915148.html</a></p><div></div></div><img src ="http://www.blogjava.net/xiaomage234/aggbug/423321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2015-03-09 16:06 <a href="http://www.blogjava.net/xiaomage234/archive/2015/03/09/423321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EDA 和 SOA 的融合以及实践 在金融行业的应用</title><link>http://www.blogjava.net/xiaomage234/archive/2014/12/30/421947.html</link><dc:creator>小马歌</dc:creator><author>小马歌</author><pubDate>Tue, 30 Dec 2014 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/xiaomage234/archive/2014/12/30/421947.html</guid><wfw:comment>http://www.blogjava.net/xiaomage234/comments/421947.html</wfw:comment><comments>http://www.blogjava.net/xiaomage234/archive/2014/12/30/421947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaomage234/comments/commentRss/421947.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaomage234/services/trackbacks/421947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在金融行业的应用王 和全, 架构师简介：&nbsp;EDA 与 SOA 的融合已经成为一种趋势和务实的选择，但如何拨云见日，了解其中本质的思想？这正是本文想和你一起探讨的。发布日期：&nbsp;2010 年 10 月 28 日&nbsp;级别：&nbsp;初级&nbsp;访问情况 ：&nbsp;5393 次浏览&nbsp;评论：&nbsp;1&nbsp;(查看&nbsp;|&nbsp;添加评论&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiaomage234/archive/2014/12/30/421947.html'>阅读全文</a><img src ="http://www.blogjava.net/xiaomage234/aggbug/421947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaomage234/" target="_blank">小马歌</a> 2014-12-30 10:41 <a href="http://www.blogjava.net/xiaomage234/archive/2014/12/30/421947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>