一句话导读
微服务架构设计方法有:领域驱动设计DDD(Domain-Driven-Design)、12因素应用(12-Factor App)、事件驱动架构EDA(Event-Driven Architecture)等等,但是他们都必须遵守微服务架构设计的一些共同特点,本文主要说明微服务架构设计的原则、要点、以及注意事项。
目录
1. 分层架构风格(Layered Architecture)
2. 客户端-服务器架构风格(Client-Server Architecture)
3. 分布式架构风格(Distributed Architecture)
4. 事件驱动架构风格(Event-Driven Architecture)
5. 微服务架构风格(Microservices Architecture)
6. 六边形架构风格(Hexagonal Architecture)
一、先谈谈什么是软件架构
对于一个程序员来说,他的终极目标,绝大部分可能就是架构师,公司里总会有那么几个神秘人物以架构师的title存在,要想成为架构师,首先得了解神秘是架构,那么到底什么是架构呢?维基百科、百度等都有很多回答,但是我同意《微服务架构模式》这本书的作者克里斯·理查森(Chris Richardson)的观点:计算机系统的软件架构是构建这个系统所需的一组结构,包括软件元素、它们之间的关系以及两者的属性。
也就是说软件架构师要做的就是将系统拆分成不同的软件元素、设计出它们直接的关系、以及各个元素的属性。对应到我们工作中常见的技术组件、组件属性、组件之间如何调用等。这里我们提下软件架构设计的4+1视图模型,有兴趣的朋友可以自己搜索研究下。
二、再谈谈架构风格
在软件架构设计中,不同的架构风格决定了系统的组织方式和结构。不同的架构风格适用于不同的场景和需求。以下列举了一些常见的架构风格:
1. 分层架构风格(Layered Architecture)
分层架构风格是一种常见的软件架构风格,它将系统划分为多个层次,每个层次负责处理特定的任务。通常包括表示层、业务逻辑层和数据访问层。这种风格的优点是结构清晰、易于维护和扩展,适用于大多数企业应用系统。
2. 客户端-服务器架构风格(Client-Server Architecture)
客户端-服务器架构风格是一种基于网络通信的软件架构风格。客户端和服务器之间通过请求-响应的方式进行通信。这种风格的优点是可扩展性和并发性较好,适用于网络通信场景。将系统分为客户端和服务器,客户端发送请求并接收响应,服务器处理请求并提供服务。
3. 分布式架构风格(Distributed Architecture)
分布式架构风格将系统划分为多个独立的子系统,每个子系统负责处理一部分业务逻辑。这些子系统之间通过网络通信进行协作。这种风格的优点是可伸缩性较好,适用于大规模、高并发场景。
4. 事件驱动架构风格(Event-Driven Architecture)
事件驱动架构风格是一种基于事件驱动的软件架构风格。在这种风格中,系统的执行动力来自于事件,事件驱动系统中的各个组件进行相应的处理。这种风格的优点是系统松耦合、易于扩展和维护,适用于大规模、高并发场景。
5. 微服务架构风格(Microservices Architecture)
微服务架构风格是一种将系统划分为多个微服务的软件架构风格。每个微服务负责处理一部分业务逻辑,并与其他微服务进行通信协作。这种风格的优点是灵活性和可伸缩性较好,适用于云端、容器化等新兴技术场景。
6. 六边形架构风格(Hexagonal Architecture)
六边形架构风格也称为端口和适配器架构,强调将应用程序核心(领域模型)与外部系统进行隔离,以支持业务需求的变化。
7. 说说微服务架构设计风格
上面我们也说了微服务架构风格,微服务架构设计风格强调的是将应用程序拆分成一组微小的、相互解耦的、自治的服务,他的目标就是为了提高系统的灵活性、可扩展性、高可用性等。
三、微服务架构设计的原则
1. 单一职责原则
每个微服务应该关注一个特定的业务领域,拥有明确的职责,避免功能的混合和耦合。
2. 自包含性原则
每个微服务应该是自包含的,具有独立的数据库和数据存储,减少服务之间的直接依赖。
3. 自治性原则
每个微服务应该是自治的,能够独立开发、部署、扩展和维护,不会对其他服务造成影响。
4. API 设计原则
定义明确的API接口,确保微服务之间的通信方式一致性和易用性。考虑版本控制和演进。
5. AKF拆分原则
AKF扩展立方体(参考《The Art of Scalability》),这些原则由Martin Fowler和他的团队提出的应用扩展的三个维度。理论上按照这三个扩展模式,可以将一个单体系统,进行无限扩展。以AKF为缩写,代表了原则的三个重要维度:可用性(Availability)、扩展性(Scalability)和灵活性(Flexibility)。旨在帮助团队在设计和划分微服务时,考虑到系统的可扩展性、灵活性和性能
6. 前后端分离原则
前后端分离原则,简单来讲就是前端和后端的代码分离也就是技术上做分离,我们推荐的模式是最好直接采用物理分离的方式部署,进一步促使进行更彻底的分离。不要继续以前的服务端模板技术,比如JSP ,把Java JS HTML CSS 都堆到一个页面里,稍复杂的页面就无法维护。
7. 无状态服务原则
对于无状态服务,首先说一下什么是状态:如果一个数据需要被多个服务共享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个“状态”数据的服务被称为有状态服务,反之称为无状态服务。
四、微服务架构设计的要点
1. 服务间通信机制
选择适合的通信方式,如HTTP、RPC、消息队列等,确保微服务之间的通信畅通。冗余的硬件资源,确保实现故障切换机制。合适的重试机制,确保服务能够正常提供服务。
2. 服务注册与发现
使用服务注册与发现工具管理服务实例,实现动态发现和负载均衡。
3. 负载均衡
引入负载均衡机制,将请求均匀分布到不同的服务实例,提高性能和可用性。
4. 容错与熔断
使用容错和熔断机制,防止故障的蔓延,保护系统的稳定性。
5. 持续集成和部署
建立自动化的持续集成和持续部署流程,支持快速迭代和交付。
6. 监控和日志记录
建立监控和日志系统,对微服务进行监控和日志记录,帮助问题定位和性能优化。
7. 数据库选择
根据业务需求选择适当的数据库类型,避免数据库成为瓶颈。
8. 版本管理
管理微服务的版本,确保服务之间的兼容。每个服务应用有自己的版本,应建立合适的版本发布和回滚机制,确保服务的稳定性和可靠性
五、微服务架构设计注意事项
1. 避免过度细化
不要将微服务划分得过于细化,以免引入过多的管理和复杂性。
2. 避免过度共享
不要让微服务之间的数据共享过多,避免数据的耦合和一致性问题。
3. 强调容错和恢复
考虑故障和异常情况,引入容错机制和故障恢复策略,确保系统的稳定性。
4. 监控和追踪
建立监控和日志记录系统,对每个微服务进行监控和追踪,方便故障排查和性能优化。
5. 安全性和权限
引入身份验证和授权机制,保障微服务之间的通信和数据安全。
6. 团队协作
在设计和开发过程中,确保团队成员之间的紧密合作和沟通,协调微服务之间的协作和交互。