dotnet core微服務框架Jimu介紹

Flamesky發表於2024-10-25

jimu 是一個基於.Net6.0 簡單易用的微服務框架,參考了很多開源庫以及想法,使用了大量的開源庫(如 DotNetty, consul.net, Flurl.Http, Json.net, Log4net, Quartz.net ... ), 支援分散式、高併發和負載均衡, 實現了服務治理(如服務註冊、發現、健康檢測 ...)和 RPC 呼叫。

jimu(積木),正如其中文名,希望用她來開發專案像搭積木一樣簡單快速可控,使專案安全可靠穩定,整體架構可擴充、高併發、分散式。

特點

  1. 使用 Apache License 2.0 開源協議
  2. jimu 最核心的思想是 IOC 和 DI, 透過配置檔案使用了 autofac 將元件注入到框架中,用元件來驅動框架,使框架更具彈性。
  3. 服務註冊與發現: consul
  4. 動態閘道器
  5. 基於 DotNetty 的 RPC
  6. JWT 鑑權
  7. 負載均衡:輪詢
  8. 容錯策略: 重試
  9. 容器釋出 docker
  10. 路由配置: Attribute 註解
  11. 日誌記錄: log4net, nlog
  12. Api 文件: swagger
  13. 鏈路跟蹤: skywalking
  14. RESTful: Attribute 註解
  15. 健康監測
  16. 檔案上存下載:多檔案和單檔案
  17. uri跳轉: 服務端跳轉指定的 url
  18. ORM: Dapper
  19. DDD: MiniDDD
  20. 快取: Memcached
  21. 訊息佇列:RabbitMq

Install

  1. 啟動 consul;
  2. 設定 Samples/ApiGateway, Samples/Server.Auth, Samples/Server.Order, Samples/Server.User 為啟動項;
  3. 開啟 http://localhost:54762/swagger/index.html

配置

服務端

日誌

  1. JimuLog4netOptions: Log4net 日誌元件

    {
        "JimuLog4netOptions":{
            "EnableConsoleLog":true,
            "EnableFileLog":true,
            "FileLogPath":"log",
            "FileLogLevel":"Debug,Info,Warn,Error",
            "ConsoleLogLevel":"Debug,Info,Warn,Error",
            "UseInService": true // ILogger 是否注入到 service
        }
    }
     
  2. JimuNLogOptions: NLog 元件

授權

  1. JwtAuthorizationOptions: Jwt 授權

    {
        "JwtAuthorizationOptions":{
             "ServiceInvokeIp": "${SERVICE_INVOKE_IP}", //服務宿主的地址
            "ServiceInvokePort": "${SERVICE_INVOKE_PORT}",
            "Protocol": "Netty", //傳輸協議:Http,Netty
            "SecretKey": "123456", //生成token 的鑰匙
            "ValidateLifetime": true,
            "ExpireTimeSpan": "0.16:0:0", //token 有效時長: day.hour:minute:second
            "ValidateIssuer": false, //
            "ValidIssuer": "",
            "ValidateAudience": false,
            "ValidAudience": "",
            "TokenEndpointPath": "/v2/token", //獲取 token 的路徑
            "CheckCredentialServiceId": "Auth.IServices.IAuthService.Check(context)" //驗證使用者名稱密碼是否正確的 service id, context 是 JwtAuthorizationContext,包含 UserName,Password等呼叫上下文資訊
        }
    }

服務發現

  1. ConsulOptions: 使用 Consul 作為服務發現元件
{
          "ConsulOptions":{
                "Ip": "127.0.0.1", //consul ip
                  "Port": "8500", // consul port
                  "ServiceGroups": "ctauto.test.store", //服務註冊所屬的組別
                  "ServiceInvokeIp": "127.0.0.1", //服務宿主的地址
                  "ServiceInvokePort": "8004 //服務宿主的埠
          }
      }

服務呼叫協議

  1. TransportOptions: 服務呼叫的傳輸元件

    {
        "TransportOptions":{
            "Ip": "127.0.0.1", //服務宿主ip
            "Port": 8001, //服務宿主埠
            "Protocol": "Netty", //傳輸協議: Netty, Http
            "ServiceInvokeIp": "127.0.0.1", //服務宿主的地址
            "ServiceInvokePort": "8001"
        }
    } 

服務

  1. ServiceOptions: 服務配置
{
       "ServiceOptions":{
           "Path": "",//服務dll所在路徑,預設當前目錄
           "LoadFilePattern": "IService.dll,Service.dll",//需要載入的服務dll,支援統配符:*.dll,*.txt
       }
   }
ORM

資料庫接入

  1. Dapper

    {
       "DapperOptions": {
         "ConnectionString": "server=localhost;database=grissom_dev;user=root;pwd=root;",
         "DbType": "MySql" //資料庫型別,支援: MySQL,SQLServer,Oracle,SQLite, PostgreSQL
      }
    }
MiniDDD Repository

MiniDDD 是一個輕量級的 DDD 框架, MiniDDD Repository 就是基於該框架的資料倉儲,支援以下倉儲

  1. Dapper

    {
      "MiniDDDDapperOptions": {
        "ConnectionString": "server=localhost;database=grissom_dev;user=root;pwd=root;",
        "DbType": "MySql" //資料庫型別,支援: MySQL,SQLServer,Oracle,SQLite, PostgreSQL
          // 沒有 sql 日誌可輸出
      }
    }
  2. EF

    {
       "MiniDDDEFOptions": {
         "ConnectionString": "server=localhost;database=grissom_dev;user=root;pwd=root;",
         "DbType": "MySql", //資料庫型別,支援: MySQL,SQLServer,Oracle,SQLite, PostgreSQL
         "TableModelAssemblyName": "",//EF對應的表的實體類dll, Server 專案引用了則不需要設定
         "OpenLogTrace":false, //是否開啟 sql 日誌,一般 debug 時開啟方面檢視生成的 sql
         "LogLevel":"Debug" //日誌級別: Debug,Information,Warning,Error
       }
    }
  3. SqlSugar

    {
        "MiniDDDSqlSugarOptions": {
          "ConnectionString": "server=localhost;database=grissom_dev;user=root;pwd=root;",
          "DbType": "MySql", //資料庫型別,支援: MySQL,SQLServer,Oracle,SQLite, PostgreSQL
          "OpenLogTrace":false, //是否開啟 sql 日誌,一般 debug 時開啟方面檢視生成的 sql,沒有日誌級別可選
       }
    }

客戶端

日誌

  1. JimuLog4netOptions: Log4net 日誌元件

    {
        "JimuLog4netOptions":{
            "EnableConsoleLog":true,
            "EnableFileLog":true,
            "FileLogPath":"log",
            "FileLogLevel":"Debug,Info,Warn,Error",
            "ConsoleLogLevel":"Debug,Info,Warn,Error"
        }
    }
  2. JimuNLogOptions: NLog 元件

授權

  1. JwtAuthorizationOptions: Jwt 授權,支援在客戶端實現 jwt 授權,服務端不需要配置
{
    "JwtAuthorizationOptions":{
        "Protocol": "Http", //傳輸協議:Http,Netty
        "SecretKey": "123456", //生成token 的鑰匙
        "ValidateLifetime": true,
        "ExpireTimeSpan": "0.16:1:0", //token 有效時長: day.hour:minute:second
        "ValidateIssuer": false, //
        "ValidIssuer": "",
        "ValidateAudience": false,
        "ValidAudience": ""
    }
}

服務發現

  1. ConsulOptions: 使用 Consul 作為服務發現元件
{
    "ConsulOptions":{
        "Ip": "127.0.0.1",//consul ip
        "Port": 8500,// consul port
        "ServiceGroups": "MyService",//服務註冊所屬的組別
    }
}

服務發現重新整理頻率

  1. DiscoveryOptions:客戶端會快取已發現的服務,設定重新整理頻率

    {
        "DiscoveryOptions":{
            "UpdateJobIntervalMinute":1//單位分鐘,1分鐘重新整理一次
        }
    }

容錯機制

  1. FaultTolerantOptions:服務呼叫時的容錯機制

    {
        "FaultTolerantOptions":{
            "RetryTimes":0 //服務呼叫失敗重試次數
        }
    }

服務健康監測

  1. HealthCheckOptions: 根據已發現服務的ip,port 定時進行伺服器心跳監測(客戶端主動連線)

    {
        "HealthCheckOptions":{
            "IntervalMinute":1 //心跳監測時間間隔,單位分鐘
        }
    }

負載均衡

  1. LoadBalanceOptions

    {
        "LoadBalanceOptions":{
            "LoadBalance":"Polling" //負載均衡演算法: Polling - 輪詢
        }
    }

遠端代理

  1. ServiceProxyOptions

    {
        "ServiceProxyOptions":{
            "AssemblyNames":["IOrderServices.dll","IUserServices.dll"]//代理介面dll配置
        }
    }

客戶端獲取請求 token 的方式

  1. TokenGetterOptions

    {
        "TokenGetterOptions":{
            "GetFrom":"HttpHeader" //從http header 獲取, Request.Headers["Authorization"]
        }
    }

服務呼叫

  1. TransportOptions: 服務呼叫的傳輸元件

    {
        "TransportOptions":{
            "Protocol":"Netty" //傳輸協議: Netty
        }
    }

相關文章