深入研究微服务架构——第二部分

目录

介绍

背景

为何选择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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值