# 微服务入门
# 一、基础概念
# 1.1 Spring
Spring官网:https://spring.io (opens new window)
Spring是一个开源容器框架,其作用就是为代码进行解耦,降低企业应用开发的复杂度问题。复杂度就是耦合度。
在系统开发过程中,分为主业务逻辑和系统级(交叉)业务逻辑。
Spring根据代码的功能特点,将降低耦合度的方式分为了两类:IoC和AOP。
IoC使得主业务在相互调用过程中,不用再自己维护关系,即不用再自己创建要使用的对象,而是统一交由Spring来进行管理维护——自动注入。
AOP使得系统级业务得到了最大的复用,由Spring容器来统一进行织入。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring全家桶已占据JAVA开发的主导地位,并且与各种框架进行可插拔整合。
总之,Spring使得开发者能够编写更干净、更可管理、并且更易于测试的代码。
# 1.2 Spring Boot
约定优于配置 Convention Over Configuration
Spring Boot文档 (opens new window)
Spring Boot 是一个基于Spring框架搭建的微服务开发框架。
它并不是用来替代 Spring 的解决方案,而和 Spring 框架紧密结合进一步简化了Spring应用的整个搭建和开发过程。它的主导思想是约定优于配置,使得开发者能够更加专注于业务逻辑。
采用 Spring Boot 可以大大的简化开发模式,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。通过提供默认配置等方式让我们更容易使用。
它提供了通过Maven 依赖的 starter,可以直接获取所需的相关依赖包。它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Dubbo、kafka,ES等等。这些第三方库几乎可以零配置地开箱即用。
它内嵌了Tomcat、Jetty等Servlet容器,无需部署成war文件,可以一键启动和部署。
可使用注解开发,让spring框架更加便捷快速的应用,尽可能的实现自动配置。
# SpringBoot优缺点
优点:
- 快速构建项目
- 对主流开发框架的无配置集成
- 内嵌了Tomcat、Jetty等Servlet容器,项目可独立运行,无需外部依赖Servlet容器
- 提供运行时的应用监控
- 极大的提高了开发、部署效率
缺点:
- 由于大量的底层封装,高度自动化配置,出错不易定位问题所在
# 1.3 Spring Cloud
Spring Cloud官网 (opens new window)
Spring Cloud 是一个编程模型,提供了全套的分布式系统解决方案。为微服务开发提供了一系列的接口、标准,是用于构建微服务开发和治理的框架集合。
Spring Cloud 是一个比较新的微服务架构,2016年才推出1.0的RELEASE版本。但其更新特别快。
# 实现方案
而其实现方案有:
- Spring Cloud Netflex
- Spring Cloud Alibaba
# Spring Cloud架构图
# Spring Cloud 版本
Spring Cloud 是一个拥有诸多子项目的大型综合项目,其包含的各个子项目也独立进行内容更新迭代,各自维护着自己的发布版本号。
因此,为了避免Spring Cloud 的版本号与其子项目的版本号互相混淆,发根据字母表的顺序,采用伦敦地铁站的名字,来进行版本迭代。
而其SRX,对应的是service releases
,X是一个递增的数字。
例Brixton.SR5,表示Brixton的第5个Release版本。
# 1.4 Spring Cloud Netflex
Spring Cloud Netflex 是网飞公司提供的一套微服务架构解决方案。
使用 Spring Boot + Spring Cloud Netflex,实现微服务架构解决方案。但2018年底,Netflex宣布其系列技术栈进入维护模式,不再添加新特性。
# 1. 5 Spring Cloud Alibaba
Spring Cloud Alibaba官网 (opens new window)
Spring Cloud Alibaba GitHub代码 (opens new window)
Spring Cloud Alibaba 是由阿里提供,致力于微服务开发的一站式分布式应用解决方案。
目前Spring Cloud Alibaba已正式入驻Spring Cloud 官方。
阿里巴巴提供了一系列开源组件和云产品,用以支撑搭建分布式应用系统。方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
# 1.6 集群、分布式、SOA、微服务
# 集群
指同一个应用服务,部署多个实例,形成逻辑上的一个整体。每个实例节点都可以单独提供完整的服务。
# 分布式
指将不同的应用服务部署在不同的服务器上,单个应用服务不能提供完整的服务,需要整体进行协调提供服务。
分布式强调的是工作方式。
# SOA
面向服务的架构,是一种架构思想。主要目的是为了企业各个系统更加容易地融合在一起。
其中包含许多服务,各个服务之间通过网络调用进行通信,服务之间相互依赖。
主要采用ESB(企业服务总线)来进行服务间的交互。
# 微服务
微服务架构模式类似于SOA,基于SOA的去中心化设计,各个服务之间通过服务注册与发现组件进行交互,强调的是每个服务的单一职责原则也是面向服务的架构。
只不过各个服务拆分的更细。并且去掉Web服务规范(WS.*)、企业服务总线(ESB)重量级以及数据访问规范模式的依赖。
采用更简单、轻量级的协议进行通信,例如:REST 。
# 1.7 云原生
云原生从字面意思上来看可以分成云和原生两个部分。
云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。
原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如云服务的弹性和分布式优势。
# 1.8 IaaS、SaaS、PaaS
IaaS 基础设施即服务 Infrastructure as a server
PaaS 平台即服务 Platform as a Server
SaaS 软件即服务 Software as a Server
DaaS 数据即服务 Data as a Server
IaaS
、SaaS
、PaaS
、DaaS
是云计算租赁服务包含常见四种类型。
IaaS是基础设施即服务;PaaS是平台即服务;SaaS是软件即服务;DaaS是数据即服务。
# IaaS
IaaS是基础设施即服务。英文全称是Infrastructure as a server
。它的含义是把客户需要的基础设施环境搭建好,然后开放虚拟机或者硬件的租赁服务。
用户可以在云服务提供商提供的基础设施上部署和运行任何软件,包括操作系统和应用软件。
用户可以利用CPU、内存、显存、网络等资源。相对于其他三种服务比较自由度比较高。用户除了不能改变基础设施之外,可以在基础设施上自行安装任意的操作系统、任意的软件。
而且,用户还可以获得部分防火墙、路由器的权限。不过有一点需要注意,那就是,安装比较繁琐,一切需要自行控制时间。使用IaaS会有一个专门的网站,客户通过账号就可以管理自己的设备。
常见的产品有Amazong EC2、阿里云 (opens new window)、华为云 (opens new window)、百度云 (opens new window)、腾讯云 (opens new window)等。
优点:
相对其他几种服务,它的自由度、灵活度非常的高。客户可以自行安装自己喜欢的操作系统、方便自己的数据集、需要的软件等。所以,一切东西可以自行部署。我的理解是有点像学生时代去机房上网。
缺点:
它的维护成本比较高。使用它会导致Cpu、内存等等计算资源浪费。相关的人力资源和时间资源也会被浪费。相当于把资源分割成一个一个个性化的虚拟的电脑,它们之间互相独立。“土地”就只有这么多,分完了就没有了。而对于用户来说,必须要自行下载操作系统等等繁琐的操作。对于云端和用户来说,各种资源其实都浪费了。
# PaaS
PaaS是平台即服务,英文全称是Platform as a Server
。意思就是云端把客户所需的软件的平台作出租。
相当于就是云端已经给大家搭建好了平台。一般来说,在用户使用的时候,云端已经搭建好了操作系统、数据库、中间件,运行库等等。
用户只需要在这个搭建好的平台上下载、安装并使用自己需要的软件就可以了。
用户无需管理底层的基础设施,包括网络、服务器,操作系统或者存储。他们只能控制部署在基础设施中操作系统上的应用程序,配置应用程序所托管的环境的可配置参数。
常见的产品有Heroku (opens new window)等。
优点:
减少的搭建各种平台的损耗,为云端和用户节省了资源。
缺点:
相对IaaS来说,PaaS的自由度和灵活度比较低,不太适合专业性比较高的IT技术从业人员。相当于范围被限定,在特定的范围做一些事情。我的理解有点像QQ远程控制自己的电脑处理事情。
# SaaS
SaaS是软件即服务。英文全称是Software as a Server
。到了这个层次,云端已经把操作系统、中间件、数据库、运行库、软件应用都部署好了。连软件都不用安装了,用户登录之后直接可以上手操作。
SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得Saas平台供应商提供的服务。
国内比较知名的saas软件:比如项目管理软件Worktile (opens new window)、研发管理软件PingCode (opens new window)、Gmail、PayPal等。
优点:
方便快捷,资源利用可以非常优化。用户使用直接管理这些软件产生的数据就可以了。而使用的时候是模块化的,选择需要功能使用就行。多用户可以并行运行。
缺点:
软件多而且杂乱、安装复杂、使用复杂、运维复杂。用户如果不是批量采购的话购买价格昂贵。
# DaaS
DaaS是数据即服务,英文全称是Date as a Server
。云端部署好各种环境,收集大量数据并开始从中分析。最后把筛选、分析出来的数据作为服务。直白地说,就是大数据的一个类。涉及的服务有:客户关系管理(CRM)、企业资源规划(ERP)等。
优点:
从大量数据中提炼出精华,方便用户使用。
# 1.9 中台
中台这个概念,是阿里在2015年提出来的“小前台、大中台”战略思想。
即将各个业务线上的一些功能抽取出来,剥离个性,提取共性,形成一些可复用的组件。
大体上,中台可分为三类:业务中台、数据中台、技术中台。
# 1.10 服务
# 服务雪崩
服务链式调用时,若下游服务发送故障,导致上游服务请求堆积,从而导致上游服务也不可用。
解决服务雪崩的方式就是服务熔断和服务降级。
# 服务熔断
当服务A调用服务B,服务B不可用时,上游服务为了保证自身不受波及,直接返回一个设定的结果。
# 服务降级
当服务A压力过载时,可以通过关闭下游服务,或限流当前服务,来降低系统压力。
# 服务限流
对访问请求的并发进行限制。
# 1.11 REST、Restful
REST Representational State Transfer
# REST
REST 表现层状态转移,它是URL定位资源,用HTTP动词(GET、POST)描述操作。描述的是在网络中客户端与服务端的一种交互方式。
REST本身不实用,实用的事如何设计Restful接口。
# Restful
Restful是一种基于HTTP的应用设计风格,URL只使用名词来指定资源。
类型 | 描述 | RCUD | 幂等性 |
---|---|---|---|
GET | 用于查询资源 | R | 幂等 |
POST | 用于创建资源 | C | 非幂等 |
PUT | 用于更新(全部)资源 | U | 幂等 |
PATCH | 用于更新(部分)资源 | U | 非幂等 |
DELETE | 用于删除资源 | D | 幂等 |
# Restful API幂等性
Restful API,表示REST风格的网络接口API。
HTTP幂等方法是指无论调用多少次都不会有不同结果的HTTP方法。幂等性指的是作用于结果,而非资源本身。
- 如GET方法每次可能得到的结果不同,但并不影响资源;
- 而POST方法调用多次都会产生新的资源;
# 1.12 各类系统简称
简称 | 英文名 | 中文名 | 描述 |
---|---|---|---|
CRM | Customer Relationship Management | 客户关系管理 | CRM系统是一种以信息技术为手段、有效提高企业收益、客户满意度、雇员生产力的具体软件和实现方法。 |
ERP | Enterprise Resource Planning | 企业资源规划 | ERP管理系统是一个将物流、财流、信息流集成化管理的应用系统,包含采购、销售、库存、客户、财务等模块,用来进行企业资源优化,使管理效益最大化。 |
OA | Office Automation | 办公自动化 | OA系统就是用网络和OA软件构建的一个单位内部办公平台,用于辅助办公。包括通知公告、信息发布、流程管理、资料中心、办公用品管理、客户关系管理、人力资源管理、系统管理等模块。 |
HR | Human Resources | 人力资源 | 人力资源信息系统是运用信息技术收集、记录、储存、分析和提取组织人力资源信息,对人力资源进行管理和开发的系统。包括:组织规划、招聘管理、人事在职离职档案、员工履历、劳动合同、奖惩管理、培训管理、绩效管理、考勤管理、领导审批等。 |
# 二、微服务
# 2.1 架构
系统架构需要遵循的三个标准
提高敏捷性
及时响应业务需求,促进企业发展。
可以及时响应业务需求。业务需求的调整变化是不确定的,我们在架构设计时就应该考虑未来业务需求的变化性,使得我们的业务需求变化时,可以更加快捷,灵活的响应变化。
提高用户体检
提升用户体验,减少用户流失。
不管是前端还是后端,都应该站在用户的角度来设计。前端设计更人性化,合理化,便捷化,美观化。后端设计也是,请求响应更迅速,数据更准确合理。
降低成本
降低增加产品、客户或业务方案的成本。
设计时考虑后期项目的扩展性,业务需求的变化,业务数据的增加。从而降低项目后期迭代的人力资源成本,开发周期成本,运维成本等。
# 2.2 单体应用
Monolithic 单体式开发
单体应用,就是大名鼎鼎的 all in one
的风格。
这种风格的应用就把所有的东西都写在一个应用里面,比如我们熟悉的OA,CRM,ERP系统。
其所有的业务、所有的代码都放在一起,打成打成一个war/jar包,然后把war包放在JavaEE容器中运行。
# 单体架构特点
- 所有的功能集成在一个项目工程中
- 所有的功能打一个war包/jar包部署到Docker或服务器
- 应用与数据库分开部署
- 通过部署应用集群和数据库集群来提高系统的性能
# 单体架构的优势
- 项目架构简单
- 前期开发成本低
- 周期短,小型项目的首选
- 易于测试:因为不需要依赖其他接口,测试可以节约相当多时间了
- 易于部署:你只需要将项目打包生成一个jar包,部署在运行环境中即可
# 单体架构的不足
- 业务紧密耦合,牵一发而动全身,不灵活;
- 全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护;
- 技术栈受限;
- 单体结构的部署方式无法承载日益增长的业务流量;
- 系统性能扩展只能通过扩展集群结点,成本高、有瓶颈;
# 2.3 什么是微服务
2014年一个叫 Martin Fowler
(同时也是经典著作《重构:改善既有代码的设计》一书的作者)发表了一篇关于微服务的博客,比较形象生动地介绍了什么是微服务,然后微服务才慢慢被人所熟知。
2014年为微服务元年。
他说微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTTP的方式进行互联互通。
简单说:微服务架构是一种架构思想,架构就是为了解耦,高内聚低耦合。
实际的开发方式采用的是分布式系统开发 Spring Boot
+ Spring Cloud
。
# 2.4 微服务十二要素
12-Factor为构建软件即服务(SaaS)提供了方法论。
12因素方法可以应用于任何编程语言编写的应用程序,以及使用任何支持服务组合(数据库、队列、内存缓存等)的应用程序。
# 特点
使用声明性格式进行设置自动化,以尽量减少新开发人员加入项目的时间和成本;
与底层操作系统保持干净的契约,提供执行环境之间的最大可移植性;
适合在现代云平台上部署,无需服务器和系统管理;
最大限度地减少开发和生产之间的差异,实现连续部署以获得最大的灵活性;
并且可以在不对工具、架构或开发实践进行重大更改的情况下进行扩展。
# 十二要素
The Twelve Factors
基准代码 Codebase (opens new window)
One codebase tracked in revision control, many deploys
一份基准代码(Codebase),多份部署(deploy)。
依赖 Dependencies (opens new window)
Explicitly declare and isolate dependencies 显式声明和隔离依赖
通过 依赖清单 dependency declaration ,确切地声明所有依赖项。此外,在运行过程中通过 依赖隔离 工具来确保程序不会调用系统中存在但清单中未声明的依赖项。
-
Store config in the environment 代码和配置严格分离
12-Factor推荐将应用的配置存储于环境变量中。
后端服务Backing services (opens new window)
Treat backing services as attached resources 把后端服务当作附加资源
后端服务是指程序运行所需要的通过网络调用的各种服务,如数据库(MySQL (opens new window)),消息/队列系统(RabbitMQ (opens new window)),以及缓存系统(Redis (opens new window))。
构建、发布、运行Build, release, run (opens new window)
Strictly separate build and run stages 严格分离构建和运行
基准代码 转化为一份部署(非开发环境)需要以下三个阶段:
构建阶段 是指将代码仓库转化为可执行包的过程。构建时会使用指定版本的代码,获取和打包 依赖项,编译成二进制文件和资源文件。
发布阶段 会将构建的结果和当前部署所需 配置 相结合,并能够立刻在运行环境中投入使用。
运行阶段 (或者说“运行时”)是指针对选定的发布版本,在执行环境中启动一系列应用程序 进程。
进程Processes (opens new window)
Execute the app as one or more stateless processes 以一个或多个无状态进程运行应用
12-Factor 应用的进程必须无状态且无共享。
端口绑定Port binding (opens new window)
Export services via port binding 通过端口绑定来提供服务
互联网应用 通过端口绑定来提供服务 ,并监听发送至该端口的请求。
并发Concurrency (opens new window)
Scale out via the process model 通过进程模型进行扩展
在 12-factor 应用中,进程是一等公民。
Java 进程在程序启动之初, JVM 就提供了一个超级进程储备了大量的系统资源(CPU 和内存),并通过多线程实现内部的并发管理。
易处理Disposability (opens new window)
Maximize robustness with fast startup and graceful shutdown 快速启动和优雅终止可最大化健壮性
12-Factor 应用的 进程 是 易处理(disposable)的,意思是说它们可以瞬间开启或停止。这有利于快速、弹性的伸缩应用,迅速部署变化的 代码 或 配置 ,稳健的部署应用。
开发环境与生产环境等价Dev/prod parity (opens new window)
Keep development, staging, and production as similar as possible 尽可能的保持开发,预发布,线上环境相同
12-Factor 应用想要做到 持续部署 就必须缩小本地与线上差异。
-
Treat logs as event streams 把日志当作事件流
管理进程Admin processes (opens new window)
Run admin/management tasks as one-off processes 后台管理任务当作一次性进程运行
# 2.5 微服务优点
对比传统单体项目,微服务有以下优点:
- 服务部署更灵活。每个应用都是一个独立的服务,不依赖于其他服务,降低了系统间的耦合度;
- 技术选型更灵活。微服务可以根据业务特点,灵活选择技术栈;
- 服务性能提高。不管是服务启动的时间,还是服务调用的QPS,都可以通过服务扩缩容进行动态调整;
- 服务可用性提高。服务升级部署,不用担心影响整个流程业务,只需将所对应的服务进行升级部署;
- 项目团队管理更灵活。不同的服务交给对应技术的开发人员;
- 系统开发更便捷。前后端分离,不同模块之间,不用相关等待;
- 代码复用;
- 各服务独立部署,易扩展;
- DevOps自动化运维;
# 2.6 微服务缺点
- 服务之间调用复杂度提高;
- 网络抖动问题;
- 容错问题;
- 服务雪崩问题;
- 高并发问题;
- 分布式问题:分布式主键ID、分布式一致性、分布式事务、分布式锁;
- 测试不易:多服务之间需要数据依赖、前后端之间的数据交互;
- 运维的成本提高:服务多,所需资源相应也增加,并且对运维人员门槛也提高;
# 2.7 微服务架构设计模式
# 聚合设计模式
聚合模式调用多个服务服务实现应用程序所需的功能,常用于数据整合业务,例如:报表服务。
# 代理设计模式
代理设计模式是聚合设计模式的变种。客户端(即代理端)不进行聚合数据,但会根据业务需求的差别调用不同的服务。常用的代理服务是网关服务。
# 分支设计模式
这种模式是聚合器模式的扩展,允许同时调用两个微服务链。
# 异步消息传递设计模式
虽然REST设计模式非常流行,但它是同步的,会造成阻塞。因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应,如下图所示
# 链式设计模式
在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。
# 数据共享设计模式
自治是微服务的设计原则之一,就是说微服务是全栈式服务。但在重构现有的“单体应用(monolithic application)”时,SQL数据库反规范化可能会导致数据重复和不一致。因此,在单体应用到微服务架构的过渡阶段,可以使用这种设计模式;
# 2.8 微服务的目的
使用微服务,就是要实现三大指标、解决四大问题。
# 三大指标
- 高可用 HA 一直可以用 ,99.9999% (稳)
- 高性能 响应速度(快)
- 高并发 系统的承载能力(多)
# 四大问题
这么多服务,客户端如何访问
——API网关 统一访问入口
zuul、Spring Cloud Gateway
这么多服务,如何治理
- ——服务注册与发现 Euraka 、 Nacos
- ——链路追踪 Zipkin 、 Skywalking
- ——日志收集 ELK(ElasticSearch、 Logstash、 Kibana)
这么多服务,服务与服务之间如何通信
——同步通信(HTTP 、RPC) 对内RPC、对外REST
HTTP: Ribbon 、 Feign
RPC: Dubbo
——异步通信(MQ)
RabbitMQ 、 RocketMQ 、 Kafka
这么多服务,服务挂了怎么办
——服务熔断、服务降级、服务限流
Hystrix 、 Sentinel
# 三、Spring Cloud Alibaba
Spring Cloud Alibaba官网 (opens new window)
Spring Cloud Alibaba GitHub (opens new window)
Spring Cloud Alibaba
是阿里提供发致力于微服务开发的一站式分布式应用解决方案。
目前Spring Cloud Alibaba
已正式入驻Spring Cloud
官方。
阿里巴巴提供了一系列开源组件和云产品,用以支撑搭建分布式应用系统。方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。
参考文档 请查看 WIKI (opens new window) 。
此外,阿里云同时还提供了 Spring Cloud Alibaba 企业版 微服务解决方案 (opens new window),包括无侵入服务治理(全链路灰度,无损上下线,离群实例摘除等),企业级 Nacos 注册配置中心和企业级云原生网关等众多产品。
# 3.1 主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux、OpenFeign、RestTemplate、Spring Cloud Gateway、Zuul、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
更多功能请参考 Roadmap (opens new window)。
# 3.2 组件
- Sentinel:熔断器,服务降级、流量控制、系统负载保护
- Nacos:服务注册中心、配置中心和服务管理平台
- RocketMQ:分布式消息系统,服务异步通信,分布式消息队列
- Dubbo: Java RPC 框架,服务同步通信,对内RPC通信
- Seata:分布式事务
- Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),云存储服务。
- Alibaba Cloud SchedulerX:分布式任务调度产品
- Alibaba Cloud SMS:短信服务
# 开源组件
Sentinel
阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Flow control and service degradation:flow control, circuit breaking and system adaptive protection with Alibaba Sentinel (opens new window)
Nacos
阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Service registration and discovery:instances can be registered with Alibaba Nacos (opens new window) and clients can discover the instances using Spring-managed beans. Supports Ribbon, the client side load-balancer via Spring Cloud Netflix
Distributed Configuration:using Alibaba Nacos (opens new window) as a data store
RocketMQ
Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。
Event-driven:building highly scalable event-driven microservices connected with Spring Cloud Stream RocketMQ (opens new window) Binder
Message Bus: link nodes of a distributed system with Spring Cloud Bus RocketMQ
Seata
阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Distributed Transaction:support for distributed transaction solution with high performance and ease of use with Seata (opens new window)
Dubbo
Apache Dubbo™ 是一款高性能 Java RPC 框架。
Dubbo RPC:extend the communication protocols of Spring Cloud service-to-service calls by Apache Dubbo RPC (opens new window)
# 商业化组件
Alibaba Cloud OSS (opens new window)
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
Alibaba Cloud SchedulerX (opens new window)
阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。
Alibaba Cloud SMS (opens new window)
SMS(Short Message Service)覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
Alibaba Cloud ARMS (opens new window)
应用实时监控服务,帮助企业实现全栈性能监控与端到端追踪诊断。
Alibaba Cloud Redis (opens new window)
云数据库 Redis 版是一种全托管、兼容Redis协议的内存数据库服务,包含社区版Redis和企业版Tair,支持主从、集群和读写分离架构,具备低延迟、大吞吐、弹性扩缩容的特点。
Alibaba Cloud RDS MySQL (opens new window)
云数据库RDS MySQL。
# 四、微服务解决方案
基于Spring Cloud Alibaba构建的微服务解决方案,包含如下组件
组件 | 实现 | 来源 | 描述 |
---|---|---|---|
网关 API Gateway | Spring Cloud Gateway (opens new window) | Spring | 对外服务提供的统一入口 |
注册中心 Service Registry | Nacos (opens new window) | Alibaba | 统一治理,服务注册与发现 |
配置中心 Config Server | Nacos (opens new window) | Alibaba | 统一配置,动态配置 |
鉴权 | Spring Security OAuth2 (opens new window) | Spring | 认证与授权 |
熔断器 | Sentinel (opens new window) | Alibaba | 服务熔断、服务优雅降级、服务限流 |
链路追踪 | Skywalking (opens new window) | Apche | 分析性能、快速定位 |
REST | Spring Cloud OpenFeign (opens new window) | Spring | 同步通信,对外REST |
RPC | Dubbo (opens new window) | Alibaba | 同步通信,对内RPC |
消息队列 | RocketMQ (opens new window) | Alibaba、Apche | 异步通信 |
缓存 | Redis (opens new window) | Redis Ltd. | |
分布式锁 | Redisson (opens new window) | ||
分布式主键 | Leaf (opens new window) | 美团 | |
分布式事务 | Seata (opens new window) | Alibaba | |
分布式调度中心 | XXL-JOB (opens new window) | XXL开源社区 | |
分布式对象存储 | Alibaba Cloud OSS (opens new window) | Alibaba | |
短信服务 | Alibaba Cloud SMS (opens new window) | Alibaba | |
日志收集 | ELK (opens new window) | elastic |
# 五、网关
网关是对外服务提供的统一入口,隐藏内部架构服务的实现。
实现方案
- Netflex:Zuul (同步阻塞)
- Alibaba:Spring Cloud Gatway (基于Webflux的异步非阻塞)
# 网关作用
- 安全认证:对每一个访问的请求都进行认证(过滤),拒绝非法请求;
- 动态路由:动态将请求路由到后端内部服务,
- 请求监控:对请求进行监控,记录请求响应日志、统计访问量。
- 限流:令牌桶、漏桶。
# Spring Cloud Gatway
Spring Cloud Gateway官网 (opens new window)
Spring Cloud Gateway提供了对API层的精确控制,集成了Spring Cloud服务发现和客户端负载平衡解决方案,以简化配置和维护。
# 六、认证与授权
# OAuth2.0
OAuth 2.0 文档 (opens new window)
OAuth(开放授权)是一个开放标准,为用户资源的授权提供了一个安全、开放而又简易的标准。
允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码供给第三方应用或分享他们数据的所有内容。
OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。很大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。
OAuth2.0协议特点
- 简单:不管是OAuth服务提供者还是应用开发者,都很易于理解与使用;
- 安全:没有涉及到用户密钥等信息,更安全更灵活;
- 开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth;
# Spring Security
Spring Security (opens new window)
Spring Security是一个安全框架,能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案。
Spring Security基于Servlet过滤器、IoC和AOP,为Web请求方法调用提供身份确认和授权处理。
# Spring Security OAuth2
spring-security-oauth官网 (opens new window)
OAuth2的服务提供方包含两个服务:
- 认证服务(Authorization Server)
- 授权服务(Resource Server)
# 七、注册中心
注册中心主要用来实现服务治理、服务发现。
实现方案
- Netflex:Euraka
- Alibaba:Nacos
# Nacos
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos致力于服务注册与发现、服务健康监测、动态配置服务。
Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos核心功能
- 服务注册
- 服务心跳
- 服务健康监测
- 服务发现
- 服务同步
# 八、熔断器
熔断器,又称断路器。分布式应用开发通过微服务拆分,带来的问题是,我们要确保服务调用链,某一环出现问题,而不致于影响整体链路。相应的处理手段有:
- 重试机制
- 限流
- 熔断机制
- 负载均衡
- 降级(本地缓存)
实现方案
- Netflex:Hystrix
- Alibaba:Sentinel
# 作用
为了防止服务发送雪崩效应,采用熔断机制进行服务保护,对服务调用进行隔离,使接口调用快速失败并迅速恢复正常、或者回退并优雅降级。
服务降级是指当请求其他服务出现故障或超时的时候,调用自身服务fallback的方法进行响应。
代码实现通常采用Feign+断路器的方式进行整合。
例:基于Feign,开启Feign对Hystrix的支持(添加配置),然后在@FeignClient注解的属性fallback中,定义实现类。
# Sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
# Sentinel 的特征
- 丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的 双十一大促流量 的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
- 完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。
# 九、链路追踪
distruibuted tracing
分布式链路追踪,就是所谓的 APM(应用性能管理)。
微服务架构是通过业务来划分服务的,使用 REST 调用。对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。
随着服务越来越多,服务间链式调用会越来越复杂,那么就要使用APM应用性能管理来分析性能、快速定位问题。
实现方式
Netflex:Zipkin
Alibaba:Skywalking
# Skywalking
Apache SkyWalking官网 (opens new window)
用于分布式系统的应用程序性能监视工具,特别是为微服务、云本机和基于容器(Kubernetes)的体系结构设计的。
Apche Skywalking 是用来收集、分析、聚合、可视化的APM系统。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
项目中可使用Java探针无侵入式植入,链路数据收集器将数据整合分析并存储,且提供可视化UI。
# 组件
Skywalking Agent: 使用 JavaAgent 做字节码植入,无侵入式的收集,并通过 HTTP 或者 gRPC 方式发送数据到 SkyWalking Collector。
SkyWalking Collector: 链路数据收集器,对 agent 传过来的数据进行整合分析处理并落入相关的数据存储中。
Storage: SkyWalking 的存储,时间更迭,SW 已经开发迭代到了 6.x 版本,在 6.x 版本中支持以 ElasticSearch(支持 6.x)、Mysql、TiDB、H2、作为存储介质进行数据存储。
UI: Web 可视化平台,用来展示落地的数据。
# SkyWalking 功能特性
- 多种监控手段,语言探针和服务网格(Service Mesh)
- 多语言自动探针,Java,.NET Core 和 Node.JS
- 轻量高效,不需要大数据
- 模块化,UI、存储、集群管理多种机制可选
- 支持告警
- 优秀的可视化方案
# 十、同步通信
同步通信遵循 对内RPC、对外REST。
HTTP
: Ribbon 、 FeignRPC
: Dubbo
REST
表现层状态转移 REST (Representational State Transfer)
它是URL定位资源,用HTTP动词(GET/PUT/DELETE)描述操作。描述的是在网络中客户端与服务端的一种交互方式。
REST本身不适用,实用的是如何设计Restful接口(Restful API)——即REST风格的HTTP接口。
# Feign
Feign声明式调用,REST客户端,让REST调用更简单。
Feign提供了HTTP请求的模板,通过编写简单的接口和插入注释,即可实现就像调用本地方法一样,去跨服务调用接口,完成HTTP请求。
# Spring Cloud OpenFeign
# Dubbo
Dubbo是一个高性能的轻量级的java RPC 分布式服务框架。主要作用是实现RPC通信,实现面向接口的远程方法调用。
Dubbo由5部分组成:Dubbo容器、服务提供者、服务消费者、注册中心、监控中心。
它提供了以各种非常简单的模型——生产者/消费者模型。服务生产者提供服务,服务消费者消费服务。
对外REST,对内RPC。在服务内部之间通信,采用Dubbo的RPC进行服务接口调用,使得调用远程方法,就像调用本地方法一样便捷快速。
# 十一、异步通信
异步通信采用消息队列。
# 消息队列MQ
- MQ:MessageQueue,消息队列。
- 队列,是一种FIFO 先进先出的数据结构。
消息队列是一个通信模型,即生产者/消费者模型。消息中间件中有两个角色:消息生产者和消息消费者,消息由生产者发送到MQ进行排队,然后按原来的顺序交由消息的消费者进行处理。
它屏蔽了底层通信协议(TCP),在TCP协议之上构建。
消息队列作为高并发系统的核心组件之一,能够帮助业务系统解构提升开发效率和系统稳定性。
# MQ的作用
异步:异步能提高系统的响应速度、吞吐量。
系统解耦: 解决不同重要程度、不同能力级别系统之间依赖导致一死全死。
减少服务之间的影响,提高系统整体的稳定性以及可扩展性。
解耦后可以实现数据分发。生产者发送一个消息后,可以由一个或者多个消费者进行消
费,并且消费者的增加或者减少对生产者没有影响。
削峰填谷: 以稳定的系统资源应对突发的流量冲击。主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题。
提升性能: 当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统。
蓄流压测 :线上有些链路不好压测,可以通过堆积一定量消息再放开来压测。
# MQ分类
无Broker:ZeroMQ
有Broker
- 重Topic:Kafka、RocketMQ
- 轻Topic:RabbitMQ
重Topic:是指消息是主动推送给消费者,生产者将消息发至Broker上,由Broker进行主动推送给对应的消费者。
轻Topic:指消费者订阅队列,类似于主动拉取队列。
# MQ的优点
- 异步(Asynchronous)
- 解耦(Decoupling)
- 削峰填谷
# MQ的缺点
系统可用性降低
系统引入的外部依赖增多,系统的稳定性就会变差。一旦MQ宕机,对业务会产生影响。这就需要考虑如何保证MQ的高可用。
系统复杂度提高
引入MQ后系统的复杂度会大大提高。以前服务之间可以进行同步的服务调用,引入MQ后,会变为异步调用,数据的链路就会变得更复杂。并且还会带来其他一些问题。比如:如何保证消费不会丢失?不会被重复调用?怎么保证消息的顺序性等问题。
消息一致性问题
A系统处理完业务,通过MQ发送消息给B、C系统进行后续的业务处理。如果B系统处理成功,C系统处理失败怎么办?这就需要考虑如何保证消息数据处理的一致性。
# MQ产品特点比较
产品 | 客户端SDK | 优点 | 缺点 | 使用场景 |
---|---|---|---|---|
RabbitMQ | Java, .NET, C++ etc. | 消息可靠性高,功能全面 | 吞吐量比较低,消息积累会影响性能,erlang语言不好定制 | 小规模场景 |
RocketMQ | Java, C++, Go | 高吞吐,高性能,高可用,功能全面 | 开源版部分功能有缺陷(例如延迟消息只有固定18个时间等级) | 几乎全场景 |
kafka | Java, Scala etc. | 吞吐量非常大,性能非常好,集群高可用 | 会丢数据,功能比较单一 | 日志分析、大数据采集 |
官方文档:常用MQ产品对比 (opens new window)
另外,关于这三大产品更详细的比较,可以参见如下表:
# RocketMQ
RocketMQ的官网地址: RocketMQ (opens new window)
RocketMQ GitHub地址:https://github.com/apache/rocketmq (opens new window)
官方文档:为什么选择RocketMQ (opens new window)
Apache Alibaba RocketMQ
是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache
,现在是Apache的一个顶级项目。
由Java语言开发,底层采用Netty通信。
目前客户端支持Java, C++, Go。
默认端口为9876
。
目前RocketMQ在阿里云上有一个购买即可用的商业版本,商业版本集成了阿里内部一些更深层次的功能及运维定制。我们使用的是Apache的开源版本。开源版本相对于阿里云上的商业版本,功能上略有缺失,但是大体上功能是一样的。
消息中间件中有两个角色:消息生产者和消息消费者,RocketMQ 里同样有这两个概念。
- 消息生产者负责创建消息并发送到 RocketMQ 服务器,RocketMQ 服务器会将消息持久化到磁盘;
- 消息消费者从 RocketMQ 服务器拉取(推送)消息,提交给应用进行消费。
# RocketMQ 特点
- 支持严格的消息顺序
- 支持七种模式:简单模式、顺序模式、广播模式、延迟模式、批量模式、过滤模式、事务模式
- 亿级消息堆积能力
- 比较友好的分布式特性
- 同时支持 Push 与 Pull 方式消费消息
- 历经多次天猫双十一海量消息考验
# RocketMQ使用场景
RocketMQ 在阿里集团被广泛应用在订单, 交易,充值,流计算,消息推送,日志流式处理,binlog 分发等场景。
# RocketMQ 优势
- 支持事务型消息(消息发送和 DB 操作保持两方的最终一致性,RabbitMQ 和 Kafka 不支持);
- 支持结合 RocketMQ 的多个系统之间数据最终一致性(多方事务,二方事务是前提);
- 支持 18 个级别的延迟消息(RabbitMQ 和 Kafka 不支持);
- 支持指定次数和时间间隔的失败消息重发(Kafka 不支持,RabbitMQ 需要手动确认);
- 支持 Consumer 端 Tag 过滤,减少不必要的网络传输(RabbitMQ 和 Kafka 不支持);
- 支持重复消费(RabbitMQ 不支持,Kafka 支持);
# 十二、高可用
# keepalived
采用一虚拟路由算法,虚拟出一个新的IP地址,而后利用IP地址代理多个真实服务器。
避免IP单点故障;
核心配置:
1、定义VIP的网卡(interface
);
2、优先级(prbrity
);
3、认证(authentication
);
4、设置虚拟IP地址(virtual_ipaddress
);
# HAProxy
是一个开源、高性能的、基于TCP和HTTP的千万级高并发负载均衡软件。
优点:
1、高性能、高并发;
2、支持8种负载均衡算法;
3、支持虚拟主机功能;
4、拥有服务器性能监控工具(UI界面);