基於.NET CORE微服務框架 -淺析如何使用surging

fanly11發表於2017-11-01

1、前言

      surging受到大家這麼強烈的關注,我感到非常意外,比如有同僚在公司的分享會上分享surging, 還有在部落格拿其它的RPC框架,微服務做對比等等,這些舉動都讓我感覺壓力很大,畢竟作為個人的開源專案,無法與成熟的開源社群的專案相比,也只有等到後面有許許多多志同道合的朋友加入一起研發完善surging,這樣才能讓surging 成為流行的微服務框架。

這篇文章介紹如何使用surging

 

開源地址:https://github.com/dotnetcore/surging

2、設計模式

Surging 提供了以下四種設計模式

2.1  代理模式

通過代理呼叫不同的微服務。並且針對於規則控制其訪問,如下圖所示:

 

2.2 非同步訊息模式

再處理等待而阻塞的問題時候, 基於微服務的架構會選擇使用訊息佇列來代替請求/響應模式,如下圖所示:

 

2.3 鏈式模式

這種模式在接收到請求後會進行互相合並的響應,如下圖所示:

服務A接收到請求後會與服務B進行通訊,服務B會同服務C進行通訊。所有服務之間的通訊使用基於Netty的RPC通訊。

 

2.4  分支模式

這種模式允許呼叫多個服務提供者,來合併資料進行返回,如下圖所示:

 

3、外部如何互動

服務主要針對提交的資料進行處理,在單個服務或多個服務呼叫的問題上,採取使用閘道器統一訪問的形式進行處理,如下圖所示

 

閘道器包括以下功能:

  1. 安全身份認證
  2. 統一訪問
  3. 流量控制
  4. 分流控制
  5. 資料監控
  6. 快取攔截

2.簡單示例

服務端

var host = new ServiceHostBuilder()
               .RegisterServices(option=> {
                   option.Initialize(); //初始化服務
                   option.RegisterServices();//依賴注入領域服務
                   option.RegisterRepositories();//依賴注入倉儲
                   option.RegisterModules();//依賴注入第三方模組
                   option.RegisterServiceBus();//依賴注入ServiceBus
               })
               .RegisterServices(builder =>
               {
                   builder.AddMicroService(option =>
                   {
                       option.AddServiceRuntime();//
                       // option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181")); //使用Zookeeper管理
                       option.UseConsulManager(new ConfigInfo("127.0.0.1:8500"));//使用Consul管理
                       option.UseDotNettyTransport();//使用Netty傳輸
                       option.UseRabbitMQTransport();//使用rabbitmq 傳輸
                       option.AddRabbitMQAdapt();//基於rabbitmq的消費的服務適配
                       builder.Register(p => new CPlatformContainer(ServiceLocator.Current));//初始化注入容器
                   });
               })
               .SubscribeAt()     //訊息訂閱
               .UseServer("127.0.0.1", 98)
             //.UseServer("127.0.0.1", 98,“true”) //自動生成Token
             //.UseServer("127.0.0.1", 98,“123456789”) //固定密碼Token
               .UseStartup<Startup>()
               .Build();
               
           using (host.Run())
           {
               Console.WriteLine($"服務端啟動成功,{DateTime.Now}。");
           }


服務路由訪問配置

在介面上,新增以下特性(還未實現統一方法配置)

   [ServiceBundle("api/{Service}")]

服務建立代理呼叫 (需要依賴介面建立代理)

ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key)

 

服務根據RoutePath 進行呼叫(不需要依賴介面,耦合性低)

ServiceLocator.GetService<IServiceProxyProvider>().Invoke<string>(model, path, serviceKey)

 

本地模組和服務呼叫

ServiceLocator.GetService<T>(key)

通過以上配置,可以通過閘道器進行訪問,如果我們要訪問介面IUserService ,方法為GetUser,路由對映的規則[ServiceBundle("api/{Service}/{Method}")],所轉化地址應該是api/User/GetUser,

用Postman測試的效果如下:

4. 總結

surging外部通過Api 閘道器 Rest 訪問,內部通過netty RPC訪問,surging還在不斷完善中,幫助文件也正在趕工中,請大家耐心等待。如感興趣請多關注或者加入QQ群:542283494

 

相關文章