.NET 手写微服务全框架,从零实现注册中心 / 网关 / 分布式事务,带你自研企业微服务平台
- 架构设计
- -438分钟前
- 3热度
- 0评论
来源: .NET 手写微服务全框架,从零实现注册中心 / 网关 / 分布式事务,带你自研企业微服务平台
一、为什么要手写微服务框架?
很多人觉得 "有现成的为什么要自己写",这是典型的开发者思维误区。
- 面试层面
:大厂面试问的永远是 "原理" 和 "设计",不是 "怎么用"。你说你会用 Consul,面试官问你服务心跳失效机制怎么实现、服务列表怎么推拉同步,答不上来直接 pass。 - 排障层面
:生产环境网关超时、服务注册不上、事务消息丢失,不懂底层只能瞎猜参数,定位问题效率差十倍。 - 架构层面
:真正的架构师不是组件搬运工,而是能根据业务特性裁剪、定制、自研基础设施的人。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
二、整体架构设计
先看全景架构图,心里有个整体认知:
- 注册中心中心化
:所有服务启动时注册,定时发心跳,下线自动摘除 - 网关无状态化
:网关从注册中心拉取服务列表,本地做负载均衡 - 事务最终一致性
:采用异步确保型方案,牺牲强一致换取高可用
三、模块一:从零实现服务注册中心
3.1 核心原理
服务注册中心本质就是一个 "服务地址字典" + "心跳保活机制":
-
服务启动时,把自己的服务名、IP、端口上报给注册中心 -
每隔 N 秒发一次心跳,证明自己还活着 -
注册中心超过 M 秒没收到心跳,就把该实例从服务列表里移除 -
消费方从注册中心拉取可用服务列表,本地缓存
3.2 服务注册中心核心代码
新建一个 Web API 项目 MicroService.Registry,定义服务实例模型:
然后暴露三个 HTTP 接口:注册、心跳、发现,注册为单例服务即可。一个最简化的注册中心就完成了。
3.3 客户端 SDK 封装
给业务服务封装一个客户端,让接入方一行代码就能完成注册:
四、模块二:手写 API 网关
4.1 网关核心职责
我们的网关实现三大核心能力:
- 路由转发
:根据请求路径匹配对应服务 - 服务发现
:从注册中心拉取服务实例列表 - 负载均衡
:轮询算法分发请求
4.2 网关中间件实现
基于 ASP.NET Core 中间件管道实现,这是网关最核心的转发逻辑:
4.3 负载均衡策略
抽象出负载均衡接口,支持轮询、随机两种策略,后续可扩展权重、一致性哈希:
Program.cs 里一行启用网关:五、模块三:手写分布式事务框架
5.1 方案选型
分布式事务有 TCC、Saga、本地消息表等多种方案。我们实现最通用、落地性最强的本地消息表方案,保证最终一致性。
核心思路:
-
业务操作和消息写入放在同一个本地事务里 -
后台任务定时扫描待发送消息,投递到消息队列 -
消费方幂等处理,失败自动重试 -
超过最大重试次数进入死信人工干预
5.3 事务消息发布端
核心是 TransactionMessagePublisher,在业务事务里同步写入消息:
业务使用示例(订单创建 + 扣库存消息在一个事务里):
5.4 后台消息投递器
后台任务定时扫描待发送消息,异步投递:
-
启动注册中心(端口 8000) -
启动订单服务、库存服务,自动注册到注册中心 -
启动网关(端口 9000) -
客户端调用 http://localhost:9000/order/api/order/create -
网关转发到订单服务,订单服务写入本地消息 -
后台投递器自动调用库存服务扣减库存
关注公众号【WPF开发上位机专家】,评论区留言或者后台回复【自研微服务】即可直接获取全部源码。
如果这篇文章对你有帮助,欢迎点赞、在看、转发给身边的 .NET 开发者。
-
注册中心持久化 + 集群部署 -
网关限流、熔断、降级 -
分布式链路追踪 -
配置中心 -
容器化部署