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. 代码 ...
随机推荐
- Excel 高亮当前行、高亮重复行的探索
本文原创,转载请注明出处:https://www.cnblogs.com/wotent/p/15348891.html TLDR 下载文件 高亮.zip ,将解压后的"高亮.xlam&quo ...
- NVIDIA驱动安装
在一次重启之后,NVIDIA显卡突然驱动坏了.实验室同学推测可能是有人安装了caffe,导致驱动被升级了.不论如何,需要重装驱动. 我的开发环境:Ubuntu 16.04 + GeForce GTX ...
- Java基础之(十二):数组
数组 数组概述 定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组 ...
- ThreadLocal概念以及使用场景
ThreadLocal概念以及使用场景 根据自身的知识深度,这里只限于自己使用和学习的知识点整理,原理的解释还需要再沉淀. 该文章从项目开发中举例,希望能帮助到各位,不了解ThreadLocal的朋友 ...
- 洛谷4606 SDOI2018战略游戏(圆方树+虚树)
QWQ深受其害 当时在现场是真的绝望...... 现在再重新来看这个题 QWQ 根据题目所说,我们可以发现,对于每一个集合中的节点,我们实际上就是要求两两路径上的割点的数目 考虑到又是关于点双的题目, ...
- 实现前后端分离,最好的方案就是SPA(Single Page Application)
从通常意义来讲,说到必须,就是指最佳实践上,实现前后端分离,最好的方案就是SPA.所以才会有 前后端分离=SPA 的近似,忽视了其中的差别.但是,既然有疑问了,我们就来看一下,为什么SPA是实现前后端 ...
- Java(7)流程控制语句中的for、while、do while循环
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201543.html 博客主页:https://www.cnblogs.com/testero ...
- 手摸手教你用 yapi-to-typescript生成Yapi的TypeScript数据类型
一 背景 现代社会比较重视效率,本着这个思想宗旨,能用工具自动高效做的事情,就不要低质量的勤奋.yapi-to-typescript就是一款自动生成接口请求与响应的typescript数据类型定义的工 ...
- RogrePirates Scrum Meeting 博客汇总
RogrePirates 博客目录 一.Scrum Meeting 1.Alpha阶段 第一次会议 第二次会议 第三次会议 第四次会议 第五次会议 第六次会议 第七次会议 第八次会议 第九次会议 第十 ...
- Linux有什么可取之处竟如此受欢迎
什么是Linux? Linux是一个操作系统软件.和Windows不同的是,Linux是一套开放源代码程序的.并可以自由传播的类Unix操作系统,它是一个支持多用户.多任务.多线程和多CPU的操作系统 ...