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. js实现中文简繁切换效果

    html代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  2. prepare—Article【准备篇】之SSH_tool#PuTTY

    第一:下载PuTTY: url :     http://www.openssh.com/ 下载界面: 安装后: 详解以上命令 ① ② PuTTYgen is a key generator. It ...

  3. 编程思想—控制反转(IOC)及依赖注入(DI)

    1.什么是依赖注入 在面向对象的编程语言中,一个对象的行为方法往往需要外界的对象的行为协助才能完成. 例如:小李去ATM机取钱,那小李的取钱的整个行为的完成需要ATM实例取款行为的协助才能完成. pu ...

  4. Quartz1.8.5例子(八)

    /* * Copyright 2005 - 2009 Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the ...

  5. iOS: 填充数据表格

    功能:创建一个列表并填充 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lish ...

  6. Life Forms

    poj3294:http://poj.org/problem?id=3294 题意:就是求n个串的中一个最大的子串,这个子串在超过n/2的串中出现. 题解:这是一道好题.首先一种解法就是用后缀数组来搞 ...

  7. Javascript禁止网页复制粘贴效果,或者复制时自动添加来源信息

    一.禁止复制 使用方法:在oncopy事件中return false oncopy="return false;" 1.禁止复制网页内容 <body oncopy=" ...

  8. 测试一下MarkDown

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...

  9. [FJSC2014]异或之

    [题目描述] 给定n个非负整数A[1], A[2], ……, A[n]. 对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n ...

  10. vijosP1902学姐的清晨问候

    题目:https://vijos.org/p/1902 题解:sb题...扫一遍每个字母出现的次数即可 代码: #include<cstdio> #include<cstdlib&g ...