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实现服务注册 使用模块初始化任务 使用模块释放资源 模块的依赖关系 构 ...
随机推荐
- 洛谷P7078 [CSP-S2020] 贪吃蛇 题解
比赛里能做出这题的人真的非常厉害,至少他的智商和蛇一样足够聪明. 首先有一个结论: 当前最强的蛇吃了最弱的蛇之后,如果没有变成最弱的蛇,他一定会选择吃! 证明: 假设当前最强的蛇叫石老板. 如果下一条 ...
- 题解 Beautiful Pair
题目传送门 题目大意 给出一个 \(n\) 个点的序列 \(a_{1,2,...,n}\) ,问有多少对点对 \((i,j)\) 满足 \(a_i\times a_j\le a_k(i\le k\le ...
- 洛谷4299首都(LCT维护动态重心+子树信息)
这个题目很有意思 QWQ 根据题目描述,我们可以知道,首都就是所谓的树的重心,那么我们假设每颗树的重心都是\(root\)的话,对于每次询问,我们只需要\(findroot(x)\)就可以. 那么如何 ...
- 初识Tomcat源码
Tomcat 部署的三种方式 打包成war包 部署到webapp目录录下 为什么要打包成war包,而不是jar包呢? 因为jar包可能是一个项目,也可能是一个依赖,Tomcat读取容易造成混淆.于是一 ...
- 一个简单的单例模式Demo
/** * @author :nx014924 * @date :Created in 5/30/2021 1:09 PM * @description: * @modified By: * @ver ...
- NX9.0和NX10.0做自定义操作可以用的函数
NX9.0:LIBUFUNX.DLL int UF_OPER_ask_check_geom(void *,int *,unsigned int * *) int UF_OPER_ask_first_o ...
- Verilog的数据流、行为、结构化与RTL级描述
Verilog语言可以有多种方式来描述硬件,同时,使用这些描述方式,又可以在多个抽象层次上设计硬件,这是Verilog语言的重要特征. 在Verilog语言中,有以下3种最基本的描述方式: 数据流描述 ...
- java---String 和 StringBuffer
Java-String和StringBuffer类 Java String 类 字符串在Java中属于对象,Java提供String类来创建和操作字符串. 创建字符串 创建字符串常用的方法如下: ...
- python pip使用国内镜像安装第三方库:命令行或PyCharm
python pip使用国内镜像安装第三方库:命令行或PyCharm 转载: https://blog.csdn.net/lly1122334/article/details/80646996
- Java基础-Java8新特性
一.Lambda表达式 在了解 Lambda 之前,首先回顾以下Java的方法. Java的方法分为实例方法,例如:Integer的equals()方法: public final class Int ...