• 架构解耦(转)


    1. 小小的IP,大大的耦合,你痛过吗?

        如何解除IP耦合?

        常见的方法是:使用内网域名替代内网IP,如果没有做这个优化,强烈的建议马上实施,将配置文件中的内网IP全部干掉,全部改为内网域名。

        使用内网域名,就不需要上游配合重启了吗?

        假设现在不用内网IP,改用内网域名了,一个服务或者数据库的IP变更,只需要一个地方更改,而不是所有上游更改:

    • 运维修改内网DNS,将内网域名指向新的IP,如果是短连接调用,未来新的请求流量,自然会切到新的IP上;如果是长连接调用,新的长连接会连到新的IP上,但旧的长连接仍然连接的是旧IP

    • 运维统一将旧IP上的连接切断,如无意外,服务或者数据库的连接池都有重连功能,重连后就会自动连到新IP上去

         如此这般,只要运维配合就可以完成IP的迁移,对于所有上游的调用方不需要配合修改配置重启。

    2. 小小的公共库,大大的耦合,你痛过吗?

        如何解除公共库耦合?

        方案一:代码拷贝一份

        别嘲笑这个方案,谁敢说自己写代码的时候没这么干过?

        我们都知道这不是一个好的方案,但不可否认,拷贝之后,代码各自演化,一个地方升级出错,只影响一方,拷贝方只要不动原有代码,至少是不会受影响的。

        代码拷贝缺点很多,系统拆分时,万不得已不要使用这个方案。

        方案二:垂直拆分,将公共库里业务个性化的代码拆到调用方去,不要放在公共库里

        需要把业务个性的代码拆分到各个业务线自己的工程,自己的业务库里去,例如s1.jar / s2.jar / s3.jar,修改各自的代码,至少不会扩大影响范围。

        大家为什么都把代码往一个公共库里塞?

        很多时候,因为惰性,一点一点的惰性,日积月累,终成大坑。

        这个垂直拆分是一个架构重构的过程,需要各业务方配合。

        方案三:服务化,将公共库里通用业务代码拆到下层去

        完成了第一步,业务个性化的代码提取到业务侧上游。

        接下来是第二步,业务通用的代码,下沉抽取一层服务,服务对上游提供RPC接口:

    • 每次修改底层接口,需要测试接口的兼容性,保证不影响旧调用方

    • 如果是新的业务,则建议新增接口 

         最终,达到通过服务RPC调用的方式来解除耦合。

         个性业务代码上浮,共性业务代码服务化下沉,只是一个很小的优化点,但对于公共库解耦却是非常的有效。

    3. CA,给了数据库,给了机器,为啥也扩不了容?

        如何解除公共数据库与业务数据库的耦合?

        第一步:公共数据访问下沉服务化

        第二步:垂直拆分,个性化数据访问上浮

        此时各业务有自己的库,公共有公共的库:

    • 早期:可以放在一个数据库实例里

    • 后期:可以很容易地通过新增数据库实例,把user库或者业务A/B/C的库拆分出来,实现增加机器增加实例就实现扩容

    4. 服务化了,没想到耦合更加严重?

        1). 讨论技术方案时,不要总以:

             “放在你那边做代码少”

             “放在你那边做时间短”

             作为设计折衷的理由,而要多问:“怎么做合理”

       2). 尽量杜绝底层出现switch case(biz_type)走不同分支的代码。

            业务代码上浮,通用代码下沉,服务化彻底,只是一个很小的优化点,但对于底层服务解耦却是非常的有效。

    5. MQ,互联网架构解耦神器

        1). 一个架构常识:当调用方需要关心执行结果,通常使用RPC调用。但如果调用方不关心执行结果,却仍然使用RPC调用,会引发上下游极大的耦合与瓶颈。

        2). 如果事件发出方不关心订阅方的执行结果,不能用RPC,应该用MQ。

        MQ能够做到上下游物理上逻辑上都解耦:

    • 物理上解耦,增加MQ之后,上游互不知道彼此的存在,不会建立物理连接了,大家都只与MQ建立物理连接

    • 逻辑上解耦,事件发布方甚至不用知道哪些下游订阅了这个消息,新增消息的订阅方只需要连接MQ就行了,不需要上游关注

         MQ是一个非常常见的物理上解耦、逻辑上也解耦的利器。

         关注下游执行执行结果,用RPC;不关注下游执行结果,用MQ,不用RPC;

         这只是一个很小的优化点,但对于通知解耦却是非常有效。

    6.  

  • 相关阅读:
    错误处理和调试 C++快速入门30
    错误处理和调试 C++快速入门30
    虚继承 C++快速入门29
    多继承 C++快速入门28
    界面设计01 零基础入门学习Delphi42
    鱼C记事本 Delphi经典案例讲解
    界面设计01 零基础入门学习Delphi42
    虚继承 C++快速入门29
    linux系统中iptables防火墙管理工具
    linux系统中逻辑卷快照
  • 原文地址:https://www.cnblogs.com/Jtianlin/p/8907784.html
Copyright © 2020-2023  润新知