软件架构进化,我的经历:
- 一层架构
- MVC (ssh, ssm)
- dubbo (分离前后端,单体变2个)
上面都是单体架构,而且现实中大多数公司也都还在用单体架构
单体架构
单体架构: 功能,业务集中在一个发布包中,部署运行在同一个进程中;
优势: 易于开发,测试,部署,水平伸缩
现在的缺点:
- 代码膨胀,难以维护
- CD交付周期长; 构建、部署成本大
- 新人上手周期过长(说的就是我…)
- 创新困难
- 可扩展性差(一个进程,无论是垂直扩展增强载体机器性能,还是水平扩展增大/强集群性能,都很贵)
微服务特征
- 单一职责
- 轻量级通信
- 隔离性
- 每个微服务有自己的存储系统
- 技术多样性, 只要能提供API即可
诞生背景
- 容器技术成熟
- 敏捷开发, 精益方法 (频繁修改,开发,测试,上线)
e.g. 项目架构
1 | Client: |
注:
- 并不是所有的微服务都能提供REST API, 这里只是举个例子,假设这里所有的微服务都暴露接口
- 上面各个微服务之间可以通讯,这里没有画出来
网关
并不是所有的微服务都需要,或者都能,提供REST API;
提供REST API:表明是基于HTTP通信的, 但是有的可能是基于RPC,或者Dubbo, Thrift,还可能是基于MQ的;
所以需要网关。网关还可能有其他的功能,比如授权,监控,负载均衡,缓存, etc.
注: HTTP并不等于REST, HTTP是一个属于应用层的协议,REST是一种风格
微服务的划分
DDD: Domain Driven Design: 精细划分微服务各个服务的界限
之前看的DDD关于MVC三层架构的划分,DDD精髓在于领域模型准确反映了业务语言; 我的理解: 所以不用思考是用 controller还是service来写业务逻辑, 而是写在repository中, 也就是之前考虑的dao层中本身就包含业务逻辑
微服务架构引入的问题
- 微服务之间如何通讯?
- 单体架构中没有这个问题,因为都在一台机器/一个集群上
- 微服务如何发现彼此?
- 单体架构中只有Dubbo有这个问题: Dubbo中是用ZK解决的,ZK作为中间人,web端(消费端)向中间人要这个服务,服务端把服务传给ZK
- 除了ZK之外,还有Eureka, etcd, Consul, etc.
- 微服务怎样部署?更新?扩容?
- 单体架构中,各个公司有差异,原始的可能用FTP修改重启,自动化的可能e.g. Jenkins从master拉取,在预发环境,编译环境中改写然后脚本直接同步到生产环境,重启;
- 微服务数量庞大,可能一个功能需要100+个微服务同时修改上线,手动上线更新是不可能的,所以要用服务编排框架