微服务的分类
约 625 字大约 2 分钟
2025-02-12
微服务在宏观上,可以划分为三类:
- 业务功能类
- 公共设施类
- 服务编排类
业务功能类
此类微服务通常用于实现具体的业务功能。例如,操作数据库的业务逻辑都是写在这种服务上。
注意
通常,此类微服务都是各自独立,不会互相调用的,如果互相调用,则引发三个问题:
1、违法了低耦合的设计原则;
2、A服务调用B服务,这两个服务是无法实现事务的一致性的;
3、性能低,因为没有实现服务的并发执行;
4、可维护性低,维护人员需要完整看完这一整条调用链上涉及到的服务源码,修改任何一个源码有可能都会影响整个业务链;
通常,此类微服务都是各自独立,不会互相调用的,如果互相调用,则引发三个问题:
1、违法了低耦合的设计原则;
2、A服务调用B服务,这两个服务是无法实现事务的一致性的;
3、性能低,因为没有实现服务的并发执行;
4、可维护性低,维护人员需要完整看完这一整条调用链上涉及到的服务源码,修改任何一个源码有可能都会影响整个业务链;
业务功能类的微服务,原则上只能调用公共设施类的微服务。
公共设施类
此类微服务提供一些常用的工具类接口,并且不会包含事务,例如“邮件发送服务”、“短信发送服务”等等。
服务编排类
此类微服务通常按照业务需求组合使用多个微服务,并给前端提供接口。
例如,某些业务功能需要同时调用多个微服务才能实现,因此需要一个中间服务将这些服务组合起来以实现完整功能。
下面代码就是一个例子:
public class DemoController : BaseController
{
public async Task Test(long productId,int quantity)
{
var gateways = new NetAddress[] { new NetAddress("127.0.0.1", 8912) };
using (var rc = new Mirage.RemoteClient(gateways))
{
//获取产品服务实例
var productService= await rc.GetMicroServiceAsync("ProductService");
//获取财务服务实例
var financeService = await rc.GetMicroServiceAsync("FinanceService");
//获取库存服务实例
var stockService = await rc.GetMicroServiceAsync("StockService");
//打开分布式事务
rc.BeginTransaction();
//获取需要支付的金额
var amount = await productService.InvokeAsync<string>("GetAmount", productId, quantity);
//下面开始并发调用2个微服务的接口
//异步扣除余额,不要await
_ = financeService.InvokeAsync<string>("UseMoney", amount);
//异步扣除库存,不要await
_ = stockService.InvokeAsync<string>("Outbound", productId, quantity);
//提交分布式事务,这里需要用await以保证所有服务都执行完毕
await rc.CommitTransactionAsync();
}
}
}
所以,编排类服务通常不包含任何业务逻辑的实现。它的主要作用是将多个服务组合在一起,形成一个完整的功能。