silky微服務模組

Silky發表於2021-11-15

模組的定義和型別

在silky框架,模組是應用程式用於服務註冊、初始化任務、釋放資源的單位,被定義為一個程式集。模組具有依賴關係,通過DependsOn特性來確定模組之間的依賴關係。

silky框架存在兩種型別的模組:

  1. 開發者通過繼承SilkyModule就可以定義一個普通模組類;
  2. 也可以通過繼承StartUpModule定義一個服務註冊啟動模組類。

例如:

普通模組類

// 普通模組類,啟動模組類必須要直接或間接的依賴該模組
[DependsOn(typeof(RpcModule))]
public class CustomModule : SilkyModule
{
}

啟動模組類

// 啟動模組類,只有該型別的模組才可以被允許在構建服務中被指定為啟動模組
[DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule)
)]
public class NormHostModule : StartUpModule
{
}

::: tip

  1. 開發者想要執行一個模組,需要在微服務時指定該模組,或是通過DependsOn特性直接或是間接的依賴該模組。

  2. 只有啟動模組類才可以在服務服務註冊時指定該模組為註冊的啟動模組。
    :::

在模組中註冊服務

模組提供了兩個服務註冊的API,一是通過ServiceCollection實現服務註冊,二是通過ContainerBuilder實現服務註冊。

通過ServiceCollection實現服務註冊

開發者通過重寫ConfigureServices方法,可以通過IServiceCollection實現服務註冊,例如:

public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
    services.AddOptions<RpcOptions>()
        .Bind(configuration.GetSection(RpcOptions.Rpc));
    services.AddOptions<GovernanceOptions>()
        .Bind(configuration.GetSection(GovernanceOptions.Governance));
    services.AddOptions<WebSocketOptions>()
        .Bind(configuration.GetSection(WebSocketOptions.WebSocket));
    services.AddDefaultMessageCodec();
    services.AddDefaultServiceGovernancePolicy();
}

通過ContainerBuilder實現服務註冊

ContainerBuilderAutofac 提供服務註冊的類,開發者可以通過重寫RegisterServices方法使用ContainerBuilder提供的API實現服務註冊。使用ContainerBuilder註冊服務的一個優勢是可以註冊命名的服務。

protected override void RegisterServices(ContainerBuilder builder)
{
    builder.RegisterType<DefaultExecutor>()
        .As<IExecutor>()
        .InstancePerLifetimeScope()
        .AddInterceptors(
            typeof(CachingInterceptor)
        )
        ;
}

使用模組初始化任務

在應用程式啟動過程中,開發者可以重寫Initialize方法來實現模組的初始化任務。開發者可以通過applicationContext.ServiceProvider屬性來解析註冊的服務。

public override async Task Initialize(ApplicationContext applicationContext)
{
    var serverRouteRegister =
        applicationContext.ServiceProvider.GetRequiredService<IServerRegister>();
    await serverRouteRegister.RegisterServer();
}

使用模組釋放資源

在應用程式正常停止時,通過重寫Shutdown方法來實現模組停止時需要執行的方法,例如:釋放資源等。

public override async Task Shutdown(ApplicationContext applicationContext)
{
    var serverRegister =
        applicationContext.ServiceProvider.GetRequiredService<IServerRegister>();
    await serverRegister.RemoveSelf();
}

模組的依賴關係

silky框架的模組通過DependsOn特性指定模組的依賴關係,silky框架支援通過直接或是間接的依賴模組。例如: NormHostModule模組依賴了DotNettyTcpModule模組,DotNettyTcpModule模組依賴了RpcModule模組,微服務註冊時指定NormHostModule為啟動模組。那麼根據模組依賴關係,RpcModule模組會被應用載入,並先於DotNettyTcpModuleNormHostModule執行服務註冊方法和初始化方法。

開發者只需要通過DependsOn特性在類直接就可以指定該模組依賴的模組,在應用啟動過程中,會根據模組的依賴關係進行排序。並完成服務註冊方法和指定的初始化方法。

例如,NormHostModule的模組依賴關係如下所示:

    [DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule)
    )]
    public class NormHostModule : StartUpModule
    {
    }

構建主機時指定啟動模組

開發者如果自定義了模組,那麼,需要在構建微服務主機時,指定啟動模組。

例如:


private static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
            .RegisterSilkyServices<NormHostModule>() //指定啟動的模組,silky框架約束了該模組型別必須為啟動模組類(StartUpModule)
        ;
}

一般地,開發者在構建預設主機時,並不需要指定啟動模組。構建的預設主機,已經根據構建的主機型別,指定了預設的啟動模組。例如,使用ConfigureSilkyWebHostDefaults構建silky主機時,已經指定了DefaultWebHostModule作為其中模組。

如果開發者有自定義模組時,同時也需要自定義一個啟動模組,通過該啟動模組依賴開發者自定義的模組和 silky 框架定義的模組,達到服務註冊和初始化任務的目的。

例如:

[DependsOn(typeof(ZookeeperModule),
        typeof(DotNettyTcpModule),
        typeof(MessagePackModule),
        typeof(RpcProxyModule),
        typeof(TransactionTccModule),
        typeof(AutoMapperModule),
        typeof(CustomModule),
)]
public class CustomStartHostModule : StartUpModule
{
}

為了方便開發者,silky框架根據構建主機的型別,已經建立了多種啟動模組,該型別的啟動模組已經定義好了該模組必須的依賴的模組:

  1. 通過web主機構建微服務應用的WebHostModule模組
  2. 通過通用主機構建微服務應用的GeneralHostModule模組
  3. 構建websocket服務主機的應用的WebSocketHostModule模組
  4. 構建只能作為服務消費者閘道器應用的GatewayHostModule模組

開發者可以選擇繼承如上的啟動模組,並且配置Host主機提供API就可以構建相應的主機。

開源地址

線上文件

相關文章