本文系油管上一个系列教程的学习记录第一章,原链接是.NET Microservices – Full Course
先决条件
- 能够基于C#建立.NET (Core) REST APIs
- 理解Docker和关联概念
- 了解在C#中进行依赖注入
- 能够使用Async/Await
准备工作
- VS Code Text Editor/Visual Studio
- .NET Core 6.0以上
- Docker Desktop
- Account on Docker Hub
- API接口调试工具,如Insomnia或者Postman
准备Kubernetes常用命令
- Docker & Kubernetes Commands
- Kubernetes应用程序架构参考
- Kubernetes对象术语表
- 可以通过访问网站、通过订阅获取资料
视频教程资料
关于微服务
微服务的定义和特点
以下是Up主的理解:
- Small (2 pizza team,2 weeks to build)【pizza team是亚马逊的梗,意思就是团队要足够小,小的量化标准就是一顿饭订两个pizza就可以满足整个团队的需求】
- Responsible for doing 1 thing well【这里和单一职责很相像】
- Self-contained /Autonomous【类似单一职责的理解,不过单一职责是从功能业务去解释,这里是从封闭和不依赖的角度解释】
- Organisationally aligned【UP主的意思是,服务应当和组织逻辑关联,负责某项业务的团队就应该有唯一对应的服务,讲的是组织的责任分配;当然人员不一定,开发人员可以既属于A团队、参与A服务的开发,也属于B团队、参与B服务的开发】
- Form part of the (distributed) whole【这里强调的是每个服务间相互隔离,共同组成整体、是整体的独立部分】
微服务的优点
- Easier to change deploy (small and decoupled)【更容易更改部署(小型且解耦)】
- Built to be highly replaceable swappable【可以使用不同的技术来构建】
- Increased organisational ownership alignment【增强组织职责对齐】
- Resilient: service can break the,others will continue to run【弹性:一个服务可以中断,但不影响其它服务正常运行】
- Scalable: You can scale out only the services you need to【可伸缩:可以仅向外扩展所需的服务】
- Built to be highly replaceable swappable【高可替换性】
和单体系统对比后的微服务缺点
辩证来看,微服务相比于单体系统,也有自身的短板:
- 实施难度高【指的是微服务边界以及多个微服务调度协同】
- 不易于分析定位故障源【可能是多个微服务相互解耦,数据不易追踪】
- 对领域知识要求高【我认为就是微服务的边界定义问题】
- 分布式网络对于系统整体网络治理的要求高
- 微服务若不做好定义、依然容易耦合
视频教程涉及的服务
The Platform Service
- 作为“资产登记”的工作
- 跟踪和关联公司内全部的平台和系统
- 由基础架构团队构建
- 面向的用户包括:
- 基础设施团队
- 技术支持团队
- 工程师团队(开发人员)
- 会计
- 采购
The Commands Service
- 作为针对给定平台的“指令库”功能扩展
- 在自动化支持流程方面提供帮助
- 由技术支持团队构建
- 面向的用户包括:
- 技术支持团队
- 基础设施团队
- 工程师团队(开发人员)
解决方案架构
整个解决方案架构的要点:
- 平台服务依赖SQL Server做数据持久化;指令服务考虑效率则直接使用内存数据库
- 两个服务被置于内网中,外部应用通过API Gateway、以RESTFul API的方式对服务进行访问
- 指令服务暴露RESTFul API,平台服务通过HTTP协议,在集群内部访问指令服务
- 指令服务有两种方式访问平台服务:
- 基于消息总线,以通知/订阅的方式获取平台服务的更新(异步消息机制)
- 通过gRPC访问平台服务(同步消息机制)
服务的架构
平台服务的架构
架构要点:
- 内部有一层仓储层,通过DBContext和数据库通信。DBContext和数据库之间是Model和Entity之间的转化、仓储层和DBContext之间是Model和DTO转化。
- 最终向集群外部暴露Controller层、集群外部通过HTTP协议进行访问,Controller层可以访问仓储层。
- 实现一个调用服务,通过HTTP协议调用指令服务。
- 允许指令服务通过gRPC服务绕过Controller层、直接访问仓储层。
- 以上的通信都是同步消息机制,还实现了异步消息机制——平台服务作为Publisher会以异步消息的方式发送消息到消息总线
指令服务架构
架构要点:
- 内部以及对外暴露接口的设计和平台服务相同
- 借助gRPC Client可以直接访问平台服务的仓储层
- 以上服务和外部的通信都是同步消息,还实现了异步消息机制——订阅消息总线,作为Subcriber接收平台服务的更新