1. 程式人生 > >Jimu : .Net Core 分散式微服務框架介紹

Jimu : .Net Core 分散式微服務框架介紹

一、前言

近些年一直浸淫在 .Net 平臺做企業應用開發,用過的 .Net 框架不多(具體數量不清,印象深刻的有 Asp.Net MVC,WPF,其他很多都是基於微軟開發的框架做些封裝而形成新的框架,大都是還沒起好名就湮滅在歷史長河中),而自己開發的框架倒是不少(5 - 8 套吧), 換框架與換公司成正比(每換一家公司,至少換一套框架),很多都見不得人(當時覺得高大上,後來覺得很low)。 隨波逐流從 winform 年代到現在熱火朝天的微服務,去年冬天看了 surging 專案(另一個開源的 .Net Core 微服務框架),突然心血來潮想自己實現一個(喜歡重複造輪子),於是網上閱讀各式各樣的部落格、新聞、評論、程式碼,懂了點微服務的概念,結合網上開原始碼和思想,勉強拼湊出一個沒什麼特色的微服務框架 - Jimu (中文名:積木)。

不過框架的特色就像乳溝,擠擠還是有的:Jimu 是一個基於.Net Core 2.0 簡單易用的微服務框架,使用了大量的開源庫, 支援分散式、高併發和負載均衡, 實現了服務治理和 RPC 呼叫。Jimu 在持續迭代開發中,很多功能還在排期(如視覺化監控和管理工具,熱更新,服務熔斷、限流和降級 ...),如非愛折騰的高手,不建議上生產環境。正如其中文名 - 積木,希望用她來開發專案像搭積木一樣簡單快速可控,使專案安全可靠穩定,整體架構可拓展、高併發、分散式。

二、功能技術

  • 服務註冊:指定伺服器地址,或通過擴充套件支援其他應用(如 consul - 已支援,redis, zookeeper)

  • 服務發現:指定伺服器地址,或通過擴充套件支援其他應用(如 consul - 已支援,redis ,zookeeper)

  • 服務呼叫:使用 DotNetty 或 Flurl.Http 實現 RPC 呼叫

  • 服務代理:Microsoft.CodeAnalysis 解析服務介面生成動態代理

  • 健康監測:Quartz.Net 定時排程 Socket 任務檢查伺服器心跳

  • 負載均衡:輪詢演算法(未實現的有: 加權輪詢法, 最小連線數法,隨機法,加權隨機法,源地址雜湊法)

  • 授權認證:jose-jwt 實現 JWT 授權

  • 序 列 化:Json.Net

  • 系統日誌:log4net、NLog

三、框架簡圖

640?wx_fmt=png

如圖所示,這裡有四種角色:

  • Client:各種客戶端, 這是抽象的說法,只要訪問了 ApiGateway 都屬於客戶端(手機、電腦 ..., 如果 Service Server1 和 Service Server2 訪問了 ApiGateway 也屬於客戶端)

  • ApiGateway: 服務閘道器,外部要經過它才可訪問內部的服務。閘道器是非常重要的一個角色,他相當於外部和內部服務之間的中介,負責接受和響應外部請求,以及呼叫內部服務,還有服務治理等功能

  • Service Discovery Server:負責儲存已註冊的服務,相當於服務的花名冊, Service Server 註冊服務就是向花名冊記錄自己的名稱, ApiGateway 發現服務就是去花名冊找有哪些已註冊的服務

  • Service Server:這就是微服務,所有業務需求都在這裡實現

四、如何使用

服務註冊與發現, 已經實現了兩種方式:

  1. 不依賴第三方應用,直接註冊到本地服務, 可參看 github 上的 Quick Start

  2. 依賴於 consul, 需要先啟動 consul,然後服務註冊 consul, ApiGateway 訪問 consul 發現服務

下面用 consul 作為服務容器,演示怎麼用 Jimu 實現一個分散式的微服務

1. 啟動 consul

下載安裝 consul https://www.consul.io/downloads.html
啟動

consul agent -dev

2. 微服務專案

建立一個基於 .Net Core 2.0 的類庫專案,並新增 jimu 依賴

Install-Package  Jimu

新增服務,引用空間: using Jimu;

[JimuServiceRoute("api/{Service}")] // RPC 呼叫路徑
 public class UserService : IJimuService
 {
     [JimuService(CreatedBy = "grissom")] // 指定服務的元資料, 該服務呼叫路徑為 api/user/getname?id=
     public string GetName(string id)     {       
  return $"user id {id}, name enjoy!";     } }

3. 微服務服務端專案

建立一個基於 .Net Core 2.0 的控制檯專案, 並新增 Jimu.Server 和 Jimu.Common.Discovery.ConsulIntegration 依賴

Install-Package  Jimu.Server
Install-Package  Jimu.Common.Discovery.ConsulIntegration

在 Main 函式中新增伺服器啟動程式碼,引用空間: using Jimu.Server;

static void Main(string[] args){  
 var hostBuilder = new ServiceHostServerBuilder(new Autofac.ContainerBuilder())        .UseLog4netLogger()        .LoadServices("QuickStart.Services")        .UseDotNettyForTransfer("127.0.0.1", 8001)        .UseConsulForDiscovery("127.0.0.1", 8500, "JimuService")        ;    using (var host = hostBuilder.Build())    {        host.Run();        Console.ReadLine();    } }

4. 微服務客戶端(ApiGateway)專案

建立一個基於 .Net Core 2.0 的 Asp.Net Core Web 應用程式(可選擇 API 專案模版),並新增 Jimu.Client 和Jimu.Common.Discovery.ConsulIntegration 依賴

Install-Package  Jimu.Client
Install-Package  Jimu.Common.Discovery.ConsulIntegration

修改 Startup.cs 類的程式碼, 以便新增對 jimu 的支援

using Jimu.Client;
using Jimu.Client.ApiGateway;
public class Startup{      
     public Startup(IConfiguration configuration)        {            Configuration = configuration;        }        public IConfiguration Configuration { get; }        // This method gets called by the runtime. Use this method to add services to the container.        public void ConfigureServices(IServiceCollection services)        {            //services.AddMvc();            services.UseJimu();        }        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.        public void Configure(IApplicationBuilder app, IHostingEnvironment env)        {            if (env.IsDevelopment())            {                app.UseDeveloperExceptionPage();            }            //app.UseMvc();            var host = new ServiceHostClientBuilder(new Autofac.ContainerBuilder())                .UseLog4netLogger()                .UsePollingAddressSelector()                .UseDotNettyForTransfer()                .UseServerHealthCheck(1)                .SetDiscoveryAutoUpdateJobInterval(1)                .UseConsulForDiscovery("127.0.0.1", 8500, "JimuService")                .Build();            app.UseJimu(host);            host.Run();        }    }

5. 同時啟動 服務端 和 客戶端

然後在瀏覽器訪問: http://localhost:58156/api/user/getname?id=666

6. 更多 demo

更多強悍的功能使用,請自己看 demo 領悟,由於時間有限,這裡就不一一詳解了,如果大家有興趣,日後或者會有多篇幅和文件來介紹。
請下載 Jimu 原始碼, 或者下載專案 jimu.demo

五、原始碼

請到 github pull 原始碼,包含有“巨量” demo

原文地址:http://www.cnblogs.com/grissom007/p/9291345.html

.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com

640?wx_fmt=jpeg