1. 程式人生 > >深入研究微服務架構——第二部分

深入研究微服務架構——第二部分

目錄

介紹

背景

為何選擇Microsoft OWIN?

Microsoft OWIN Hello World

使用程式碼

為自主機配置Web API

新增Web API控制器

如何呼叫你的服務?

通過HttpClient呼叫服務

通過Postman呼叫服務

傳送Get請求

傳送Post請求

為什麼選擇NancyFx?


如何使用Microsoft OWIN構建微服務

介紹

本文的第一部分詳細討論了微服務架構(MSA),並試圖解釋MSA的基本術語及其概念。本部分將討論OWIN框架,並將嘗試概述它們在構建基於

MSA的服務中的用法。在您開始閱讀本部分之前,如果您沒有任何關於MSA的背景知識,我建議您閱讀  第一部分

背景

 Open Web Server Interface for .NET OWIN)標準之前,諸如IISApache Tomcat甚至HTTP.sys(在獨立應用程式的情況下)之類的Web伺服器是Web應用程式和HTTP協議之間的連線。這意味著任何型別的面向Web的軟體,像Web服務或Web應用程式,都使用上述Web伺服器之一,且沒有標準介面通過HTTP協議進行通訊。

這種方式涉及到幾個問題,但最引人注目的問題是平臺依賴性,這意味著基於

IIS的應用程式無法在Apache伺服器上執行,或者使其工作的成本極高。例如,考慮在Apache上執行ASP.NET應用程式,或者在自託管Web服務(Windows服務託管的Web服務)等獨立應用程式的情況下,通過HTTP.sys進行直接通訊會帶來一些限制,例如限制為1000個併發連線的數量(看看 HttpServerQueueLengthProperty)。

Windows通訊功能(WCF)是通過在Web伺服器和應用程式(在本例中為服務)之間新增額外層(在本例中為框架)來解決這些問題的第一次嘗試。

WCF允許您通過HTTPTCP協議將資料作為非同步訊息從一個服務端點發送到另一個服務端點。有人還引入了一些新概念,使

SOA實現更容易,如ABC(地址,繫結合同)等。但是,在意識到這個框架後不久,軟體工程師就注意到WCF正遭受著 WCF體系結構經常帶來的不必要的複雜性。

https://img-blog.csdnimg.cn/20181221212846764

Windows Communication Foundation Architecture參考 Microsoft官方網站)

WCF的缺點可歸納如下:

  1. 複雜性——許多軟體開發人員很難理解
  2. 互操作性——由於WCFSOAMicrosoft實現,因此該框架的所有部分都高度依賴於Microsoft許可,這降低了該技術的互操作性
  3. 昂貴——需要更多硬體資源才能執行
  4. 不太靈活——使用WCF開發RESTful服務只是底層的痛苦
  5. 更多的努力——WCF中的開發速度比使用OWINNancyFx慢得多

為何選擇Microsoft OWIN

Microsoft OWIN正是針對這些問題,並嘗試通過定義Web伺服器和Web應用程式之間的標準介面來解決這些問題。由Microsoft開發並作為NuGet包分發的OWIN框架定義了Web伺服器和Web應用程式之間的介面,並消除了對System.Web的依賴性, 它本身允許您獨立於Web伺服器託管Web應用程式,換句話說它允許您在IISApache,作為獨立的Windows服務或甚至在控制檯應用程式中託管您的服務。下圖以圖形方式顯示了我已經解釋過的內容。

https://www.codeproject.com/KB/dotnet/1268122/OWIN_world_view.png

OWIN位於Web伺服器(託管軟體)和您的應用程式(Web應用程式)之間,允許您無需修改​​即可定位任何主機。(參考:http://owinframework.com/content/documentation/concepts/overview

Microsoft OWIN也是面向中介軟體的,這意味著它允許應用程式通過Func<Task>引用連結到一系列中介軟體元件。中介軟體是用於軟體的軟體,意味著通過一種機制相互連結的軟體層,該機制允許鏈中的每個部分通過呼叫方法將資料和序列控制移交給下一個部分。

換句話說,每個部分都有自己的生命週期,並且將作為一個函式或類獨立工作(在這裡閱讀更多關於ASP.NET Core中的中介軟體)。

當然,當我們談論中介軟體時,我們也期望一些允許開發人員新增自己的中介軟體的機制。Microsoft OWIN提供的AppBuilder類,它是IAppBuilder介面的具體實現,並且允許開發人員通過呼叫IAppBuilder介面中定義的一組Use 擴充套件方法將中介軟體新增到鏈中。

using Microsoft.Owin;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClinetOwinNancy
{
    public class CustomMiddleware
    {
        public void Build(IAppBuilder app)
        {
            app.Use(Invoke);
        }

        private Task Invoke(IOwinContext context, Func<Task> next)
        {
            return next();
        }
    }
}

Microsoft OWIN Hello World

現在是時候著手研究OWIN框架,看看如何使用它。在從儲存庫下載原始碼之前,您需要記住在開啟它之後需要在專案上恢復/重新安裝以下NuGet包(通常,Visual Studio應該負責這部分)。

Microsoft.AspNet.WebApi.Client   {5.2.6} 
Microsoft.AspNet.WebApi.Core     {5.2.6} 
Microsoft.AspNet.WebApi.Owin     {5.2.6}  
Microsoft.AspNet.WebApi.OwinSelf {5.2.6}
Microsoft.Owin                   {2.0.2} 
Microsoft.Owin.Host.HttpListener {2.0.2} 
Microsoft.Owin.Hosting           {2.0.2} 
Newtonsoft.Json                  {6.0.4} 
Owin                             {1.0} 

否則,您只需使用以下PM命令即可安裝它們。

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

使用程式碼

以下部分將解釋三個著名的類(StartupApiControllerProgram)的使用,這三個類用於保持服務在OWIN框架上啟動和執行。為簡單起見,請讓我從現在開始呼叫OWIN FrameworkOwinFx

為自主機配置Web API

AppBuilderIAppBuilder的介面的實現者)需要通過HttpConfiguration 類配置自主機模式。以下程式碼介紹了此類配置的步驟。

using Owin;
using System.Web.Http;

namespace OwinFxMicroservice
{
    public class Startup
    {
        // This code configures Web API. The Startup class is specified as a type
        // parameter in the WebApp.Start method.
        public void Configuration(IAppBuilder appBuilder)
        {
            // Configure Web API for self-host. 
            var config = new HttpConfiguration();
            CreateHttpConfig(config);
            appBuilder.UseWebApi(config);
        }

        private static void CreateHttpConfig(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

IAppBuilderOwin.dll一個關鍵介面,它為AppBuilder類提供了一個具體的介面,該類將為您提供一種UseOWIN管道中注入自定義中介軟體的方法,它看起來像上面的程式碼:

public interface IAppBuilder
{
   IDictionary<string, object> Properties { get; }
   object Build(Type returnType);
   IAppBuilder New();
   IAppBuilder Use(object middleware, params object[] args);
}

新增Web API控制器

您的自定義Web API控制器需要從實現兩個介面的abstract類派生ApiController ,這兩個介面是IHttpController IDisposable這個類,事實上,處理DELETEGETPOSTPUT的請求。在其他一些框架中,這個類稱為路由或模組。

using System;
using System.Collections.Generic;
using System.Web.Http;

namespace OwinFxMicroservice
{
    /// <summary>
    /// The Costume Web Api Controller
    /// </summary>
    public class ValuesController : ApiController
    {
        /// <summary>
        /// GET api/values 
        /// </summary>
        /// <returns>IEnu</returns>
        public IEnumerable<string> Get() => new string[] { "Hello", "World", "...!" };

        // GET api/values/3
        public string Get(int id) => (id == 1) ? "Hello" : (id == 2) ? 
                      "World" : (id == 3) ? "...!" : "No world found... ;-)";

        // POST api/values 
        public void Post([FromBody]string value) => 
                    Console.WriteLine($"The received value is {value}");

        // PUT api/values/5 
        public void Put(int id, [FromBody]string value)
        {
            //TODO: Write your Put logic here..
        }

        // DELETE api/values/5 
        public void Delete(int id)
        {
            //TODO: Write your Delete logic here..
        }
    }
}

如何呼叫你的服務?

到目前為止,我們開發了一個非常簡單的服務(假設該服務具有微服務粒度),現在,是時候看看如何使用該服務。基本上,在這個階段,我想向您展示兩種方式,第一,從程式碼中呼叫服務,第二,通過像Postman這樣的第三方應用程式呼叫它,這在最終釋出之前測試和除錯您的服務是非常有用和方便的。

通過HttpClient呼叫服務

.NET允許您建立HttpClient類的新例項,並傳遞你的Uri(服務加上路徑的基地址),然後非同步的使用GetPostDeletePut。請參閱以下程式碼:

// Create HttpCient and make a request to api/values 
var client = new HttpClient();
var response = client.GetAsync(new Uri(baseAddress + "api/values")).Result;

這將是我們用來從程式碼呼叫我們開發的服務的方式。以下部分表示Program.cs類中的程式碼。

using Microsoft.Owin.Hosting;
using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Text;

namespace OwinFxMicroservice
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:9000/";

            // Start OWIN host 
            using (WebApp.Start<Startup>(url: baseAddress))
            {
                // Create HttpCient and make a request to api/values 
                var client = new HttpClient();

                #region GET
                Console.WriteLine
                ("///////////////////////// GET HAS BEEN SENT ///////////////////////////////////////");
                var response = client.GetAsync(new Uri(baseAddress + "api/values")).Result;
                Console.WriteLine(response);
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                #endregion

                Console.WriteLine("Press any key to continue with the POST message.");
                Console.ReadLine();

                #region POST
                Console.WriteLine
                ("///////////////////////// POST HAS BEEN SENT ///////////////////////////////////");
                var stringContent = new StringContent(JsonConvert.SerializeObject("Hello World...!"), 
                                    Encoding.UTF8, "application/json");
                response = client.PostAsync
                           (new Uri(baseAddress + "api/values"), stringContent).Result;
                Console.WriteLine(response);
                Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                #endregion

                Console.WriteLine("Press any key to exit or call Postman for more tests.");
                Console.ReadLine();
            }
        }
    }
}

通過Postman呼叫服務

Postman是一個API開發環境,它允許您從通過端點範圍呼叫HTTP呼叫請求,同時跟蹤請求和響應。要了解更多關於Postman的資訊,我想將您從 Postman官方網站上轉到下面的文章。

傳送Get請求

要檢視我們開發的服務如何與Postman一起使用,請執行該服務並通過Postman 建立Get請求(請參見下圖)並呼叫localhost:9000/api/values路由。我假設在這一步之後,您應該在響應主體上看到以下響應。

https://www.codeproject.com/KB/dotnet/1268122/Postman.png

要建立Get請求,請從組合框中選擇GET方法並插入端點(localhost9000 / api / values),然後單擊Send blue按鈕。

如果你試試  localhost:9000/api/values/1 那麼你將得到只有你好的結果。請注意,預設情況下訊息的型別是JSON

傳送Post請求

https://www.codeproject.com/KB/dotnet/1268122/Post_Rquest.jpg

要建立Post請求,請從組合框中選擇POST方法並插入端點(localhost9000 / api / values),然後轉到Body部分並選擇Raw並將type設定為JSON並在主體內寫入“Hello World ... “ 並點擊發送藍色按鈕

現在,如果你在Post方法上放置一個斷點,你應該能夠除錯並檢視你在服務端得到的東西。 

// POST api/values 
public void Post([FromBody]string value) => Console.WriteLine($"The received value is {value}");

為什麼選擇NancyFx

Nancy的開發人員說,“ Nancy是一個輕量級,低儀式的框架,用於在.NETMono上構建基於HTTP的服務。該框架的目標是儘可能地避開並提供一個超級的——所有互動的快樂之路 “。我不會在此新增更多內容,因為它是Nancy的最佳描述,我個人發現使用Nancy非常方便而且不是很複雜。

Nancy被設計成域特定語言(DSL)的處理,  DELETEGETHEADOPTIONSPOSTPUTPATCH請求。

本文的下一部分將討論如何使用NancyFx構建微服務。

轉到下一部分

轉到上一部分

原文地址:https://www.codeproject.com/Articles/1268122/Dive-into-Microservices-Architecture-Part-II