Soa: 一個輕量級的微服務庫

林曉lx發表於2022-05-18

Soa

專案地址:Github:MatoApps/Soa

介紹

一個輕量級的微服務庫,基於.Net 6 + Abp框架 可快速地將現有專案改造成為面向服務體系結構,實現模組間鬆耦合。

感謝

RabbitTeam 的專案 RabbitCloud

grissomlau 的專案 jimu

部分模組以及演算法程式碼參考自以上專案

特點:

  • 支援DotNetty和Http兩種模式的RPC
  • 支援自動路由發現註冊與微服務健康監測
  • 支援模組以及模組的依賴關係
  • 支援簡單物件(POCO)作為引數或返回型別
  • 支援登入與鑑權
  • 支援多語言/本地化

內容:

  • 基於Roslyn的動態客戶代理類(Proxy模組)
  • POCO物件傳輸編解碼(TypeConverter模組)
  • 基於DotNetty或者HTTP的RPC(Transport模組)
  • 路由服務發現(ServiceDiscovery模組)
  • 健康監測(HealthCheck模組)
  • 基於swagger的Api文件生成
  • 基於Attribute註解的路由配置
  • 基於Json配置檔案的系統配置(Abp實現)
  • 基於Hangfire的計劃任務
  • 基於Castle Windsor的Ioc(Abp實現)
  • 基於Log4Net的日誌(Abp實現)
  • 基於AbpZero的使用者系統
  • 基於EF,並實現模型的Repository倉儲模式(Abp實現)

更新內容:

Date Version Content
V0.9.0 2022-5-17 初始版本

快速開始

閘道器(客戶端) GatewaySample

  • 新增對Soa庫的引用
  • 新增對Soa.Client庫的引用

Startup.cs 檔案

  1. 刪除AddAbp
// services.AddAbp();
  1. 新增AddSoaClient
services.AddSoaClient<GatewaySampleWebHostModule>(new SoaClientOptions()
{
    IsDevelopment = _hostingEnvironment.IsDevelopment(),
    LoggerProvider = _appConfiguration["App:UseLogger"].ToUpper(),
    PlugInsPath = Path.Combine(_hostingEnvironment.WebRootPath, "PlugIns")
},true);
  1. 刪除UseAbp
//app.UseAbp();
  1. 新增UseSoaClient
app.UseSoaClient(options => { options.UseAbpRequestLocalization = false; }); // Initializes Soa framework.

GatewaySampleWebHostModule.cs 檔案

  1. 新增SoaClientModule模組依賴
[DependsOn(typeof(SoaClientModule))]
public class GatewaySampleWebHostModule: AbpModule
{
    //Your code
}
  • 配置 appsettings.json 檔案
  • 配置 Hangfire

微服務抽象層 IService1

IService1Manager.cs 檔案

  1. 構建介面IService1Manager並繼承於ISoaService
  2. 新增Soa標籤和Abp標籤
[SoaAuthorize("permission_name")]     //Soa許可權標籤
[SoaServiceRoute("soa_api/service1")]           //Soa服務路由標籤 
public interface IService1Manager : ISoaService
{
    //定義介面    
    [SoaService(CreatedBy = "linxiao", Comment = "bring a string to the world and say hello !")]
    [SoaAuthorize("permission_name")]    
    public string GetHelloWorld();

}
  • 將微服務抽象層引用新增至閘道器(客戶端) GatewaySample

閘道器Ioc新增各微服務抽象層

var ass = Assembly.Load("Soa.Sample.IAuthorizedService");
IocManager.RegisterAssemblyByConvention(ass);

閘道器引入各微服務許可權

 Configuration.Authorization.Providers.Add<AuthorizedServiceAuthorizationProvider>();

閘道器引入各微服務本地化資源

var loc = Configuration.Localization;
AuthorizedServiceLocalizationConfigurer.Configure(loc);

其他的Abp配置等等

微服務(服務端) Service1

  • 新增對微服務抽象層的引用

Program.cs 檔案

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSoa<Service1HostModel>();
var webapp = builder.Build();
webapp.UseSoaServer();
webapp.Run();

Service1HostModel.cs 檔案

  1. 新增SoaServerModule模組依賴
[DependsOn(typeof(SoaServerModule))]
public class Service1HostModel : AbpModule
{
    //Your code
}

Service1Manager.cs 檔案

  1. 構建類Service1Manager
  2. 繼承IService1Manager並實現其成員
public class Service1Manager : DomainService , IService1Manager
{
    //實現業務
    public string GetHelloWorld()
    {
        return "hello world !";
    }
}
  • 配置 appsettings.json 檔案

關於appsettings.json的配置,請參考 配置說明

關於Hangfire的配置,請參考 定時任務

完整示例請參考 Sample

更多資訊請閱讀系列部落格

系列部落格

  1. 使用Soa庫+Abp搭建微服務專案框架(一):Abp與DDD相關知識回顧
  2. 使用Soa庫+Abp搭建微服務專案框架(二):面向服務體系的介紹
  3. 使用Soa庫+Abp搭建微服務專案框架(三):專案改造
  4. 使用Soa庫+Abp搭建微服務專案框架(四):動態代理和RPC
  5. 使用Soa庫+Abp搭建微服務專案框架(五):服務發現和健康監測

工具

Roslyn Syntax Tool

  • 此工具能將C#程式碼,轉換成使用語法工廠構造器(SyntaxFactory)生成等效語法樹程式碼

已知問題

作者資訊

作者:林小

郵箱:jevonsflash@qq.com

License

The MIT License (MIT)

專案地址

Github:MatoApps/Soa

相關文章