1. 单体架构

  一个归档包(例如war格式)包含所有功能的应用程序,通常称为单体应用。

  > 复杂性高:模块多,模块的边界模糊,依赖关系不清楚,代码质量参差不齐。

  > 技术债务:随着时间推移、需求变更和人员更迭,逐渐形成应用程序的技术债务,越积越多。“不坏不修”,因为其他模块可能会以意料之外的方式使用你想修改的代码。

  > 部署频率低:随着代码的增多,构建和部署的时间也会增加。在单体应用中,每次功能的变工或缺陷的修复都会导致重新部署整个应用。

  > 可靠性差:某个应用Bug,例如死循环、OOM等,都可能导致整个应用的崩溃。

  > 扩展能力受限:单体应用只能作为一个整体进行扩展,无法更加业务模块的需求进行伸缩。例如,有的模块是计算密集型,需要强劲的CPU;有的模块则是IO密集型,需要更大的内存。由于这些模块部署在一起,不得不在硬件的选择上作出妥协。

  > 阻碍技术创新:单体应用使用统一的技术平台或方案解决所有问题,团队成员必须使用相同的开发语言和框架,想引入新框架和新技术平台会非常困难。比如将Struts2构建的大型单体应用改造为Spring MVC,成本是非常高的。

2. 微服务

  微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常为HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务公用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。

  特征:

  • 每个微服务可独立运行在自己的进程里。
  • 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等。
  • 微服务之间通过一些轻量的通信机制进行通信,例如通过RESTful API进行调用。
  • 可以使用不同的语言与数据存储技术
  • 全自动的部署机制

  优点:

  • 易于开发和维护:一个微服务只关注一个特定的业务功能,因此业务清晰、代码量较少。
  • 单个微服务启动较快:单个微服务代码量较少,因此启动会比较快。
  • 局部修改容易部署:对某个微服务进行修改,只需要重新部署这个服务即可。
  • 技术栈不受限:可结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些服务有图形计算的需求,可使用Neo4j;甚至可根据需要,部分微服务用Java开发,部分用Node.js开发。
  • 按需伸缩:可根据需求,实现细粒度的扩展。例如,系统中的某个微服务遇到了瓶颈,可以结合这个微服务的业务特点,增加内存、升级CPU或增加节点。

  不足:

  • 运维要求较高:更多的服务意味着更多的运维投入。在微服务中,需要保证几十甚至几百个服务的正常运行与协作,这给运维带来了很大的挑战。
  • 分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。
  • 接口调整成本高:微服务之间通过接口进行通信。如果修改某个微服务的API,可能所有使用了该接口的微服务都需要做调整。
  • 重复劳动:很多微服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,各个微服务都会开发这一功能,从而导致代码重复。

3. 微服务设计原则

  • 单一职责原则

  单一职责原则指的是一个单一(类、方法或服务等)只应关注整个系统功能中单独、有界限的一部分。

  单一职责原则是SOLID原则之一。

  • 服务自治原则

  服务自治是指每个微服务应具备独立的业务能力、依赖与运行环境。服务之间高度解耦。每个微服务从开发、测试、构建、部署,都应当可以独立运行,而不依赖其他的服务。

  • 轻量级通信机制

  微服务之间应该通过轻量级的通信机制进行交互。轻量级的通信机制应具备两点:一、体量较轻;二、跨语言,跨平台的。

  微服务架构中,常用的协议有REST、AMQP、STOMP、MQTT等。

  • 微服务粒度

  微服务的粒度是难点,也是争论的焦点。应当使用合理的粒度划分微服务,而不是一味地把服务做小。代码量的多少不能作为微服务划分的依据,不同的微服务本身的业务复杂度不同,代码量也不同。

  在微服务设计节点,就应确认其边界。微服务之间应相对独立并保持松耦合。

  个人认为,领域驱动设计(Domain Driven Design,简称DDD)中的“界限上下文(Bounded Context)”可作为划分微服务边界、确定微服务粒度的重要依据。

4.参考

  周立 --- 《Spring Cloud与Docker微服务架构与实战》

SpringCloud系列一:微服务理解的更多相关文章

  1. java框架之SpringCloud(2)-Rest微服务案例

    在上一章节已经对微服务与 SpringCloud 做了介绍,为方便后面学习,下面以 Dept 部门模块为例做一个微服务通用 Demo —— Consumer 消费者(Client) 通过 REST 调 ...

  2. springcloud与docker微服务架构实战--笔记

    看了<微服务那些事>之后,Spring boot和Spring Cloud的关系理清楚了,Spring cloud各个模块的作用也了解了. 但是,Spring cloud 与Docker的 ...

  3. 【SpringCloud构建微服务系列】微服务网关Zuul

    一.为什么要用微服务网关 在微服务架构中,一般不同的微服务有不同的网络地址,而外部客户端(如手机APP)可能需要调用多个接口才能完成一次业务需求.例如一个电影购票的手机APP,可能会调用多个微服务的接 ...

  4. SpringCloud学习系列-Rest微服务构建

    总体介绍 承接着我们的springmvc+mybatis+mysql初级高级课程,以Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(S ...

  5. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  6. SpringCloud与Docker微服务架构实战笔记

    一  微服务架构概述 1. 单体应用架构存在的问题 结合:https://www.cnblogs.com/jialanshun/p/10637454.html一起看,在该篇博客中搜索“单块架构的优缺点 ...

  7. 线上SpringCloud网关调用微服务跨机房了,咋整?

    1.前言 公司内考虑到服务器资源成本的问题,目前业务上还在进行服务的容器化改造和迁移,计划将容器化后的服务,以及一些中间件(MQ.DB.ES.Redis等)尽量都迁移到其他机房. 那你们为什么不用阿里 ...

  8. 一. SpringCloud简介与微服务架构

    1. 微服务架构 1.1 微服务架构理解 微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦.你可以将其看作是在 ...

  9. 如何跟领导解释为什么选择SpringCloud alibaba作为微服务开发框架

    什么是微服务 提到微服务不得不提Martin Fowler在2014年3月25日发表的文章 Microservices,里面给出了微服务的定义.后续国内所有关于微服务的介绍都是基于这篇文章的翻译,或加 ...

随机推荐

  1. 使用百度地图JavaScript实现驾车/公交/步行导航功能

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. MVC5下的switchbutton

    最近想提高代码生成的时候,是否选择显示样式好看些,所以想到了SwitchButton. 但是碰到个问题是,添加页面的这个初始值,需要写成true或者false 包括修改页面做个判断的话,渲染的做法也是 ...

  3. 性能优化之基础资源cpu&内存(JVM)

    本章主要介绍计算机的一些基础资源以及操作系统处理后的一些基础资源. 主要包括 cpu 内存 磁盘 网络 线程 本章会介绍这些资源的一些原理,介绍如何查看资源的数量,使用情况,对性能和整体计算机执行的一 ...

  4. HDU 5923 Prediction(2016 CCPC东北地区大学生程序设计竞赛 Problem B,并查集)

    题目链接  2016 CCPC东北地区大学生程序设计竞赛 B题 题意  给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这 ...

  5. python 传不可变对象 or 可变对象

    可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象 ...

  6. 1.13(java学习笔记)异常机制

    异常不同于错误,它是程序运行时产生的未知问题. 如果把程序比喻成一辆汽车,那么汽车开着开着突然前面出现了一个大石头挡住了路,这就叫异常. 那么出现了这个异常我们需要去处理,比如打电话给公路管理局,让它 ...

  7. What is the purpose of mock objects?

    Since you say you are new to unit testing and asked for mock objects in "layman's terms", ...

  8. 解读TDD的五大误区

    所谓TDD简单地说就是以下两个步骤:确保所有的需求都能被照顾到:在代码不断增加和重构的过程中,可以检查所有的功能是否正确.本文我们一起来看下关于TDD的五大误区. TDD(全称Test Driven ...

  9. Ubuntu16.04 -- 后台进程Nohup

    nohup用于使程序在用户退出登陆.关闭终端之后仍能继续运行 用法: nohup your_command & #(符号&使程序在后台运行) exit #(退出nohup模式) 启动后 ...

  10. [置顶] docker--基础镜像和dockerfile

    制作基础镜像 注意:需要在CentOS6下操作 准备工作 yum -y install febootstrap 下载ISO镜像文件到服务器 mkdir /mnt/centos6/ mount -o l ...