1 整体架构
1 微服务架构图
- 服务集群
- 传统的单体架构,业务功能耦合在一起,难以升级维护
- 微服务根据业务功能模块将单体的项目拆分成许多独立的服务,每个服务独立开发和部署、完成一部分业务功能
- 一个大型的互联网项目可能包含成百上千的服务,最终形成一个服务集群
- 一个业务功能往往需要多个服务共同来完成,比如一个请求可能先调用了服务A,然后服务A再调用服务B,服务B再调用服务C…
- 注册中心
- 注册中心可以记录服务集群中每一个服务的IP、端口等信息
- 当需要调用某个服务时,不需要知道服务的IP等信息,只需要从注册中心获取即可
- 配置中心
- 每个服务都有自己的配置文件,配置中心用于统一管理服务的配置文件
- 更改服务配置时不需要到具体的服务中去修改,直接改配置中心的配置文件即可,修改后配置中心会通知具体的服务,实现配置的热更新
- 服务网关
- 用户调用服务时找的是服务网关
- 服务网关用于权限控制(用户身份校验、服务调用合法性校验)、将用户请求路由到具体的服务、路由的过程中可能还包含负载均衡
- 分布式缓存
- 分布式缓存用于缓解数据库的压力
- 缓存将数据存放在内存中,访问速度比数据库快很多
- 分布式搜索
- 简单的查询可以走缓存和数据库,但是海量数据的复杂搜索、统计和分析等,需要用到分布式搜索
- 消息队列
- 消息队列用于实现服务之间的异步通信,可以提高服务的并发性
- 一个业务往往会跨越多个服务,如果一个服务在调用另一个服务时,一直等待另一个服务的完成,那么将严重影响效率
- 使用消息队列后,如果服务A需要调用服务B和C,A只需要给服务B和C发送一条消息,然后就可以结束服务了
- 分布式日志和系统监控
- 庞大复杂的服务集群需要有效排查错误的手段,因此引入了分布式日志和系统监控组件
- 分布式日志可以记录服务的运行日志,统一地进行日志的管理
- 系统监控组件可以实时监控服务集群中每一个服务节点的运行状态、CPU负载、内存占用等等信息
- 微服务的部署
- 微服务集群中的服务数量可能达到成百上千个,难以采用手动部署
- 因此我们需要Jenkins对服务进行自动化编译、利用docker打包编译后的服务形成镜像、利用k8s或Rancher实现服务的自动化部署
2 微服务技术栈
2 服务架构演变
随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?
1 单体架构
将业务的所有功能集中在一个项目中开发,打成一个包部署
单体架构的优缺点
优点
- 架构简单
- 部署成本低
缺点
- 耦合度高(维护困难、升级困难)
2 分布式架构
根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务
分布式架构的优缺点
优点
- 降低服务耦合
- 有利于服务升级和拓展
缺点
- 服务调用关系错综复杂
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考
- 服务拆分粒度如何
- 服务集群地址如何维护
- 服务之间如何实现远程调用
- 服务健康状态如何感知(如果一个服务调用了一个挂了的服务,将发生级联失败)
人们需要制定一套行之有效的标准来约束分布式架构
3 微服务
微服务架构特征
- 单一职责
微服务相比于分布式架构拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
- 独立自治
团队独立、技术独立、数据独立,部署独立、交付独立
- 面向服务
服务对外暴露业务接口
- 隔离性强
服务调用做好隔离、容错、降级,避免出现级联问题(尽量避免一个服务挂了,连带挂一片服务)
微服务与分布式架构
- 微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务的独立性和灵活性。做到高内聚,低耦合。
- 可以认为微服务是一种经过良好架构设计的分布式架构方案
3 微服务相关技术
微服务技术对比
- SpringCloudAlibaba相当于同时兼容Dubbo和SpringCloud两种体系
微服务企业需求
SpringCloud
SpringCloud是目前国内使用最广泛的微服务框架
SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。
其中常见的组件包括:
4 微服务Demo
1 微服务拆分原则
- 不同微服务,不能重复开发相同业务
- 微服务数据独立,不要访问其它微服务的数据库
- 微服务可以将自己的业务暴露为接口,供其它微服务调用
2 Demo实现
cloud_demo