微服务概述
微服务定义
微服务是由单一应用程序构成的小服务,拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务用HTTP API通讯,服务会使用最小规模的集中管理技术(Docker),服务可以用不同的编程语言与数据库等。
单体应用
传统应用技术栈
- LAMP(Linux + Apache + MySQL + PHP)
- MVC(Spring + iBatis/Hibernate + Tomcat)
优点
- 学习成本低,开发上手快
- 测试,部署,运维方便
缺点
- 部署效率低下
- 团队协作开发成本高
- 系统高可用性能差
- 线上发布慢
解决办法用服务化的思想
服务化
定义:服务化就是把传统的单机应用中通过JAR包依赖产生的本地方法调用,改造成通过RPC接口产生的远程方法调用。
通过服务化,可以解决单体应用膨胀、团队开发耦合度高、协作效率低下等问题
单体应用拆分成服务化的条件
第一阶段:项目的目标是快速开发和验证想法,证明产品思路是否可行。初级阶段产品设计的功能简单,适合采用快速迭代的方式,架构也不要过度设计。集中地进行开发、测试和运维。
第二阶段:项目经过一段时间的运营,需要增加更多的功能来完善产品。需要多功能混合开发、测试和部署,会导致不同的功能之间相互影响。部署上线需要所有的功能测试完成才能上线。此时需要对项目进行服务化拆分。
服务拆分的前置条件
- 服务如何定义(服务描述)
- 服务如何发布和订阅(注册中心)
- 服务如何监控(服务监控)
- 服务如何治理(服务治理)
- 故障如何定位(服务最总)
服务拆分的方式
- 纵向拆分,从业务纬度进行拆分。标准是按照业务的关联程度来决定,关联比较密切的业务适合拆分一个服务,功能相对比较独立的业务适合单独拆分为一个服务
- 横向拆分,从公共且独立功能纬度拆分。标准是按照是否有公共的被多个其他的服务调用,且依赖的资源独立不与其他业务耦合。
微服务
微服务组成架构的基本组件
- 服务描述
- 注册中心
- 服务框架
- 服务监控
- 服务追踪
- 服务治理
组件介绍
服务描述:对外提供的服务的名称,调用此服务需要的传递的参数,服务返回的结果是何种格式,如何解析返回的结果。
服务描述的三种方式
- RESTful API 常用于HTTP协议的服务描述,用Wiki或Swagger进行管理。
- XML配置 常用于RPC协议的服务描述,通过*.xml配置文件定义接口名,参数,返回值类型
- IDL文件 常用于Thrift和gRPC等跨语言服务调用框架中,gRPC通过Protobuf文件来定义服务的接口名、参数以及返回值类型
注册中心:为服务提供者将自己的服务以及地址发布到注册中心,服务消费者则从注册中心查询所需要的调用的服务地址,然后发起请求。服务提供者和服务消费者通过注册中心,来取得联系。
服务框架:通过更具体和更详细的信息来为服务提供之和服务消费者二者之间来取得联系。包括服务通信采用何种协议(四层TCP、UTP协议。七层的HTTP协议)。服务传输采用什么方式(同步或异步。单连接或是多路复用)。数据压缩采用什么格式(JSON序列化。Java对象序列化。Protobuf序列化)
服务监控:服务提供者和服务消费者正常发起调用,取得联系。就需要对二者的调用情况进行监控。来判断调用是否正常。
监控主要采用三个流程
- 指标收集
- 数据处理
- 数据展示
服务追踪:服务提供者和服务消费者之间调用,进行监控,还需要记录服务调用经过的每一层链路。一旦出现调用异常,方便对问题和故障进行定位。
服务追踪原理如何下
- 服务消费者发起调用前,会在本地按照一定的规则生成一个 requestid,发起调用时,将 requestid 当作请求参数的一部分,传递给服务提供者。
- 服务提供者接收到请求后,记录下这次请求的 requestid,然后处理请求。如果服务提供者继续请求其他服务,会在本地再生成一个自己的 requestid,然后把这两个 requestid 都当作请求参数继续往下传递。
服务治理:通过前面的监控和追踪来判断和定位问题故障所在。就需要通过一系列的手段来保证在各种意外的情况下,来保障服务仍能正常工作。
常见故障如下
- 单机故障(通过策略,自动摘除故障节点)
- 单IDC故障(通过自动切换故障IDC,到正常IDC)
- 依赖服务不可用(通过熔断机制,停止发起服务调用,直接返回结果)
优点
- 服务拆分粒度更细,易于开发和维护
- 服务独立部署和维护
- 单个微服务启动和部署比较宽
- 服务治理能力要求高
- 不受技术限制
缺点
- 团队必须掌握微服务原理才能开发
- 项目是分布式,项目结构复杂,增加部署难度
- 接口调整成本高,重复劳动
微服务设计原则
- 单一职责原则
- 服务自治原则
- 轻量级通信机制
- 微服务粒度
微服务架构技术选型
- 开发框架的选择
- 运行平台的选择