silky微服务模块
模块的定义和类型
在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
在线文档
silky微服务模块的更多相关文章
- silky微服务简介
代理主机 silky微服务定义了三种类型的代理主机,开发者可以根据需要选择合适的silky代理主机托管微服务应用.代理主机定义了一个Startup模块,该模块给出了使用该种类型主机所必须依赖的模块. ...
- silky微服务业务主机简介
目录 主机的概念 通用主机 web主机 业务主机类型 使用web主机构建微服务应用 使用通用主机构建微服务应用 构建具有websocket能力的微服务应用 构建网关 开源地址 在线文档 主机的概念 s ...
- silky微服务框架的服务治理介绍
目录 服务治理的概念 服务注册与发现 负载均衡 超时 故障转移(失败重试) 熔断保护(断路器) 限流 RPC限流 HTTP限流 1. 添加配置 2. 注册服务 3.启用 AspNetCoreRateL ...
- Silky微服务框架之服务引擎
构建服务引擎 在注册Silky微服务应用一节中,我们了解到在ConfigureServices阶段,通过IServiceCollection的扩展方法AddSilkyServices<T> ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- silky微服务框架服务注册中心介绍
目录 服务注册中心简介 服务元数据 主机名称(hostName) 服务列表(services) 终结点 时间戳 使用Zookeeper作为服务注册中心 使用Nacos作为服务注册中心 使用Consul ...
- Silky微服务框架之模块
模块的定义 Silky是一个包括多个nuget包构成的模块化的框架,每个模块将程序划分为一个个小的结构,在这个结构中有着自己的逻辑代码和自己的作用域,不会影响到其他的结构. 模块类 一般地,一个模块的 ...
- silky微服务快速开始
项目介绍 Silky框架旨在帮助开发者在.net平台下,通过简单代码和配置快速构建一个微服务开发框架. Silky 通过 .net core的主机来托管微服务应用.通过 Asp.Net Core 提供 ...
- (子文章)Spring Boot搭建两个微服务模块
目录 1. 创建工程和user-service模块 1.1 创建空工程 1.2 在空工程里新建Module 2. 配置文件 2.1 pom.xml 2.2 application.yml 3. 代码 ...
随机推荐
- AT4505-[AGC029F]Construction of a tree【构造题,hall定理,网络流】
正题 题目链接:https://www.luogu.com.cn/problem/AT4505 题目大意 给出\(n\)个点和\(n-1\)个点集\(U_i\),每个点集中选择两个点连边使得该图是一棵 ...
- 架构师必备:MySQL主从同步原理和应用
日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...
- C#开发BIMFACE系列41 服务端API之模型对比
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸.审查过程中如果发现不符合规范的地方,则流 ...
- 双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)
双指针之滑动窗口 (长度最小的子数组:和为s的连续正数序列) 1, 什么时候使用? (与子数组/字符串 有关的题目)~如果给了某个具体值的target,即用滑动窗口 不然就双指针(一般做法,左边< ...
- Java(16)修饰符
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201619.html 博客主页:https://www.cnblogs.com/testero ...
- VS Code Remote SSH设置
本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...
- Scrum Meeting 0505
零.说明 日期:2021-5-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成邮箱注册页面功 ...
- USB线上/串口/I2C引脚串联电阻的作用
对引脚的保护. 第一是阻抗匹配.因为信号源的阻抗很低,跟信号线之间阻抗不匹配,串上一个电阻后,可改善匹配情况,以减少反射,避免振荡等. 第二是可以减少信号边沿的陡峭程度,从而减少高频噪声以及过冲等.因 ...
- 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议
文章转自:https://blog.csdn.net/weixin_43914604/article/details/104935912 学习课程:<2019王道考研计算机网络> 学习目的 ...
- Swift-方法调度-类的普通方法底层探究
1. 类的普通方法调度 写一个结构体和一个类,对比看看方法调用的方式: // 结构体 struct PersonStruct { func changClassName() {} } let s = ...