Dubbo服务治理了看法

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlzaGVoZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前。我们能够採用的是RMI或Hessian等工具。暴露和引用远程服务,通过配置URL地址和JNDI地址进行调用,使用Apache httpd复杂均衡插件或F5server进行负载均衡

存在下面问题和怎样解决呢?

       当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

此时须要一个服务注冊中心。动态的注冊和发现服务,使服务的位置透明。

并通过在消费方获取服务提供方地址列表。实现软负载均衡和Failover。降低对F5硬件负载均衡器的依赖,也能降低部分成本。

        当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描写叙述应用的架构关系。

这时。须要自己主动画出应用间的依赖关系图,以帮助架构师理清理关系。


       接着。服务的调用量越来越大,服务的容量问题就暴露出来。这个服务须要多少机器支撑?什么时候该加机器?

为了解决这些问题,第一步,要将服务如今每天的调用量。响应时间。都统计出来,作为容量规划的參考指标。

其次,要能够动态调整权重。在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的訪问量,再以此訪问量乘以机器数反推总容量。


        规模继续扩大,应用之间不再是扁平的相应关系,開始分层,比方核心数据层,业务集成层等,就算没有出现循环依赖。也不同意从低层向高层依赖,以免兴许被逼循环依赖。

这时。须要在注冊中心定义架构体系。列明有哪些层的定义,每一个服务暴露或引用时,都必须声明自己应用属于哪一层。这样注冊中心能更快的发现架构的腐化现象。


        服务多了。沟通成本也開始上升,调某个服务失败该找谁?服务的參数都有什么约定?

这时就须要登记每一个服务都是谁负责的。并建立一个服务的文档库,方便检索。

 

      慢慢一些敏感数据也都服务化了。安全问题開始变得重要。谁能调该服务?怎样授权?

这种服务可能须要一个password。訪问时需带着此password,但假设用password,要改password时,就会非常不方便。全部的消费方都要改,所以动态生成令牌(Token)可能会更好,提供方将令牌告之注冊中心,由注冊中心决定是否告之消费方。这样就能在注冊中心页面上做复杂的授权模型。


        就算是不敏感的服务。也不是能随意调用。比方某服务突然多了一个消费者,这个消费者的请求量直接把服务给拖跨了,其他消费者跟着一起故障。

首先服务提供方须要流控,当流程超标时。能拒绝部分请求,进行自我保护。

其次,消费者上线前和提供者约定《服务质量等级协定(SLA)》。SLA包含消费者承诺每天调用量,请求数据量,提供方承诺响应时间,出错率等,将SLA记录在监控中心,定时与监控数据对照,超标则报警。


     尽管有SLA约定,假设不能控制。就仅仅是君子协定,怎样确保服务质量?

比方:一个应用非常重要,一个不那么重要,它们调用同一个服务,这个服务就应该向重要应用倾斜,而不是一视同仁,当支撑不住时。应限制不重要应用的訪问。保障重要应用的可用,怎样做到这一点呢。这时。就须要服务路由,控制不同应用訪问不同机器,比方:

应用分离:consumer.application = foo => provider.host = 1,2,3consumer.application != foo => provider.host = 5,6读写分离:method.name = find*,get* => provider.host = 1,2,3method.name != find*,get* => provider.host = 5,6

  

         服务上线后,须要验证服务是否可用。但因防火墙的限制。线下是不能訪问线上服务的,不得不先写好一个測试Main,然后放到线上去执行,非常麻烦,而且容易忘记验证。

所以线上须要有一个自己主动执行的验证程序,用户仅仅需在界面上填上要验证的服务方法。以及參数值和期望的返回值。当有一个服务提供者上线时,将自己主动执行该用例,并将执行结果发邮件通知负责人。


        服务应用和Web应用是有差别的,它是一个后台Daemon程序,不须要Tomcat之类的Web容器。但因公司之前以Web应用为主,规范都是按Web应用的,所以不得不把服务跑在一个根本用不上的Web容器里,而搭一个这种Webproject也非常费事。

所以须要实现一个非Web的容器。仅仅需简单的Main载入Spring配置就可以,并提供Maven模板project,仅仅需mvn dubbo:generate 就可以创建一个五脏俱全的服务应用。


      开发服务的人越来越多,更注重开发效率,IDE的集成支持不可缺少。

通过插件,能够在Eclipse中直接执行服务,提供方能够直接填入測试数据測试服务。消费方能够直接Mock服务不依赖提供方开发。


        由于暴露服务非常easy,服务的上线越来越随意。有时候负责服务化的架构师都不知道有人上线了某个服务,使得线上服务鱼龙混杂,甚至出现反复的服务,而服务下线比上线还困难。

须要一个新服务上线审批流程,必须经过服务化的架构师审批过了,才干够上线。而服务下线时,应先标识为过时。然后通知调用方尽快改动调用,直到没有人调此服务。才干下线。


         因服务接口设计的经验一直在慢慢的积累过程中,非常多接口并不能一促而蹴。在改动的过程中,怎样保证兼容性。怎么推断是否兼容?另外,更深层次的,业务行为兼容吗?

能够依据使用的协议类型。分析接口及领域模型的变更是否兼容,比方:对照加减字段,方法签名等。

而业务上。可能须要基于自己主动回归測试用例,形成Technology Compatibility Kit (TCK),确保兼容升级。


        随着服务的不停升级。总有些意想不到的事发生,比方cache写错了导致内存溢出,故障不可避免,每次核心服务一挂。影响一大片,人心慌慌,怎样控制故障的影响面?服务能否够功能降级?或者资源劣化?

应用间声明依赖强度。哪些功能强依赖,哪些弱依赖,然后基于依赖强度,计算出影响面,并定期測试复查。加强关键路径上的服务的优化和容错,清理不该在关键路径上的服务。

提供容错Mock数据。Mock数据也应能够在注冊中心在执行时动态下发。当某服务不可用时,用Mock数据取代,能够降低故障的发生,比方某验权服务。当验权服务全部挂掉后,直接返回false表示没有权限。并打印Error日志报警。

另外,前端的页面也应採用Portal进行降级,当该Portal获取不到数据时,直接隐藏。或替换为其他模块展示,并提供功能开关,可人工干预是否展示,或限制多少流量能够展示。


        当已有非常多小服务,可能就须要组合多个小服务的大服务,为此,不得不添加一个中间层。暴露一个新服务,里面分别调其他小服务。这种新服务业务逻辑少,却带来非常多开发工作量。

此时,须要一个服务编排引擎,内置简单的流程引擎,仅仅需用XML或DSL声明怎样聚合服务。注冊中心能够直接下发给消费者执行聚合逻辑,或者部署通用的编排server。全部请求有编排server转发。

        并非全部服务的訪问量都大,非常多的服务都仅仅有一丁点訪问量,却须要部署两台提供服务的机器,进行HA互备。怎样降低浪费的机器。

此时可能须要让服务容器支持在一台机器上部署多个应用,能够用多JVM隔离。也能够用ClassLoader隔离。


  

假设你的应用是国际化的,有中文站,美国站之类,由于时差,美国站的机器晚上闲的时候,可能正是中文站的白天忙时,能够通过资源调度,分时段自己主动调配和部署两方应用。

  以上是提给我和大家学习Dubbo同事们的问题,通过Dubbo的使用来深入浅出的领悟吧。

版权声明:本文博主原创文章。博客,未经同意不得转载。

Dubbo框架中的应用(两)--服务治理的更多相关文章

  1. 一文搞懂Java/Spring/Dubbo框架中的SPI机制

    几天前和一位前辈聊起了Spring技术,大佬突然说了SPI,作为一个熟练使用Spring的民工,心中一紧,咱也不敢说不懂,而是在聊完之后赶紧打开了浏览器,开始的学习之路,所以也就有了这篇文章.废话不多 ...

  2. express框架中使用nodemon自启动服务

    1.安装nodemon //全局安装 npm install -g nodemon //本地安装 npm install nodemon --save 2.修改package.json配置 " ...

  3. 分布式服务治理框架Dubbo的前世今生及应用实战

    Dubbo的出现背景 Dubbo从开源到现在,已经出现了接近10年时间,在国内各大企业被广泛应用. 它到底有什么魔力值得大家去追捧呢?本篇文章给大家做一个详细的说明. 大规模服务化对于服务治理的要求 ...

  4. SpringCloud微服务:基于Nacos组件,整合Dubbo框架

    源码地址:GitHub·点这里 || GitEE·点这里 一.基础组件简介 1.Dubbo框架 Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服 ...

  5. 美团分布式服务通信框架及服务治理系统OCTO

     一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...

  6. Dubbo原理和源码解析之服务引用

    一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...

  7. dubbo 框架

    2.1 dubbo  Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能.轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和 ...

  8. 浅谈服务治理、微服务与Service Mesh(三) Service Mesh与Serverless

    作为本系列文章的第三篇(前两篇<浅谈服务治理.微服务与Service Mesh(一)Dubbo的前世今生>,<浅谈服务治理.微服务与Service Mesh(二) Spring Cl ...

  9. 【开源框架】EFW框架中的系统权限与页面子权限详解

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...

随机推荐

  1. xadmin的插件机制

    xadmin的视图方法中如果加了@filter_hook 标记的都可以作为插件的钩子函数. 例如在ListAdminView类中有许多加了上述标记的方法, @filter_hook def get_c ...

  2. linux系统下,递归删除.svn文件

    linux系统下,递归删除.svn文件 SVNLinux 进入要删除的目录,执行下面的命令就可以啦. find . -name "*.svn"  | xargs rm -rf

  3. python将图片转为base64编码

    import base64 f = open("m1.jpg", "rb") res = f.read() s = base64.b64encode(res) ...

  4. 安卓天天练练(十五)改造BasicSyncAdapter

    谷歌的官方示例BasicSyncAdapter是Android Studio工程, 把它依样画葫芦到Eclipse上,然后改造成我需要的样式. 看官方示例源码的时候,看到EntryListActivi ...

  5. win7中的Uac与开机自动启动(好几种办法,特别是用不带UAC的程序启动UAC程序是一个简单的好办法,写驱动自启动更是了不得)

    在另一篇文章中已经介绍了给Exe加上Uac的方法,在使用的过程中我们会发现,如果把带Uac的Exe写入注册表的Run中,是无法实现开机自动启动的,原因就是带Uac的exe需要申请管理员权限,以便运行执 ...

  6. 最完整的合并相交集合的Java代码(查并集)

    这个是自己写的算法,如果有大牛,麻烦帮我并行化.初学者则可以学到不少东西. 产生测试用例 import java.io.*; import java.util.Random; public class ...

  7. SQL in查询报告类型转换失败的3种解决办法

    -- in查询 nvarchar转int 错误 (NodeId 为 int 类型) ) = '3,5,6,' )' SELECT ID , NodeName FROM WF_WorkFlowNode ...

  8. 14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering

    14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当插入,更新,和删除操作在表上执行, 索引列的值(特别是 se ...

  9. INDEX FAST FULL SCAN和INDEX FULL SCAN

    INDEX FULL SCAN 索引全扫描.单块读 .它扫描的结果是有序的,因为索引是有序的.它通常发生在 下面几种情况(注意:即使SQL满足以下情况 不一定会走索引全扫描) 1. SQL语句有ord ...

  10. EntityFramework 异常 -- An entity object cannot be referenced by multiple instances of IEntityChangeTracker

    问题      在调用 DbSet 的 Attach()  方法时(与将 Entity 设置为 EntityState.Unchanged 状态等价)报告以下错误:      An entity ob ...