silky微服务业务主机简介
主机的概念
silky的主机与.net的主机概念一致。是封装应用资源的对象,用于托管应用和管理应用的生命周期。
通用主机
如果用于托管普通的业务应用,该微服务模块本身并不需要对直接对集群外部提供访问入口。那么,您可以使用.net的通用主机注册silky服务框架。.net的通用主机无法提供http请求,也无法配置http的请求管道(即:中间件)。
在注册silky框架后,silky框架会注册dotnetty的服务监听者,并会暴露rpc端口号。但是由于silky框架的安全机制,集群外部并不允许通过tcp协议通过rpc端口号直接访问该微服务模块的应用接口。
web主机
如果您需要访问该服务模块的应用接口,您必须要通过.net的web主机注册silky框架,并配置silky框架的请求管道。这样,web构建的主机通过引用某个微服务的应用接口项目(包),通过应用接口的代理与微服务集群内部实现rpc通信。
业务主机类型
silky微服务框架提供了多种类型的业务主机,开发者可以选择合适的主机来托管应用服务。
使用web主机构建微服务应用
使用web主机构建的silky应用具有如下特性:
- 提供http服务和RPC服务,暴露http端口和RPC端口
- 可以作为外部流量的入口,集群外部通过http服务访问微服务应用集群
- 作为RPC服务提供者,通过RPC框架与其他微服务进行通信

一般地,如果我们希望该服务应用既可以作为RPC服务提供者,也希望外部能够直接通过http协议访问应用,那么我们就可以通过web主机构建微服务应用。这样的方式适用于将微服务应用拆分给不同的团队进行开发,开发者也无需要额外的构建网关,就可以访问微服务应用服务。
使用web主机构建Silky微服务应用只需要开发者安装Silky.Agent.Host包后,在Main()方法中通过Host提供的APIConfigureSilkyWebHostDefaults即可。开发者需要指定Startup类,在Startup中注册服务和配置http中间件。
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureSilkyWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());
}
}
}
当然,我们也可以在构建主机的时候,另外指定启动模块:
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureSilkyWebHost<DemoModule>(webBuilder => webBuilder.UseStartup<Startup>());
}
}
}
自定义的启动模块DemoModule需要继承WebHostModule,开发者可以在自定义的启动模块中,定义应用启动和停止需要执行的业务方法和配置服务注册,也可以依赖开发者扩展的自定义模块。
// 依赖开发者自定义的模块
// [DependsOn(typeof("UserDefinedModule"))]
public class DemoModule : WebHostModule
{
public override Task Initialize(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序启动时执行的业务方法
return Task.CompletedTask;
}
public override Task Shutdown(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序停止时执行的业务方法
return Task.CompletedTask;d
}
public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
// 开发者可以配置服务注册,作用与Startup类ConfigureServices一致
}
protected override void RegisterServices(ContainerBuilder builder)
{
// 开发者可以通过 Autofac 的ContainerBuilder注册服务,
// 例如: IServiceCollection无法注册命名服务,ContainerBuilder支持注册命名服务
}
}
在启动类Startup类中配置服务注册和中间件:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services
.AddSilkyHttpCore()
.AddResponseCaching()
.AddHttpContextAccessor()
.AddRouting()
.AddSilkyIdentity()
.AddSilkyMiniProfiler()
.AddSwaggerDocuments();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwaggerDocuments();
app.UseMiniProfiler();
}
app.UseRouting();
app.UseResponseCaching();
app.UseSilkyWebSocketsProxy();
app.UseSilkyIdentity();
app.UseSilkyHttpServer();
app.UseEndpoints(endpoints =>
{
endpoints.MapSilkyRpcServices();
});
}
}
这样,我们就可以得到一个既可以提供http服务,也作为rpc服务提供者的应用。
使用通用主机构建微服务应用
使用通用主机构建的silky应用具有如下特性:
- 只提供RPC服务,不提供http服务,微服务集群外部无法直接访问应用
- 可以通过网关或是具有http服务的应用间接的访问该微服务提供的服务

一般地,如果只是作为普通的业务应用,只需要作为RPC服务提供者,服务内部通过RPC框架进行通信,并不需要对外提供http服务,在这样的情况下,我们考虑使用通用主机构建微服务应用。
开发者在安装Silky.Agent.Host包后,在Main()方法中通过Host提供的APIConfigureSilkyGeneralHostDefaults即可通过通用主机构建silky微服务应用。
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyGeneralHostDefaults();
}
}
同样地,我们也可以在构建主机的时候,另外指定启动模块:
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyGeneralHost<DemoModule>();
}
}
在这里,我们需要自定义的启动模块DemoModule需要继承GeneralHostModule,开发者可以在自定义的启动模块中,定义应用启动和停止需要执行的业务方法和配置服务注册,也可以依赖开发者扩展的自定义模块。
// [DependsOn(typeof("UserDefinedModule"))]
public class DemoModule : GeneralHostModule
{
public override Task Initialize(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序启动时执行的业务方法
return Task.CompletedTask;
}
public override Task Shutdown(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序停止时执行的业务方法
return Task.CompletedTask;
}
public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
// 开发者可以配置服务注册,作用与Startup类ConfigureServices一致
}
protected override void RegisterServices(ContainerBuilder builder)
{
// 开发者可以通过 Autofac 的ContainerBuilder注册服务,
// 例如: IServiceCollection无法注册命名服务,ContainerBuilder支持注册命名服务
}
}
::: warning 注意
与web主机构建微服务应用自定义启动模块继承的基类不同,但是作用和使用上一致
:::
通用主机构建的微服务应用,不提供HTTP服务,所有也无需(也没有必要)配置http中间件。但是,开发者可以通过继承IConfigureService来配置服务的注册,从而自身服务注册,或是引入第三方组件。
public class ConfigureService : IConfigureService
{
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
services.AddSilkyCaching()
.AddSilkySkyApm()
.AddMessagePackCodec();
services.AddDatabaseAccessor(
options => { options.AddDbPool<DefaultContext>(); },
"Demo.Database.Migrations");
// 可以通过服务注册引入第三方组件,例如:CAP,MassTransit等
}
}
构建具有websocket能力的微服务应用
具有websocket服务能力的微服务应用除了能够提供RPC服务,还可以提供websocket服务。
- 提供RPC服务,也提供WebSocket服务
- 可以通过网关的websocket代理中间件与该微服务的websocket服务进行握手

开发者在安装Silky.Agent.Host包后,在Main()方法中通过Host提供的APIConfigureSilkyGeneralHostDefaults即可通过通用主机构建支持websocket服务的微服务应用。
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyWebSocketDefaults();
}
}
同样地,我们也可以在构建主机的时候,另外指定启动模块:
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyWebSocket<DemoModule>();
}
}
在这里,我们需要自定义的启动模块DemoModule需要继承WebSocketHostModule,开发者可以在自定义的启动模块中,定义应用启动和停止需要执行的业务方法和配置服务注册,也可以依赖开发者扩展的自定义模块。
// [DependsOn(typeof("UserDefinedModule"))]
public class DemoModule : WebSocketHostModule
{
public override Task Initialize(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序启动时执行的业务方法
return Task.CompletedTask;
}
public override Task Shutdown(ApplicationContext applicationContext)
{
// 开发者可以定义应用程序停止时执行的业务方法
return Task.CompletedTask;
}
public override void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
// 开发者可以配置服务注册,作用与Startup类ConfigureServices一致
}
protected override void RegisterServices(ContainerBuilder builder)
{
// 开发者可以通过 Autofac 的ContainerBuilder注册服务,
// 例如: IServiceCollection无法注册命名服务,ContainerBuilder支持注册命名服务
}
}
::: warning 注意
与web主机构建微服务应用自定义启动模块继承的基类不同,但是作用和使用上一致
:::
构建具有websocket能力的服务,实现应用服务接口的类需要继承WsAppServiceBase。在与前端建立会话后,就可以通过SessionManager向前端发送消息。
public class TestAppService : WsAppServiceBase, ITestAppService
{
private readonly ILogger<TestAppService> _logger;
public TestAppService(ILogger<TestAppService> logger)
{
_logger = logger;
}
protected override void OnOpen()
{
base.OnOpen();
_logger.LogInformation("websocket established a session");
}
protected override void OnMessage(MessageEventArgs e)
{
_logger.LogInformation(e.Data);
}
protected override void OnClose(CloseEventArgs e)
{
base.OnClose(e);
_logger.LogInformation("websocket disconnected");
}
}
前端需要通过网关的websocket代理中间件,与具体的websocket服务实例建立会话时,需要满足如下要求:
- 需要通过请求头或是
qString参数指定bussinessId,通过该值使用哈希算法,路由到具体的websocket服务实例。 - 为保证每次都能够路由到同一个websocket服务实例,websocket服务对应的网关实例只能有一个。
- 该网关必须要引用websocket服务代理中间件。
// 需要在网关的Configure()配置websocket代理中间件
app.UseSilkyWebSocketsProxy();
::: warning 注意
- 开发者可以考虑,普通业务服务对应一组网关应用(支持部署多个实例),websocket应用对应一组网关应用(只允许一个服务实例)
:::
构建网关
这里,网关的作用只是作为集群流量的入口,将http请求转发到集群内部,交个各个微服务应用的服务进行处理,并不作为rpc服务提供者。也就是说,这里构建的网关只能作为服务消费者。
- 只提供http服务,作为集群流量入口
- 不提供RPC服务,不可以作为rpc服务提供者

::: warning 注意
网关与web主机构建业务主机的区别在于,网关只能作为服务消费者,转发外部的http请求,而后者除了具有转发http请求的能力之外,还能作为RPC服务提供者。
:::
开发者在安装Silky.Agent.Host包后,在Main()方法中通过Host提供的APIConfigureSilkyGatewayDefaults即可通过通用主机构建支持websocket服务的微服务应用。
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyGatewayDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
}
当然,也可以自定义启动模块,只需要将自定义的启动模块DemoModule继承的基类修改为GatewayHostModule:
namespace Silky.Sample
{
using Microsoft.Extensions.Hosting;
using System.Threading.Tasks;
class Program
{
public static async Task Main(string[] args)
{
await CreateHostBuilder(args).Build().RunAsync();
}
private static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureSilkyGateway<DemoModule>(webBuilder => { webBuilder.UseStartup<Startup>(); });
}
}
开源地址
- github: https://github.com/liuhll/silky
- gitee: https://gitee.com/liuhll2/silky
在线文档
silky微服务业务主机简介的更多相关文章
- silky微服务简介
代理主机 silky微服务定义了三种类型的代理主机,开发者可以根据需要选择合适的silky代理主机托管微服务应用.代理主机定义了一个Startup模块,该模块给出了使用该种类型主机所必须依赖的模块. ...
- lms微服务框架主机介绍
目录 概念 .net的通用主机 .net的web主机 lms的业务主机类型 用于托管业务应用的普通主机 1. 创建一个应用台程序 2. 安装Silky.Lms.NormHost包 3. 注册LMS服务 ...
- silky微服务框架服务注册中心介绍
目录 服务注册中心简介 服务元数据 主机名称(hostName) 服务列表(services) 终结点 时间戳 使用Zookeeper作为服务注册中心 使用Nacos作为服务注册中心 使用Consul ...
- silky微服务框架的服务治理介绍
目录 服务治理的概念 服务注册与发现 负载均衡 超时 故障转移(失败重试) 熔断保护(断路器) 限流 RPC限流 HTTP限流 1. 添加配置 2. 注册服务 3.启用 AspNetCoreRateL ...
- Silky微服务框架之服务引擎
构建服务引擎 在注册Silky微服务应用一节中,我们了解到在ConfigureServices阶段,通过IServiceCollection的扩展方法AddSilkyServices<T> ...
- 微服务与SpringCloud简介
A.官网 https://spring.io/projects/spring-cloud B.简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用 ...
- Silky微服务框架之模块
模块的定义 Silky是一个包括多个nuget包构成的模块化的框架,每个模块将程序划分为一个个小的结构,在这个结构中有着自己的逻辑代码和自己的作用域,不会影响到其他的结构. 模块类 一般地,一个模块的 ...
- silky微服务快速开始
项目介绍 Silky框架旨在帮助开发者在.net平台下,通过简单代码和配置快速构建一个微服务开发框架. Silky 通过 .net core的主机来托管微服务应用.通过 Asp.Net Core 提供 ...
- silky微服务模块
目录 模块的定义和类型 在模块中注册服务 通过ServiceCollection实现服务注册 通过ContainerBuilder实现服务注册 使用模块初始化任务 使用模块释放资源 模块的依赖关系 构 ...
随机推荐
- [转载]解决虚拟机中Centos7出现错误:Failed to start LSB: Bring up/down networking
1.执行 service network restart 出现以下错误 Restarting network (via systemctl): Job for network.service fai ...
- CreateRemoteThread创建远程线程
要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程 该函数的原型如下: HANDLE CreateRemoteThread( HANDLE hP ...
- C# WPF MVVM项目实战(进阶②)
这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片 ...
- 关于Servlet
Servlet与CGI CGI(Common Gateway Interface),早期的Web服务器技术.执行模式:将服务端的资源基于进程运行. Servlet:运行模式改为单进程多线程的形式,利用 ...
- 低代码BPM平台
为了做出明智的决策并为客户提供服务,员工需要在正确的环境中使用正确的工具和访问关键信息的权限.但是,当业务关键信息分散在多个现成的和自定义编码的应用程序中时,员工效率会降低,客户体验也会受到影响. 低 ...
- Linux下关于用户账户的几个文件解析
Linux下关于用户账户的几个文件解析 Linux是一个多用户系统,但是对于一个多用户共存的系统中,当然不能够出现用户相互越权等一系列的安全问题,所以如何正确的管理账户成为了Linux系统中至关重要的 ...
- 世纪联华的 Serverless 之路
作者 | 朱鹏(旻苍) 来源 | Serverless 公众号 一.世纪联华超市简介 1. 公司简介 杭州联华华商集团有限公司成立于 2002 年 7 月,主要业务涵盖购物中心.大卖场.超市.便利店等 ...
- redis编译安装、哨兵、集群
编译安装 #下载源代码解压 wget https://download.redis.io/releases/redis-5.0.13.tar.gz -P /home/ tar -xvf /home/r ...
- Java语言程序设计与数据结构(基础篇)第七章答案
答案为本人求解,如有错误,还望海涵.如有雷同,纯属巧合. 7.1 import java.util.Scanner; public class Main { public static void ma ...
- java语言程序设计与数据结构(基础篇)第二章答案
答案为本人自己求解,若有错误,还望海涵并及时告知.如有雷同,纯属巧合. 2.1 import java.util.Scanner; public class Welcome { public stat ...