第00课:序

微服务架构

微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法适应快速变化等多重因素的推动下诞生的产物。互联网时代的产品通常有两类特点:需求变化快和用户群体庞大,在这种情况下,如何从系统架构的角度出发,构建灵活、易扩展的系统,快速应对需求的变化;同时,随着用户的增加,如何保证系统的可伸缩性、高可用性,成为系统架构面临的挑战。

如果还按照以前传统开发模式,开发一个大型而全的系统已经很难满足市场对技术的需求,这时候分而治之的思想被提了出来,于是我们从单独架构发展到分布式架构,又从分布式架构发展到 SOA 架构,服务不断的被拆分和分解,粒度也越来越小,直到微服务架构的诞生。

微服务架构是 SOA 架构的传承,但一个最本质的区别就在于微服务是真正的分布式的、去中心化的。把所有的“思考”逻辑包括路由、消息解析等放在服务内部,去掉一个大一统的 ESB,服务间轻通信,是比 SOA 更彻底的拆分。微服务架构强调的重点是业务系统需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发,设计,运行和运维的小应用,这些小应用之间通过服务完成交互和集成。

大约 2009 年开始,Netflix 完全重新定义了它的应用程序开发和操作模型,拉开了微服务探索的第一步,直到2014年3月 Martin Fowler 写的一篇文章 Microservices 以更加通俗易懂的形式为大家定义了什么是微服务架构。Martin Fowler 在文中阐述了对微服务架构的设想,认为微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。

每个服务运行在其独立的进程中,服务和服务间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

为什么是 Spring Boot

Spring Boot 正是在这样的一个背景下被抽象出来的开发框架,所以说 Spring Boot 就是真正为微服务架构而诞生,实现了在 Java 领域内微服务架构落地的技术支撑。

Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用,大部分的 Spring Boot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。

使用 Spring Boot 开发项目,会给我们带来四个非常明显优点:

  • 1)Spring Boot 使编码变简单,Spring Boot 提供了丰富的解决方案,快速集成各种解决方案提升开发效率。
  • 2)Spring Boot 使配置变简单,Spring Boot 提供了丰富的 Starters,集成主流开源产品往往只需要简单的配置即可。
  • 3)Spring Boot 使部署变简单,Spring Boot 本身内嵌启动容器,仅仅需要一个命令即可启动项目,结合 Jenkins 、Docker 自动化运维非常容易实现。
  • 4)Spring Boot 使监控变简单,Spring Boot 自带监控组件,使用 Actuator 轻松监控服务各项状态。

Spring Boot 一经推出就受到开源社区的追捧,Spring Boot 官方提供了很多 Starters 方便集成第三方产品,很多主流的框架也纷纷进行了主动的集成,比如 Mybatis。Spring 官方非常重视 Spring Boot 的发展,在 Spring 官网首页进行重点推荐介绍,是目前 Spring 官方重点发展的项目之一。

Spring Boot 本身发展特别快,自从 2014 年 4 月发布 Spring Boot 1.0 之后,版本更新非常频繁,我在 2016 年使用的时候是 1.3.X,到现在 Spring Boot 已经发布了 Spring Boot 2.0,Spring Boot 2.0 集成了很多最新优秀的技术和新特性,并且对 Spring Boot 1.0 的 API 进行了大幅优化。Spring Boot 一经推出就迅速的成为一门热门的技术,从下图也可以看出这个结论:


上图为2014年到2018年 Spring Boot 的百度指数,可以看出 Spring Boot 2.0 推出引发了搜索高峰。

微服务架构和数据

随着微服务架构的落地,人们发现微服务架构虽然改进了开发模式,但同时也引入了一些问题,在这所有的问题中,最重要的也是马上要面临的一个问题就是数据的问题。在微服务架构中我们强调彻底的组件化和服务化,每个微服务都可以独立的部署和投产,其实也就意味着很多的微服务有自己独立的数据库。

整个业务数据被分散在各个子服务之后会带来两个最明显的问题:1、业务管理系统对数据完整的查询,比如分页查询、多条件查询等,数据被割裂后如何来整合?2、如何对数据进一步的分析挖掘?这些需求可能需要全量的数据,并且在进行分析时不能影响到当前业务。

从技术方案来讲,我们一般有两种选择来处理这些问题,第一种是在线处理数据,第二种是离线处理数据。

在线处理数据的方案就是按照微服务的标准接口来进行,后端需要哪个系统的数据就去调用某个微服务提供的接口来获取。后端管理平台根据前端的需求去不同的微服务系统去获取数据,然后将返回的数据进行处理后将数据返回。这种方案有两个弊端:1)一方面微服务数据方需要提供数据接口,一方面数据的使用者需要去写调用方法,并且调用者需要编写大量的代码进行数据处理;2)在对各个微服务进行调取数据时会影响微服务的正常业务处理性能。

离线处理数据方案,就是将业务数据准实时的同步到另外一个数据库中,在同步的过程中进行数据整合处理,以满足业务方对数据的需求,数据同步过来后,在提供另外一个服务接口专业负责对外输出数据信息。这种方案有两个特点:1)数据同步方案是关键,技术选型有很多,如何选择切合公司业务的技术方案;2)离线数据处理对微服务正常业务处理没有影响。

在我以往的工作中两种方案都实施过,个人更倾向于使用第二种方案。本系列教程也会详细介绍两种方案的使用。

MongDB 和数据分析

MongoDB 称之为对开发人员最友好的数据库,不再强调传统关系数据库中的行和列,整个表可以看作一个 Json 文档,MongoDB 也被认为在 Nosql 中最像关系数据库的 Nosql 数据库,保留了类似关系数据库的数据库(DataBase)、集合(Collection)、文档对象(Document)。

MongoDB 是目前最热门非关系数据库的之一,在最新的数据库排行榜中 MongoDB 排名第五,在所有的非关系数据库中排名第一,非常广泛的应用于国内外的互联网公司。

MongoDB 最大的特点是支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。MongoDB 在高可用和读负载均衡上的实现非常简洁和友好,MongoDB 自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。

MongoDB 的这些特性非常方便对数据进行高性能查询,MongoDB 支持 Aggregate 和 Mapreduce 利用分而治之的理念来处理大规模数据分析。Spring Boot 对 MongoDB 的支持非常友好,使用 Spring Boot 非常便利的处理对 MongoDB 查询和操作,Spring Boot 也提供了组件包来支持对 MongoDB的使用。

MongoDB 4.0 宣布将正式支持 ACID 事务,未来 MongoDB 的想象空间更加巨大!因此 MongDB + Spring Boot 是微服务架构中数据分析的理想选择之一。

这个课程可以学到什么?

早些时候由于工作原因研究并使用了 Spring Boot 和 MongoDB,在使用时候的发现,国内对于 Spring Boot 和 数据分析处理的资料并不是很多。网上充斥着各种学习资料质量参差不齐,这给初学者带来了很大的困扰,也对使用微服务架构的一些朋友造成了困扰。

如果没有真实的实践经历,错误的技术方案会对后期的微服务落地带来非常大的困扰,增加额外的开发工作量,我自己深有体会,合适的技术方案可以节省60%以上的工作量。于是我在网络上连载了 Spring Boot 和 MongoDB 相关的文章,并且受到广大网友的喜欢。

回过头来再次翻看这些文章,很多的 API 已经过时(Spring Boot 2.0 推出),大多数文章也只是理论为主,并且那时候对 Spring Boot 没有一个整体的了解,文章只是罗列了最基本的使用。在这系列的文章中也缺乏对微服务架构中对数据方案的考虑,以及数据分析方案的进一步探讨和实践的文章。

因此我又重新梳理了 Spring Boot 和数据分析的相关内容,将其中工作中实践过,最具实战代表性的一些内容整理出来,以 51CTO 专栏的形式来展现。课程内容将站在全局的角度去看待微服务实践和数据分析,讲解微服务架构、Spring Boot、MongoDB、同步方案、数据分析等内容帮助广大的技术朋友们少走弯路,掌握微服务和数据分析的技术。

本课程是围绕四大块内容:

  • 一、微服务架构和 Spring Boot;
  • 二、Spring Boot 和 MongoDB 实战详解,介绍实战中遇到的典型问题;
  • 三、微服务架构下的数据治理,数据同步、实时变更;
  • 四、微服务架构实践的经验和教训。

认真学完此专栏之后,会对微服务架构实践、Spring Boot 和 MongoDB 使用、微服务架构下数据处理有进一步的了解,具备使用 Spring Boot 开发微服务项目、利用相关技术解决微服务架构中的疼点。

适合阅读的人群

这个系列的文章适合以下人群阅读:

  • 从事 Java 相关开发对 Spring Boot 感兴趣的同学
  • 传统开发领域,急迫想打破原有开发模式的开发人员。
  • 对微服务架构下的数据分析存在疑惑的技术管理者。

在学习本节课程之前,首先需要了解 Spring、maven 和其它开源软件的基础技能。

本系列课程选择 Spring Boot 2.0 和 MongoDB 3.6 版本进行演示。

开发环境:

  • IDEA 2017
  • JDK1.8

技术点:

  • Thymeleaf
  • Jpa
  • Mybatis
  • Mysql
  • MongoDB
  • Redis
  • Elasticsearch
  • JTA
  • Atomikos
  • Aggregate
  • Mapreduce
  • Canal

课程列表

课程大纲:微服务技术架构和大数据治理

一、微服务架构和 Spring Boot

  • 1-1、微服务下的技术架构选型
  • 1-2、Spring Boot 对 Web 开发的支持
  • 1-3、使用 Spring Boot 操作关系数据库方案
  • 1-4、Spring Boot 和 Nosql 数据库的使用
  • 1-5、Spring Boot 下的(分布式)事务解决方案
  • 1-6、Spring Boot Starter 的秘密

二、Spring Boot 和 MongoDB 实战详解

  • 2-1、MongoDB 特点、搭建方案介绍
  • 2-2、使用 Spring Boot 操作 MongoDB
  • 2-3、Spring Boot 和 MongoDB 多数据源,混合数据源的使用
  • 2-4、MongoDB 支持动态 SQL、分页方案
  • 2-5、MongoDB 分布式计算 Aggregate VS Mapreduce

三、微服务架构下的数据治理,数据同步

  • 3-1、各类同步技术方案对比、介绍
  • 3-2、同步工具 Canal 使用、搭建方案介绍
  • 3-3、使用 Canal 将业务数据从 Mysql 同步到 MongoDB 
  • 3-4、解决后期业务变动导致的数据结构不一致的问题 

四、微服务架构的经验和教训

  • 4-1、如何在原有的系统架构上进行微服务架构演进
  • 4-2、如何在微服务架构中做好部署、监控
  • 4-3、在微服务架构演化过程中的一些经验和教训