深入研究微服务架构

本文的第一部分详细讨论了微服务架构(MSA),并试图解释MSA的基本术语及其概念。本部分将讨论NancyFxOWIN Framework,并将尝试概述它们在构建基于MSA的服务中的用法。在您开始阅读本部分之前,如果您没有任何关于MSA的背景知识,我建议您阅读第一部分

阅读第一部分:潜入微服务 - 架构 - 第一部分

背景

打开Web服务器接口for .NET(OWIN)标准之前,诸如IIS,Apache Tomcat甚至HTTP.sys之类的Web服务器(在独立应用程序的情况下)是Web应用程序和HTTP协议之间的连接。这意味着任何类型的面向Web的软件(如Web服务或Web应用程序)都使用上述Web服务器之一,没有标准接口通过HTTP协议进行通信。

这种方式涉及到几个问题,但最引人注目的问题是平台依赖性,这意味着基于IIS的应用程序无法在Apache服务器上运行,或者使其工作成本极高。例如,考虑在Apache上运行ASP.NET应用程序,或者在自托管Web服务(Windows服务的Web服务主机等独立应用程序的情况下,通过HTTP.sys进行直接通信会带来一些限制。作为并发连接数限制为1000(看看HttpServerQueueLengthProperty)。

为何选择Microsoft OWIN?

Microsoft OWIN正是针对这些问题,并尝试通过定义Web服务器和Web应用程序之间的标准接口来解决这些问题。由Microsoft开发并作为NuGet包分发的OWIN框架定义了Web服务器和Web应用程序之间的接口,允许您在IIS,Apache,作为独立的Windows服务或甚至在控制台应用程序中托管Web应用程序。下图显示了我已经以图形方式解释的内容。

OWIN位于Web服务器(托管软件)和您的应用程序(Web应用程序)之间,允许您无需修改即可定位任何主机。(参考:http//owinframework.com/content/documentation/concepts/overview

Microsoft OWIN也是面向中间件的,这意味着它允许应用程序通过Func<Task>引用链接到一系列中间件组件中间件是用于软件的软件,意味着通过一种机制相互链接的软件层,该机制允许链中的每个部分通过调用方法将数据和序列控制移交给下一个部分。换句话说,每件作品都有自己的生命周期,并且作为一个函数或一个类独立行动。您可以在此处阅读有关ASP.NET Core中的中间件的更多信息

当然,当我们谈论中间件时,我们也期望一些允许开发人员添加自己的中间件的机制。Microsoft OWIN提供的AppBuilder类是具体实现,IAppBuilder允许开发人员通过调用接口中Use 定义的一组扩展方法将中间件添加到链IAppBuilder 

隐藏   复制代码

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();
        }
    }
}

微软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

使用代码

下面的部分将解释如何使用三位著名的类调用的StartupApiController以及Program,中涉及的保持服务和运行在OWIN框架。为简单起见,请让我从现在开始调用OWIN Framework,OwinFx。

为自主机配置Web API

AppBuilder(的实现者IAppBuilder需要对经由自主机模式配置的接口)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提供了一个具体的接口,它将为您提供一种Use在OWIN管道中注入自定义中间件方法,它看起来像上面的代码:

隐藏   复制代码

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("New 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是一个API开发环境,允许您从通过端点范围调用HTTP调用请求,同时跟踪请求和响应。要了解更多关于邮递员的信息,我想将您重定向到邮递员官方网站上的以下文章

要查看我们开发的服务如何与Postman一起使用,请运行该服务并Get通过Postman 创建请求(请参见下图)并调用localhost:9000/api/values路由。我假设在这一步之后,您应该在响应主体上看到以下响应。

要创建get请求,请从组合框中选择GET方法并插入端点(localhost:9000 / api / values),然后单击Send blue按钮。

为什么选择NancyFx?

Nancy的开发人员说,“ Nancy是一个轻量级,低仪式的框架,用于在.NET和Mono上构建基于HTTP的服务。该框架的目标是尽可能地避开并提供一个超级的 -所有互动的快乐之路 “。我不会在此添加更多内容,因为它是南希的最佳描述,我个人发现使用南希非常方便而且不是很复杂。

南希被设计成域特定语言(DSL)的处理DELETEGETHEADOPTIONSPOSTPUTPATCH请求。

本文的下一部分将讨论如何使用NancyFx构建微服务。


合作伙伴

网站备案:豫ICP备15023476号-1 唯特科技