array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 微服务-浅谈 - 爱码网
单体架构的优势:

 便于开发:只需要借助IDE的开,调试功能即可完成
 易于测试:只需要通过单元测试或浏览器即完成测试 
 易于部署:打包成单一可执于jar/war包,执jar/war包即可部署


单体架构的不足:
 
    复杂性高
        代码难以理解,各个模块逻辑复杂。
        难以理解导致代码质量低,复杂性进一步增加
            代码难以被修改和重构
        内存泄露可能导致整个应用的崩塌(微服务可避免)
        
       交付效率低:
        构建和部署耗时长,难以定位问题,开发效率低
        代码复杂和变更影响难以理解,需要数天完成全量测试
        全量部署耗时长,影响范围广,风险大,发布步频次低
        不能独立布署,用户体验差
        
    
    伸缩性(横向扩展)差:
        单体只能按整体横向扩展,无法分模块垂直扩展
        IO密集型模块和CPU密集模块无法独立升级和扩容
    
    可靠性差:
        一个bug有可能引整个应用的崩溃。
        难以定位问题
    阻碍技术创新:
        受技术栈限制,团队成员使用同一框架和语言,很难扩展
        升级和变更技术框架变得困难,牵一发动全身。
        尝试新语言变得困难(太重),新需求,重构导致开发成本高。

微服务架构
    将单体应用拆分为多个高内聚低耦合的小型服务
每个小服务运动在独立进程,由不同的团队开发和维护,
服务间采用轻量级通信机制,独立自动部署,可以采不同的语言及存储。(不影响进度,各司其职)


优势:
    易于开发和维护,
    微服务相对单体应用体量更小,易于理解。
    启动调试时间短,开发周期短。交付时间短。

    独立部署:
        不同的服务,并行迭代。(同时进行)不同于单体应用。从上至下,从1到2.
        一个微服务的修改不需要协调其它服务。相对于单体应用往往存在,改一处多处报错(整个系统故障)。互不影响
        单体应用往往会有改一处BUG引发多处BUG,高耦合,依赖性强。
        相比微服务单体调试周期长,部署时间长,连锁反应大。
        
    伸缩性强:
        每个服务都可以在横向和纵向上扩展(单体受垂直(纵向)影响)
        每个服务都可以按硬件资源的需求进行独立扩容或升级。延伸
    
    与组织结构相匹配:
        微服务架构可以更好将架构和组织相匹配(根椐不同的模块化分给不同的团队);
        每个团队独立负责哪些服务(模块),获得更高的效率(生产力)    

    技术异构性:
        使用最适合该服务的技术(跨语言实现),提供接口即可(服务者,消费者)
        降低尝试新技术的成本(尝试新语言更容易)不受架构的影响
        根椐不同的服务实现方式采用不同的技术栈
        容错性高


微服务之间通信技术:
    1.rcp
    2.restful
   3.异步
服务拆分:
    微服务拆分原则:领域模型,组织架构,康威定律,单一职责
    微服务拥有独立的数据库,技术栈。
    微服务之间确定服务边界, 高内聚,低耦合。

微服务面临的问题
    
    数据一致性(多服务,多事务)
        可靠性事件模式    
        补偿模式-sagas模式
    
    服务通信
        通信方案:
            同步机制(http协议):RPC vs REST
                跨语言,学习成本低,易上手
            异步机制(通常基于TCP):AMQP(异步消息)
                不方便测试 ,调试。
    服务注册和发现:
        注册中心:
            Eureka,ZK.Consul 等等三方框架
    负载均衡
        nginx ,ribbon

    服务网关(服务通信)
        API Gateway(聚合作用,应避免业务代码)
             身份认证,路由服务,安全过滤,流量控制,日志统计        
    高可观察
        健康检测,集中监控,聚合输出
        日志聚合及检索(脚手架)
        分布式追踪(定位问题,优化),服务故障
    可靠性
        流量控制,超时控制。保证下游服务正常
        舱避隔离,熔断机制(服务出错,调用次数过多)关闭服务调用功能
                请求转移,
        服务降级,幂等重试
            服务降级策略,(网络问题),服务重试。
            接口幂等性。
            
    

 

相关文章: