微服务初探

微服务的概念及优缺点
微服务的基础架构
当前可选的微服务框架
单体应用升级为微服务需要注意的事项
微服务运维人员技术栈

微服务及其优缺点

微服务 是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。微服务也指一种松耦合的、有一定的有界上下文的面向服务架构。也就是说,如果每个服务都要同时修改,那么它们就不是微服务,因为它们紧耦合在一起;如果你需要掌握一个服务太多的上下文场景使用条件,那么它就是一个有上下文边界的服务,这个定义来自DDD领域驱动设计。[1]

主要特点是组件化、松耦合、自治、去中心化。[1]

优缺点:[4]
优点:复杂度可控,独立按需扩展,技术选型灵活,容错,可用性高。
缺点:多服务运维难度,系统部署依赖,服务间通信成本,数据一致性,系统集成测试,重复工作,性能监控等。

为什么采用微服务:“让我们的系统尽可能快地响应变化” - Rebecca Parson

Monolith 整体式/单体式
Productivity 生产力/生产率
什么时候使用微服务

微服务的基础架构 (微服务需要的组件)

微服务基础架构

目前可选的微服务框架 [9] (17-11-03)

  1. Spring Boot(GitHub 34K Star 2019-2-15 17:05:36)
    Spring Boot的设计目的是简化新Spring应用初始搭建以及开发过程,2017年有64.4%的受访者决定使用Spring Boot,可以说是最受欢迎的微服务开发框架。利用Spring Boot开发的便捷度简化分布式系统基础设施的开发,比如像配置中心、注册、负载均衡等方面都可以做到一键启动和一键部署。
    Spring Boot简化了基于Spring的应用开发,通过少量的代码就能创建一个独立的、产品级别的Spring应用。 Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置

  2. Spring Cloud 一整套解决方案
    Spring Cloud是一个系列框架的合计,基于HTTP(s)的RETS服务构建服务体系,Spring Cloud能够帮助架构师构建一整套完整的微服务架构技术生态链。
    Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元,Spring Cloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多,Spring Cloud做为大管家就需要提供各种方案来维护整个生态。
    SpringCloud完整技术
    SpringCloud部分推荐项目

SpringBoot与SpringCloud的关系

  • Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,
    Spring Cloud是一个基于Spring Boot实现的 云应用开发工具
  • Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架;
  • Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,可以不基于Spring Boot吗?不可以。
  • Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖的关系。
  • 要学习SpringCloud必须要学习SpringBoot

个人理解SpringBoot与StringCloud并非是非此即彼的关系,猜测的使用场景大概是先熟悉SpringBoot,使用SpringBoot实现业务服务程序,然后学习SpringCloud,不过SpringCloud属于整体运维,与业务关联不大。

  1. Dubbo (GitHub 24K Star 2019-2-15 17:05:21)
    Dubbo是由阿里巴巴开源的 分布式服务化治理框架,通过RPC请求方式访问。Dubbo是在阿里巴巴的电商平台中逐渐探索演进所形成的,经历过复杂业务的高并发挑战,比Spring Cloud的开源时间还要早。目前阿里、京东、当当、携程、去哪等一些企业都在使用Dubbo。

  2. Dropwizard (GitHub 7K Star 2019-2-15 17:06:05)
    将Java生态系统中各个问题域里最好的组建集成于一身,能够快速打造一个Rest风格的后台,还可以整合Dropwizard核心以外的项目。国内现在使用Dropwizard还很少,资源也不多,但是与SpringBoot相比,Dropwizard在轻量化上更有优势,同时如果用过Spring,那么基本也会使用SpringBoot。

  3. Akka (GitHub 9.5K Star 2019-2-15 17:06:05)
    Akka是一个用 Scala 编写的库,可以用在有简化编写容错、高可伸缩性的Java和Scala的Actor模型,使用Akka能够实现微服务集群。

  4. Vert.x/ Lagom/ ReactiveX/Spring 5
    这四种框架主要用于响应式微服务开发,响应式本身和微服务没有关系,更多用于提升性能上,但是可以和微服务相结合,也可以提升性能。

.Net相关微服务框架
….

Node.js相关微服务框架
….

Python相关微服务框架
….

Go微服务框架
gRPC
….

逐步升级的技术方案

要实际的应用微服务,需要解决一下四点问题:[4]

  1. 客户端如何访问这些服务
  2. 每个服务之间如何通信(REST API/RPC,异步消息调用(Kafka,Notify,MetaQ))
  3. 如此多的服务,如何实现?
  4. 服务挂了,如何解决?(备份方案,应急处理机制)

采用了SpringBoot,一段时间后一定会转SpringCloud

文章推荐 Spring Cloud在国内中小型公司能用起来吗?

我们向微服务迁移的时候通常 从耦合度最低的模块或对扩展性要求最高的模块开始,把它们一个一个剥离出来用敏捷地重写,可以尝试最新的技术和语言和框架,然 后单独布署。 它通常不依赖其他服务。[1]

技术栈

微服务技术栈

Spring 与 Go语言

Go语言的微服务框架有
gRPC 是谷歌开源的轻量级 RPC 通信框架,其中的通信协议基于二进制数据流,使得 gRPC 具有优异的性能。
gRPC 支持 HTTP 2.0 协议,使用二进制帧进行数据传输,还可以为通信双方建立持续的双向数据流。
gRPC 内置protoBuf通信协议。
(protobuf是google旗下的一款平台无关,语言无关,可扩展的序列化结构数据格式。所以很适合用做数据存储和作为不同应用,不同语言之间相互通信的数据交换格式,只要实现相同的协议格式即同一 proto文件被编译成不同的语言版本,加入到各自的工程中去。这样不同语言就可以解析其他语言通过 protobuf序列化的数据。目前官网提供了 C++,Python,JAVA,GO等语言的支持。)

参考文章链接

[1] 微服务架构设计 https://www.cnblogs.com/wintersun/p/6219259.html
[2] 2019年微服务5大趋势,你pick哪个? https://baijiahao.baidu.com/s?id=1625407810204526341&wfr=spider&for=pc
[3] 2019年最值得关注的五大微服务发展趋势 http://server.51cto.com/Micro-591836.htm
[4] 微服务架构(微服务的几种设计模式) https://www.cnblogs.com/imyalost/p/6792724.html
[5] spring Boot+spring Cloud实现微服务详细教程第一篇 https://www.cnblogs.com/zhaieryuan/p/8495179.html
[6] spring Boot+spring Cloud实现微服务详细教程第二篇 https://www.cnblogs.com/zhaieryuan/p/8644873.html
[7] 关于SpringCloud、SpringBoot 希望这是说得最详细的 https://www.cnblogs.com/itmsbx/p/9692538.html
[8] Spring Cloud 基于Spring Boot 2.x的服务注册与发现(Eureka) https://blog.csdn.net/yy1098029419/article/details/80405345
[9] 做好架构师,要懂微服务,汇总微服务架构落地的15种框架 http://baijiahao.baidu.com/s?id=1582940394738296322&wfr=spider&for=pc
[10] Spring Boot与Spring Cloud是什么关系? https://zhuanlan.zhihu.com/p/38566684
[11] 微服务架构的基础框架选择 https://blog.csdn.net/moonpure/article/details/79552452
[12] 微服务技术栈 http://www.uml.org.cn/wfw/201806074.asp
[13] 微服务架构技术栈选型指南 https://wenku.baidu.com/view/a6ff0823571252d380eb6294dd88d0d233d43c0e.html
[14] gRPC基于Golang和Java的简单实现 https://www.jianshu.com/p/21d5d7624951
[15] springcloud学习资料汇总 http://www.ityouknow.com/springcloud/2016/12/30/springcloud-collect.html
[16] springboot学习资料汇总 http://www.ityouknow.com/springboot/2015/12/30/springboot-collect.html
[17] 为什么微服务实施那么难?如何高效推进微服务架构演进 https://gitbook.cn/books/59870d65d115e231bf3e3f5f/index.html
[18] 微服务设计(书籍,豆瓣8.2分) https://book.douban.com/subject/26772677/
[19] 持续交付(书籍,豆瓣8.6分) https://book.douban.com/subject/6862062/
[20] 持续交付2.0 (本书作者是《持续交付》的译者) https://book.douban.com/subject/30419555/
[21] 领域驱动设计
[22] 实现领域驱动设计
[23] 微服务架构与实践
[24] 微服务那些事儿