近些年一直浸淫在 .Net 平臺作企業應用開發,用過的 .Net 框架很少(具體數量不清,印象深入的有 Asp.Net MVC,WPF,其餘不少都是基於微軟開發的框架作些封裝而造成新的框架,大都是還沒起好名就湮滅在歷史長河中),而本身開發的框架卻是很多(5 - 8 套吧), 換框架與換公司成正比(每換一家公司,至少換一套框架),不少都見不得人(當時以爲高大上,後來以爲很low)。 隨波逐流從 winform 年代到如今熱火朝天的微服務,網上閱讀各式各樣的博客、新聞、評論、代碼,懂了點微服務的概念,結合網上開源代碼和思想,勉強拼湊出一個沒什麼特點的微服務框架 - Jimu (中文名:積木)。html
不過框架的特點就像乳溝,擠擠仍是有的:Jimu 是一個基於.Net Core 2.0 簡單易用的微服務框架,使用了大量的開源庫, 支持分佈式、高併發和負載均衡, 實現了服務治理和 RPC 調用。Jimu 在持續迭代開發中,不少功能還在排期(如可視化監控和管理工具,熱更新,服務熔斷、限流和降級 ...),如非愛折騰的高手,不建議上生產環境。正如其中文名 - 積木,但願用她來開發項目像搭積木同樣簡單快速可控,使項目安全可靠穩定,總體架構可拓展、高併發、分佈式。git
如圖所示,這裏有四種角色:github
服務註冊與發現, 已經實現了兩種方式:redis
下面用 consul 做爲服務容器,演示怎麼用 Jimu 實現一個分佈式的微服務算法
下載安裝 consul https://www.consul.io/downloads.html
啓動api
consul agent -dev
建立一個基於 .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!"; } }
建立一個基於 .Net Core 2.0 的控制檯項目, 並添加 Jimu.Server 和 Jimu.Common.Discovery.ConsulIntegration 依賴bash
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(); } }
建立一個基於 .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(); } }
而後在瀏覽器訪問: http://localhost:58156/api/user/getname?id=666
更多強悍的功能使用,請本身看 demo 領悟,因爲時間有限,這裏就不一一詳解了,若是你們有興趣,往後或者會有多篇幅和文檔來介紹。
請下載 Jimu 源碼, 或者下載項目 jimu.demo
請到 github pull 源碼,包含有「巨量」 demo