小机灵鬼|干货速来!透彻剖析微服务架构设计模式,深入开发Java有奇效( 三 )

  • 拥有持续交付和持续部署所需要的可部署性 。 每个服务都可以独立于其他服务进行部署 。 如果负责服务的开发人员需要部署对该服务的更改 , 他们不需要与其他开发人员协调就可以进行 。 因此 , 将更改频繁部署到生产中要容易得多
  • 使开发团队能够自主且松散耦合 。 你可以将工程组织构建为一个小型(例如 , 两个比萨 )团队的集合 。 每个团队全权负责一个或多个相关服务的开发和部署 。 每个团队可以独立于所有其他团队开发、部署和扩展他们的服务 。 结果 , 开发的速度变得更快
  • 每个服务都相对较小并容易维护微服务架构的另一个好处在于:相比之下每个服务都比较小 。 开发者更容易理解服务中的代码 。 较小规模的代码库不会把 IDE 等开发工具拖慢 , 这样可以提升开发者的工作效率 。 服务的启动速度也比大型的单体应用快得多 , 千万别小看这一点 , 快速启动的服务会提高效率 , 加速研发(提高调试、部署等环节的效率) 。
    更好的容错性微服务架构也可以实现更好的故障隔离 。 例如 , 某个服务中的内存泄漏不会影响其他服务 。 其他服务仍旧可以正常地响应请求 。 相比之下 , 单体架构中的一个故障组件往往会拖垮整个系统
    更容易实验和采纳新的技术原则上 , 当开发一个新的服务时 , 开发者可以自由选择适用于这个服务的任何语言和框架 。 当然 , 很多公司对此往往有各种限制和规范 , 但重要的是团队有了选择的权利 , 而不是被之前选定的技术绑架 。 更进一步 , 因为服务都相对比较小 , 使用更好的编程语言和技术来重写一项服务变得有可能 。 这也意味着 , 如果对一项新技术的尝试以失败而告终 , 我们可以直接丢弃这部分工作而不至于给整个应用带来失败的风险 。 这跟单体架构是完全不同的 , 单体架构之下的技术选型会严重限制后期新技术的尝试
    弊端当然 , 没有一项技术可以被称为“银弹”。 微服务架构也存在一些显著的弊端和问题微服务架构的主要弊端和问题如下:
    服务的拆分和定义是一项挑战采用微服务架构首当其冲的问题 , 就是根本没有一个具体的、良好定义的算法可以完成服务的拆分工作 。 与软件开发一样 , 服务的拆分和定义更像是一门艺术 。 更糟糕的是 , 如果对系统的服务拆分出现了偏差 , 你很有可能会构建出一个分布式的单体应用:一个包含了一大堆互相之间紧耦合的服务 , 却又必须部署在一起的所谓分布式系统 。 这将会把单体架构和微服务架构两者的弊端集于一身 。
    分布式系统带来的各种复杂性使用微服务架构的另一个问题是开发人员必须处理创建分布式系统的额外复杂性 。 服务必须使用进程间通信机制 。 这比简单的方法调用更复杂 。 此外 , 必须设计服务来处理局部故障 , 并处理远程服务不可用或出现高延迟的各种情况 。
    开发者需要思考到底应该在应用的什么阶段使用微服务架构使用微服务架构的另一个问题是决定在应用程序生命周期的哪个阶段开始使用这种架构 。 在开发应用程序的第一个版本时 , 你通常不会遇到需要微服务架构才能解决的问题 。 此外 , 使用精心设计的分布式架构将减缓开发速度 。 这对初创公司来说可能是得不偿失的 , 其中最大的问题通常是在快速发展业务模型和维护一个优雅的应用架构之间的取舍 。 微服务架构使得项目开始阶段的快速迭代变得非常困难 。 初创公司几乎肯定应该从单体的应用程序开始。 但是稍后 , 当问题变为如何处理复杂性时 , 那就是将应用程序功能性地分解为一组服务的时候了 。 由于盘根错节的依赖关系 , 你会发现重构很困难
    服务的拆分策略如何定义一个微服务架构呢?跟所有的软件开发过程一样 , 一开始我们需要拿到领域专家或者现有应用的需求文档 。 跟所有的软件开发一样 , 定义架构也是一项艺术而非技术 。 本节我们将介绍一种定义应用程序架构的三步式流程