深入研究微服务架构——第二部分
目录
介绍
背景
为何选择Microsoft OWIN?
Microsoft OWIN Hello World
使用代码
为自主机配置Web API
添加Web API控制器
如何调用你的服务?
通过HttpClient调用服务
通过Postman调用服务
发送Get请求
发送Post请求
为什么选择NancyFx?
如何使用Microsoft OWIN构建微服务
- 从Git存储库下载该项目的源代码
介绍
本文的第一部分详细讨论了微服务架构(MSA),并试图解释MSA的基本术语及其概念。本部分将讨论OWIN框架,并将尝试概述它们在构建基于MSA的服务中的用法。在您开始阅读本部分之前,如果您没有任何关于MSA的背景知识,我建议您阅读 第一部分。
背景
在 Open Web Server Interface 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
)。
Windows通信功能(WCF)是通过在Web服务器和应用程序(在本例中为服务)之间添加额外层(在本例中为框架)来解决这些问题的第一次尝试。
WCF允许您通过HTTP或TCP协议将数据作为异步消息从一个服务端点发送到另一个服务端点。有人还引入了一些新概念,使SOA实现更容易,如ABC(地址,绑定合同)等。但是,在意识到这个框架后不久,软件工程师就注意到WCF正遭受着 WCF体系结构经常带来的不必要的复杂性。
Windows Communication Foundation Architecture(参考 Microsoft官方网站)
WCF的缺点可归纳如下:
- 复杂性——许多软件开发人员很难理解
- 互操作性——由于WCF是SOA的Microsoft实现,因此该框架的所有部分都高度依赖于Microsoft许可,这降低了该技术的互操作性
- 昂贵——需要更多硬件资源才能运行
- 不太灵活——使用WCF开发RESTful服务只是底层的痛苦
- 更多的努力——WCF中的开发速度比使用OWIN的NancyFx慢得多
为何选择Microsoft OWIN?
Microsoft OWIN正是针对这些问题,并尝试通过定义Web服务器和Web应用程序之间的标准接口来解决这些问题。由Microsoft开发并作为NuGet包分发的OWIN框架定义了Web服务器和Web应用程序之间的接口,并消除了对System.Web的依赖性, 它本身允许您独立于Web服务器托管Web应用程序,换句话说它允许您在IIS,Apache,作为独立的Windows服务或甚至在控制台应用程序中托管您的服务。下图以图形方式显示了我已经解释过的内容。
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
使用代码
以下部分将解释三个著名的类(Startup、ApiController和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 });}}
}
IAppBuilder是Owin.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。这个类,事实上,处理DELETE,GET,POST,PUT的请求。在其他一些框架中,这个类称为路由或模块。
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/3public 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(服务加上路径的基地址),然后异步的使用Get,Post,Delete,Put。请参阅以下代码:
// 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 GETConsole.WriteLine("/ GET HAS BEEN SENT ///");var response = client.GetAsync(new Uri(baseAddress + "api/values")).Result;Console.WriteLine(response);Console.WriteLine(response.Content.ReadAsStringAsync().Result);#endregionConsole.WriteLine("Press any key to continue with the POST message.");Console.ReadLine();#region POSTConsole.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);#endregionConsole.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路由。我假设在这一步之后,您应该在响应主体上看到以下响应。
要创建Get请求,请从组合框中选择GET方法并插入端点(localhost:9000 / api / values),然后单击Send blue按钮。
如果你试试 localhost:9000/api/values/1 那么你将得到只有“你好”的结果。请注意,默认情况下消息的类型是JSON。
发送Post请求
要创建Post请求,请从组合框中选择POST方法并插入端点(localhost:9000 / 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是一个轻量级,低仪式的框架,用于在.NET和Mono上构建基于HTTP的服务。该框架的目标是尽可能地避开并提供一个超级的——所有互动的快乐之路 “。我不会在此添加更多内容,因为它是Nancy的最佳描述,我个人发现使用Nancy非常方便而且不是很复杂。
Nancy被设计成域特定语言(DSL)的处理, DELETEGET,HEAD,OPTIONS,POST,PUT和PATCH请求。
本文的下一部分将讨论如何使用NancyFx构建微服务。
转到下一部分
转到上一部分
原文地址:https://www.codeproject.com/Articles/1268122/Dive-into-Microservices-Architecture-Part-II
深入研究微服务架构——第二部分相关推荐
- 深入研究微服务架构——第一部分
目录 介绍 背景 微服务架构 粒度 尺寸 有界的上下文 独立/自包含 服务组合 服务发现 单独的存储 优点和缺点 优点 缺点 合适的协议和架构 合适的框架和接口 物联网需要完全分散的平台,可以更容易地 ...
- 深入研究微服务架构——第三部分
目录 介绍 背景 什么是NancyFx? 什么是领域专用语言? 托管Nancy NancyFx与ASP.Net Core Web API NancyFx Hello World 使用代码 为自主机配置 ...
- 【关于分布式系统开发和微服务架构自我心得小记
一.一个完整项目为何要分布式开发? 完整项目业务实现是相当庞大,程序员在修改一个业务程序的的代码时,可能会影响整个项目的启动和部署,项目代码一个地方修改会产生很多问题,不利于程序的开发,同时项目的启动 ...
- 微服务架构及工作原理!
在移动计算时代,应用程序开发人员应该能够快速部署操作并进行更改,而无需重新部署整个应用程序.结果,它导致了一种称为"微服务"的构建软件的新方法. 微服务是应用程序中独立的小部分,每 ...
- 微服务架构系列一:关键技术与原理研究
导语:人不为己,天诛地灭这个成语中的"为"念作wéi,阳平二声,是"修养,修为"的意思.成语的意思是:如果人不修身,那么就会为天地所不容.本意并不是经常被很多人 ...
- 开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系
小蚂蚁说: 数据.消息.微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向. 一个多月前,蚂蚁金服开源了 S ...
- saas系统的微服务器,基于微服务架构的SaaS服务应用的研究与实践
摘要: SaaS(Software as a Service)应用作为一种新型的软件服务模式,在日常生产生活中越来越重要.在SaaS应用的落地过程中传统的的单体架构不能满足SaaS应用的需求,于是微服 ...
- 云原生微服务架构实战精讲第二节 云原生和Kubernete
第03讲:云原生应用的 15 个特征 本课时我将带你学习云原生应用. 微服务架构只是一种软件架构风格,并不限制所采用的实现技术,开发团队可以自由选择最合适的技术来实现.在第 01 课时介绍微服务架构的 ...
- 微服务 注册中心_4.微服务架构的第二个组件:注册中心
在微服务架构下,主要有三种角色: 服务提供者(RPC Server) 服务消费者(RPC Client) 服务注册中心(Registry) RPC Server:服务提供者,启动时根据服务发布文件se ...
最新文章
- 御用导航官方网站提醒提示页_导航错误致四川青城山拥堵?交警提醒:别过度依赖导航...
- ARM uboot Legacy uImage 和 fit img (Flattened uImage Tree)原理介
- 一次性动态绑定多个droplistdown
- Comparable接口和Comparator接口的比较
- 如何识别南孚电池是号码
- 小姐姐亲身体验:在阿里数据库科研团队实习是种怎样的体验?
- Ubuntu中运行pip时报错
- Mysql5.6.21源码安装
- LeedCode篇:234. 回文链表
- uFrame近况(2016年4月8日更新)
- HTML5 file对象和blob对象的互相转换
- Android studio第四次作业
- 使用libevhtp搭建HTTPS SERVER(单向验证身份)
- async/await 异步编程(转载)
- 人人开源代码生成器启报错
- 数字电路基础知识(三) 复位设计-异步复位,同步释放
- html doc全称,html标签全称与功能介绍.doc
- js事件冒泡与事件捕获、阻止事件冒泡和浏览器默认行为
- 人体红外传感器HC-SR501使用指南
- CRUSH与PG分布
热门文章
- java 定义方法_java如何定义方法
- APP设计灵感|高颜值时钟页面!让每一秒都过得有意义
- UI设计干货模板|输入框设计临摹素材
- android服务器连接失败,Android Studio服务器连接失败
- maya 阿诺德水晶材质_Maya教程之Arnold材质
- Chrome 插件开发与本地程序交互流程
- 《深入浅出DPDK》读书笔记(十):硬件加速与功能卸载(VLAN、IEEE1588、IP TCP/UDP/SCTP checksum、Tunnel)
- Linux系统利用C语言获取网口信息(IP地址,MAC地址,状态,带宽speed等)
- 【HTML+CSS网页设计与布局 从入门到精通】第2章
- php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解