模組的定義和型別
在silky框架,模組是應用程式用於服務註冊、初始化任務、釋放資源的單位,被定義為一個程式集。模組具有依賴關係,通過DependsOn
特性來確定模組之間的依賴關係。
silky框架存在兩種型別的模組:
- 開發者通過繼承
SilkyModule
就可以定義一個普通模組類; - 也可以通過繼承
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
-
開發者想要執行一個模組,需要在微服務時指定該模組,或是通過
DependsOn
特性直接或是間接的依賴該模組。 -
只有啟動模組類才可以在服務服務註冊時指定該模組為註冊的啟動模組。
:::
在模組中註冊服務
模組提供了兩個服務註冊的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
實現服務註冊
ContainerBuilder
是 Autofac 提供服務註冊的類,開發者可以通過重寫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
模組會被應用載入,並先於DotNettyTcpModule
和NormHostModule
執行服務註冊方法和初始化方法。
開發者只需要通過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框架根據構建主機的型別,已經建立了多種啟動模組,該型別的啟動模組已經定義好了該模組必須的依賴的模組:
- 通過web主機構建微服務應用的
WebHostModule
模組 - 通過通用主機構建微服務應用的
GeneralHostModule
模組 - 構建websocket服務主機的應用的
WebSocketHostModule
模組 - 構建只能作為服務消費者閘道器應用的
GatewayHostModule
模組
開發者可以選擇繼承如上的啟動模組,並且配置Host主機提供API就可以構建相應的主機。
開源地址
- github: https://github.com/liuhll/silky
- gitee: https://gitee.com/liuhll2/silky