主机的概念

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应用具有如下特性:

  1. 提供http服务和RPC服务,暴露http端口和RPC端口
  2. 可以作为外部流量的入口,集群外部通过http服务访问微服务应用集群
  3. 作为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应用具有如下特性:

  1. 只提供RPC服务,不提供http服务,微服务集群外部无法直接访问应用
  2. 可以通过网关或是具有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服务。

  1. 提供RPC服务,也提供WebSocket服务
  2. 可以通过网关的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服务实例建立会话时,需要满足如下要求:

  1. 需要通过请求头或是qString参数指定bussinessId,通过该值使用哈希算法,路由到具体的websocket服务实例。
  2. 为保证每次都能够路由到同一个websocket服务实例,websocket服务对应的网关实例只能有一个。
  3. 该网关必须要引用websocket服务代理中间件。
// 需要在网关的Configure()配置websocket代理中间件
app.UseSilkyWebSocketsProxy();

::: warning 注意

  1. 开发者可以考虑,普通业务服务对应一组网关应用(支持部署多个实例),websocket应用对应一组网关应用(只允许一个服务实例)

:::

构建网关

这里,网关的作用只是作为集群流量的入口,将http请求转发到集群内部,交个各个微服务应用的服务进行处理,并不作为rpc服务提供者。也就是说,这里构建的网关只能作为服务消费者。

  1. 只提供http服务,作为集群流量入口
  2. 不提供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>(); });
}
}

开源地址

在线文档

silky微服务业务主机简介的更多相关文章

  1. silky微服务简介

    代理主机 silky微服务定义了三种类型的代理主机,开发者可以根据需要选择合适的silky代理主机托管微服务应用.代理主机定义了一个Startup模块,该模块给出了使用该种类型主机所必须依赖的模块. ...

  2. lms微服务框架主机介绍

    目录 概念 .net的通用主机 .net的web主机 lms的业务主机类型 用于托管业务应用的普通主机 1. 创建一个应用台程序 2. 安装Silky.Lms.NormHost包 3. 注册LMS服务 ...

  3. silky微服务框架服务注册中心介绍

    目录 服务注册中心简介 服务元数据 主机名称(hostName) 服务列表(services) 终结点 时间戳 使用Zookeeper作为服务注册中心 使用Nacos作为服务注册中心 使用Consul ...

  4. silky微服务框架的服务治理介绍

    目录 服务治理的概念 服务注册与发现 负载均衡 超时 故障转移(失败重试) 熔断保护(断路器) 限流 RPC限流 HTTP限流 1. 添加配置 2. 注册服务 3.启用 AspNetCoreRateL ...

  5. Silky微服务框架之服务引擎

    构建服务引擎 在注册Silky微服务应用一节中,我们了解到在ConfigureServices阶段,通过IServiceCollection的扩展方法AddSilkyServices<T> ...

  6. 微服务与SpringCloud简介

    A.官网 https://spring.io/projects/spring-cloud B.简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用 ...

  7. Silky微服务框架之模块

    模块的定义 Silky是一个包括多个nuget包构成的模块化的框架,每个模块将程序划分为一个个小的结构,在这个结构中有着自己的逻辑代码和自己的作用域,不会影响到其他的结构. 模块类 一般地,一个模块的 ...

  8. silky微服务快速开始

    项目介绍 Silky框架旨在帮助开发者在.net平台下,通过简单代码和配置快速构建一个微服务开发框架. Silky 通过 .net core的主机来托管微服务应用.通过 Asp.Net Core 提供 ...

  9. silky微服务模块

    目录 模块的定义和类型 在模块中注册服务 通过ServiceCollection实现服务注册 通过ContainerBuilder实现服务注册 使用模块初始化任务 使用模块释放资源 模块的依赖关系 构 ...

随机推荐

  1. whistle抓包-数据包分析

    额,这篇忘了是来自哪位作者的了. whistle:1.14.6 这里以抓取浏览器数据包为例,分析抓取的数据. Method:Connect,对应Host:Tunnel to意思是因为网络环境受限,客户 ...

  2. 『Python』matplotlib共享绘图区域坐标轴

    1. 共享单一绘图区域的坐标轴 有时候,我们想将多张图形放在同一个绘图区域,不想在每个绘图区域只绘制一幅图形.这时候,就可以借助共享坐标轴的方法实现在一个绘图区域绘制多幅图形的目的. import n ...

  3. python3之cx_Freeze使用(PyQt5)

    1.   cx_Freeze简介 Python脚本在装有Python的系统中可以直接双击运行,但绝大多数普通用户并没有配置此类环境,而编译为可执行二进制文件后,用户无需预先安装Python及依赖库即可 ...

  4. UVa/数组与字符串习题集

    UVa-272. Description: TEX is a typesetting language developed by Donald Knuth. It takes source text ...

  5. Python:PNG图像生成MP4

    Python:PNG图像生成MP4 需求 需要将多张*.PNG图像,生成mp4格式的视频文件. 实现 利用Python中image库生成*.gif格式图像,但是图片未经压缩,文件体量较大. movie ...

  6. mysql从零开始之MySQL 教程

    MySQL 教程 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数 ...

  7. webstorm 修改端口号

    webstorm 修改端口号:   至此,点击下方 [apply],端口号修改完成.

  8. appium启动ios系统上面的app需求的参数

    Appium启动APP至少需要7个参数  'platformVersion','deviceName'.'udid'.'bundleId'.'platformName'.'automationName ...

  9. 2021能源PWN wp

    babyshellcode 这题考无write泄露,write被沙盒禁用时,可以考虑延时盲注的方式获得flag,此exp可作为此类型题目模版,只需要修改部分参数即可,详细见注释 from pwn im ...

  10. Scrum Meeting 16

    第16次例会报告 日期:2021年06月11日 会议主要内容概述: 最后一次例会 一.进度情况 我们采用日报的形式记录每个人的具体进度,链接Home · Wiki,如下记录仅为保证公开性: 组员 负责 ...