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. asp.net+uploadify实现图片上传图片

    前段代码如下 $("#file_upload").uploadify({ 'auto': true, 'swf': '/template/js/cutImg/uploadify/u ...

  2. 网络协议图形化分析工具EtherApe

    网络协议图形化分析工具EtherApe   在对网络数据分析的时候,渗透测试人员往往只关心数据流向以及协议类型,而不关心具体数据包的内容.因为这样可以快速找到网络的关键节点或者重要的协议类型. Kal ...

  3. WC 2018/CTSC 2018/APIO 2018 游记

    (要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...

  4. CocoaPods安装使用及配置私有库及注意点

    如何安装? 1.安装ruby环境,添加淘宝ruby镜像 $ gem sources --remove https://rubygems.org///等有反应之后再敲入以下命令$ gem sources ...

  5. Jackson反序列JSON为实体对象出现:no String-argument constructor/factory method to deserialize from String value的问题

    解决方法: 1.JSON字符串中有转义字符,可以替换,也可以直接toString之后清除转移字符. 参考: https://stackoverflow.com/questions/40986738/s ...

  6. WPF中的DesignMode判断

    WPF中提供你一个类似WinForm的DesignMode属性的方法来判断当前是否处于设计器模式: bool IsInDesignMode    {        get { return Desig ...

  7. 磁盘爆满导致MySQL无法启动:Disk is full writing './mysql-bin.~rec~' (Errcode: 28). Waiting for someone to free space...

    今天收到监控邮件说博客访问失败.打开页面一看,硕大的502 Bad Gateway,ping了一下VPS发现是通的,SSH连接上去看了下Nginx日志发现没问题,重启lnmp的时候发现Mysql起不来 ...

  8. ASIHTTPRequest学习(四)

    如果是IOS5的版本,可能集成过程中会遇到一些问题,我也找到了一些解决方案,比如,集成完后可能会遇到编译提示找不到"libxml/HTMLparser.h",解决这个问题可以参考这 ...

  9. JAVA常见算法题(十五)

    package com.xiaowu.demo; /** * * 输入三个整数x,y,z,请把这三个数由小到大输出. * * @author WQ * */ public class Demo15 { ...

  10. 使用Python3解压gz、tar、tgz、zip、rar五种格式的压缩文件例子

    使用Python3解压如下五种压缩文件:gz.tar.tgz.zip.rar 简介 gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: linux系统下的打 ...