首页 > 其他分享 >Silky微服务框架之主机的构建

Silky微服务框架之主机的构建

时间:2022-10-24 15:57:27浏览次数:64  
标签:Silky 服务 optional 构建 应用 主机 true

主机的概念

首先,我们来了解主机的概念。在Asp.net Core主机文档中,将主机定义为: 主机是封装应用资源的对象,将应用的所有相互依赖资源包括在一个对象中可控制应用启动和正常关闭。换句话说,就是用于托管和管理应用资源和应用生命周期的。

在.net 中,有两种类型的主机,一种是泛型主机,一种是Web主机。区别主要在于Web主机提供了web容器和配置http请求处理管道的能力(所以web主机在启动后就有一个http端口和可以通过StartUp类配置http中间件),而通用主机并没有这个能力。

对于silky来说,由silky框架开发的微服务集群存在两种通信方式:

  1. 接受外部的http请求,并且通过webapi路由到相应的服务条目,然后通过本地或远程执行器执行对于的服务条目方法。

  2. 服务与服务内部之间通过dotnetty实现的rpc进行网络通信。

所以,根据不同的使用场景,我们可以使用不同的主机来托管应用。

对于 场景1 ,我们只能选择通过Web主机来托管应用,因为他必须提供Http服务的能力,是集群内部对外提供webapi访问的入口应用,一般可以用于构建网关,当然,如果用于托管业务应用也可以,这样的话,该业务应用也能直接对外部提供webapi服务。

但是,一般场景下,普通的业务微服务我们并不需要它直接对外部提供webapi服务。所以,更多通信场景是场景2。 所以,对于一般的业务微服务而言,我们可以使用他 通用主机 来构建微服务应用。

注册Silky微服务应用

我们在silky文档首页看到,构建一个最简单silky微服务应用,只需要通过如下一行简单的代码就可以做到。

 private static IHostBuilder CreateHostBuilder(string[] args)
{
    return Host.CreateDefaultBuilder(args)
            .ConfigureSilkyGeneralHostDefaults();
           
}

我们通过包 Silky.Agent.Host 提供的 HostBuilderExtensions提供的扩展方法来构建Silky微服务应用。Silky.Agent.Host 包依赖了用于构建Silky微服务应用其他的必要的包。

HostBuilderExtensions通过实现IHostBuilder的扩展方法来注册Silky微服务应用。在HostBuilderExtensions类中,提供了诸如: ConfigureSilkyWebHostDefaultsConfigureSilkyGatewayConfigureSilkyGeneralHostDefaultsIHostBuilder的扩展方法。在这些方法中,无论哪个方法,我们看到,核心的代码就是 hostBuilder.RegisterSilkyServices<T>(),下面,我们深入了解 hostBuilder.RegisterSilkyServices<T>()究竟完成了什么工作。

Silky.Core包中,我们通过HostBuilderExtensions提供的扩展方法RegisterSilkyServices实现了服务引擎(IEngine)的构建、模块的依赖与注册、服务的依赖与注册、配置文件的装载、模块的顺序执行等工作。

public static IHostBuilder RegisterSilkyServices<T>(this IHostBuilder builder)
  where T : StartUpModule
{
    IEngine engine = null;
    IServiceCollection services = null;
    builder.UseServiceProviderFactory(new AutofacServiceProviderFactory())
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureServices((hostBuilder, sc) => // (2) 服务注册和服务引擎构建
        {
            engine = sc.AddSilkyServices<T>(hostBuilder.Configuration,
                hostBuilder.HostingEnvironment);
            services = sc;
        })
        .ConfigureContainer<ContainerBuilder>(builder => // (3)通过ContainerBuilder实现服务依赖注册
        {
            engine.RegisterModules(services, builder);
            engine.RegisterDependencies(builder);
        })
        .ConfigureAppConfiguration((hosting, config) => // (1)装载配置文件、添加环境变量
        {
            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{hosting.HostingEnvironment.EnvironmentName}.json", optional: true,
                    true);
            // Adds YAML settings later
            config.AddYamlFile("appsettings.yml", optional: true, true)
                .AddYamlFile($"appsettings.{hosting.HostingEnvironment.EnvironmentName}.yml", optional: true,
                    true)
                .AddYamlFile("appsettings.yaml", optional: true, true)
                .AddYamlFile($"appsettings.{hosting.HostingEnvironment.EnvironmentName}.yaml", optional: true,
                    true);
            // add RateLimit configfile
            config.AddJsonFile("ratelimit.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"ratelimit.{hosting.HostingEnvironment.EnvironmentName}.json", optional: true,
                    true);
            config.AddYamlFile("ratelimit.yml", optional: true, reloadOnChange: true)
                .AddYamlFile($"ratelimit.{hosting.HostingEnvironment.EnvironmentName}.yml", optional: true,
                    true)
                .AddYamlFile("ratelimit.yaml", optional: true, reloadOnChange: true)
                .AddYamlFile($"ratelimit.{hosting.HostingEnvironment.EnvironmentName}.yaml", optional: true,
                    true);
            config.AddEnvironmentVariables();
        })
        ;
    return builder;
}
  1. 该方法约束了泛型参数T必须为启动模块StartUpModule类型。

  2. 将服务提供者工厂替换为AutofacServiceProviderFactory,这样,我们就可以通过Autofac来实现服务的依赖注入。

  3. 通过UseContentRoot指定了项目的根目录。

  4. IHostBuilder有三个核心的配置方法: (1) ConfigureAppConfiguration (2) ConfigureServices (3) ConfigureContainer; 在应用启动时,将按ConfigureAppConfiguration --> ConfigureServices --> ConfigureContainer 依次执行。

    4.1 在执行ConfigureAppConfiguration方法时,主要完成加载本地配置文件和环境变量;

    4.2 在执行ConfigureServices方法时,通过IServiceCollection的扩展方法AddSilkyServices<T>()实现必要的服务注册和 服务引擎(IEngine) 的构建;

    4.3 在执行ContainerBuilder方法时,主要通过Autofac的ContainerBuilder实现服务的依赖注册;

  5. 在完成上述指定的方法后,主机接下来将会执行后台任务InitSilkyHostedService,并根据模块的依赖顺序,依次执行各个模块的启动方法。完成服务以及服务条目的发现、向服务注册中心注册服务信息以及启动rpc消息监听器等工作。

标签:Silky,服务,optional,构建,应用,主机,true
From: https://www.cnblogs.com/silky/p/16821711.html

相关文章

  • 使用API网关构建微服务
     使用传统的异步回调方法编写API组合代码会让你迅速坠入回调地狱。代码会变得混乱、难以理解且容易出错。一个更好的方法是使用响应式方法以一种声明式样式编写API网关代码......
  • 【Webpack】418- 深度优化 Webpack 性能,翻倍构建性能
    0.背景随着构建体系不断完善、构建体验不断优化,webpack已经逐渐成为了前端构建体系的一大霸主,对于工作中的真正意义上的前端工程项目,webpack已经成为了我们前端构建技术选......
  • Xshell连接虚拟机的Centos报错Could not connect to 主机地址感慨
    网上搜的一堆方法对我都没用,搜到的几乎都是一致的答案什么改ens33的配置,关防火墙。首先应该明确自己问题出在哪里,比如我就是ping外网显示没有这个名字(也就是失败了,可能......
  • 驾考宝典携手HMS Core统一扫码服务,构建复杂场景中的流畅扫码体验
    “驾考宝典”是一款颇具人气的互联网综合驾照考试学习应用,通过强大的驾考功能,在手机移动端为学车学员提供从报名、学习到拿本的全方位驾考服务。作为一个专业的驾培平台,“......
  • 构建端到端的开源现代数据平台
    了解使用开源技术构建现代数据栈的详细指南。在过去的几年里,数据工程领域的重要性突飞猛进,为加速创新和进步打开了大门——从今天开始,越来越多的人开始思考数据资源以及......
  • 【Linux】主机安全
    主机安全配置,欢迎留言1.腾讯云端口限制,关闭不用端口2.linux①ssh默认端口更改②用户权限③密码强度④蜜罐⑤密钥登录......
  • 构建LNP镜像
    1、构建ubuntu-base环境#10.0.0.28:[root@rocky8ubuntu_base]#vimDockerfileFROMubuntu:20.04LABELmaintainer="www.wang.org"version="ubuntu_base:v1.0"RUNsed......
  • 自动化测试 - php调用jenkins-api构建job
    背景:前一节搭建jenkins并创建了job任务后,用户可以在jenkins平台手动点击构建来执行pytest自动化任务,想实现一个从web界面去触发构建jenkins中的job任务,在这选择使用php来调......
  • VMvare虚拟机占用宿主机太大空间
    windows上使用VMwareWorkstation搭建了一个3节点ceph集群起初每个vm占用的空间都很小,一段时间后,每个vm占用了宿主机近100G的空间???方法一:VMwareWorkstation自带的磁......
  • 构建基于Transformer的推荐系统
    使用基于BERT的构建基于协同过滤的推荐模型基于编码器的自注意力Transformer非常擅长预测自然语言生成任务的下一个字符,因为它们可以注意到给定字符周围的标记/字符的重......