Oasis.MicroService:简化微服务部署的小包

本文介绍了一种方法,利用Oasis.MicroService包,将微服务打包成类库,轻松部署到ASP.NETCoreWebAPI中,降低部署复杂性,同时保持代码结构清晰。通过实例展示如何构建和部署微服务,以及注意事项如依赖版本管理和强命名的建议。
摘要由CSDN通过智能技术生成

目录

介绍

背景

使用代码

构建微服务

建立网站

尝试附加的示例代码

兴趣点


介绍

微服务的概念由来已久。虽然将相关服务组合在一起并将它们与其他不相关的服务分开部署的想法确实增加了灵活性并降低了代码的复杂性和耦合性,但它可能会引发可维护性问题,因为微服务数量的增加通常会导致更复杂的部署。显然,将一个包中的所有内容部署到一个网站中比将包分成几个小部分并将它们分别部署到不同的网站要容易得多。

为了缓解部署问题,本文为ASP.NET Core开发者介绍了一个小包,将微服务包含在类库中,只需将微服务二进制文件复制到路径下,并在Web API主机上做一点配置即可部署,这样就可以将很多这样的微服务部署在同一个网站下作为插件。

背景

传统的Web API通常构建为一个整体,许多控制器在一个网站中提供各种功能。在必要时简单地将所有功能堆积到同一个解决方案中是很容易的,但这种方法也要求重新发布整个代码库以进行任何微小的更新,这增加了不相关的代码耦合的可能性,并且没有分而治之,整个代码库在一起可能会吓到代码读者的大小。

将相关API分组并单独部署的微服务概念解决了这些问题。简单地将每组API部署到单独的网站可能会导致另一个问题,即需要管理大量网站和大量端口。这不是一个严重的问题,但对管理层来说可能有点烦人。那么解决这个问题的一个想法是在同一网站下部署所有这样的微服务。这绝对是可能的,因为我们可以在类库中分发Web控制器,并使它们在Web API项目中正常工作。

Oasis.MicroService软件包旨在将Web控制器分发到具有微服务概念的单独类库中的详细信息封装。

使用代码

为了演示如何使用该包,我们需要构建至少两个简单的微服务,以及一个网站来托管微服务。

构建微服务

  1. 初始化一个类库项目作为微服务主程序集,定义该程序集中的所有控制器,并实现所有相关的类和接口。
  2. 添加对类库项目的Oasis.MicroService引用,实现继承自Oasis.MicroService.MicroServiceContextBuilder类的类。请注意:
    1. 这个abstract类作为一个要实现的abstract方法,也就是Initialize方法,在其中,微服务的所有依赖注入都应该对方法的IServiceCollection参数进行,就像小节下面的代码段一样。需要强调的一点是,如果以这种方式配置,每个微服务都有自己独立的依赖注入容器,因此微服务是相互分离的。
    2. Initialize方法有第二个IConfigurationRoot类型的参数,它是用protected virtual方法GetConfiguration的逻辑读取的配置内容。默认实现假定配置文件名为 appsettings.json,并且与微服务程序集位于同一目录下。特定于环境的配置的工作方式与正常ASP.NET Core Web API相同,即appsettings.Development.json 将采用环境变量ASPNETCORE_ENVIRONMENT =Development时。此类配置文件是可选的,ASP.NET Core Web API的行为是可选的,如果它们对于微服务是必需的,则可以在Initialize方法中实现一些防御代码。该GetConfiguration方法是虚拟的,可以自定义配置文件读取功能。

protected override void Initialize(IServiceCollection serviceCollection,
    IConfigurationRoot configuration)
{
  serviceCollection.AddSingleton<ISimpleDemoServiceDemoService>(
    new SimpleDemoServiceDemoService());
  var simpleDemoServiceConfiguration =configuration.Get<SimpleDemoServiceConfiguration>();
  if (simpleDemoServiceConfiguration == null)
  {
    throw new FileLoadException(
      $"Configuration for {typeof(SimpleDemoServiceConfiguration)} missing",
      Path.GetFileName(this.GetType().Assembly.Location));
  }

  serviceCollection.AddSingleton<ISimpleDemoServiceConfiguration>(
    simpleDemoServiceConfiguration);
}

建立网站

  1. 创建一个Web API项目,向其添加Oasis.MicroService引用。将已发布的微服务二进制文件复制到预期路径(示例代码中的 BuildForDemo.ps1 脚本完成所有发布和复制工作,请参考)。
  2. 在配置文件中创建一个MicroServices部分,列出要与Web API项目一起托管的所有微服务主程序集。
    1. Included部分列出了要包含的所有微服务程序集,Oasis.MicroService会认为Directory及其子目录中所有文件名与SearchPattern值匹配的组件都是微服务组件。配置的根文件夹是调用AddMicroServices其程序集的目录(通常应为Web API程序集)。请注意,通配符“*”和“?”在SearchPattern中受支持(但在Directory中不受支持),这样就可以在从Web API主机添加/删除微服务时不必手动添加/删除配置条目。如果指定,Environment值将覆盖环境变量ASPNETCORE_ENVIRONMENT的值。
    2. 为了排除某些可能与Included部分中的通配符错误匹配的程序集,引入了Excluded部分来列出此类程序集,因此Oasis.MicroService将跳过它们(在示例代码中,Oasis.DemoServiceWithSqlite.dll 将通过模式 *DemoService.dll 匹配,但它是一个依赖项程序集,不包含微服务所需的定义。因此,如果我们不明确排除它或将flag IgnoreAssemblyLoadingErrors设置为 true,则在Web API启动时将抛出相关异常)。
    3. 如果它尝试加载的任何微服务程序集出现问题(例如,程序集不存在或格式错误,程序集没有正确实现相关类等),Oasis.MicroService则会抛出异常,如果标志IgnoreAssemblyLoadingErrors的值设置为“true”,则异常将被吞噬(在这这个例子中不需要Excluded部分),因此此类无效程序集将被忽略。如果有很多程序集被通配符错误地匹配,则此标志是避免在Excluded部分中逐个列出它们的便捷方法。但始终建议将标志保留为未配置状态(因此该值默认为false)。
    4. 有关该MicroServices部分的详细信息,请参阅软件包的文档。
  3. 从配置文件中读取该部分,并调用AddMicroServices方法以插入微服务(有关详细信息,请参阅示例代码中Oasis.DemoWebApi的 program.cs 文件)。

{
  "MicroServices":{
    "Included": [
      { "Directory": "MicroServices", "SearchPattern": "*DemoService.dll" },
      { "Directory": "MicroServices", "SearchPattern": 
        "Oasis.DemoServiceWithSqlite.dll", "Environment": "Test" }
    ],
    "Excluded": [
      { "Directory": "MicroServices", "SearchPattern": 
        "Oasis.CommonLibraryForDemoService.dll" }
    ],
    "IgnoreAssemblyLoadingErrors": false
  }
}

var builder = WebApplication.CreateBuilder(args);

var microServiceConfiguration = new MicroServiceConfiguration();
builder.Configuration.GetSection("MicroServices").Bind(microServiceConfiguration);
builder.AddMicroServices(microServiceConfiguration);

如果所有设置都正确,则微服务程序集中定义的控制器应该可以从网站访问。这就是构建微服务并通过简单地复制二进制文件来部署它们所需的全部内容。

尝试附加的示例代码

  1. 执行 BuildForDemo.ps1 脚本,生成Web API项目,发布三个演示微服务,并将相关二进制文件复制到预期位置。
  2. 调试 Oasis.DemoWebApi项目中,三个微服务中定义的控制器应位于路径/EmptyDemoService/Test、/SimpleDemoService/Test和/DemoServiceWithSqlite/Test 中。
  3. Oasis.EmptyDemoService是一个没有配置文件的空微服务,并且包含在*DemoService.dll 搜索模式中; Oasis.SimpleDemoService是一个简单的微服务,它有一个配置文件,并且也包含在*DemoService.dll 搜索模式中; Oasis.DemoServiceWithSqlite是一个微服务,它具有特定于环境的配置文件,访问sqlite数据库,并且包含在没有任何通配符的条目中; Oasis.CommonLibraryDemoService是三个微服务所依赖的依赖库,它的存在有助于演示如何使用Excluded部分或标识IgnoreAssemblyLoadingErrors应被使用。Oasis.DemoWebApi是Web API托管程序。

请注意,示例代码和包是使用.NET 8.0预览版构建的,Visual Studio 2022可能尚不支持该版本,因此请安装.NET 8.0 SDK并打开项目并使用Visual Studio Code运行它。

兴趣点

由于所有微服务实际上都在同一个进程中执行,因此,如果多个托管的微服务依赖于不同版本的同一程序集,则依赖版本可能会成为一个问题。强烈建议所有依赖项库都应使用强名称。

如有任何建议或疑问,请在本文下发表评论或访问 GitHub - keeper013/Oasis.MicroService: A supportive library to allow developers to deploy web APIs as class libraries

https://www.codeproject.com/Tips/5356844/Oasis-MicroService-A-Small-Package-that-Simplifies

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值