微服务网关Ocelot

微服务网关是微服务架构中的核心组件,它是客户端请求的门户,它是调用具体服务端的桥梁.下面我们将使用开源项目Ocelothttps://github.com/geffzhang/Ocelot)搭建一款轻量级服务网关,不过在此之前我们将对微服务网关做个详细介绍,以便大家更加清晰的了解什么是微服务网关。

7.1什么是微服务网关

微服务网关类似于经典设计模式的Façade模式,它将底层的复杂细节进行屏蔽,对外提供简单而统一的调用方式,通常使用HTTPRESTful API服务。此时,对于客户端而言,可以是PC端网页,也可以是移动设备,客户端通过HTTP方式调用微服务网关。

         微服务网关也称为服务网关(ServiceGateway)或API网关(API Gateway),下面通过一张架构图来表达服务网关与客户端以及服务端的关系。

                             

我们使用服务网关(Service Gateway)来建立客户端和服务端之间的联系。当客户端发送请求时,请求首先进入服务网关,随后服务网关将服务请求路由转发到具体的服务端。在路由的过程中,会涉及到具体的路由算法,最简单的做法是在服务网关中解析客户端请求中的路径或请求头,从而路由到具体的服务端。

         在微服务模式网站上也对服务网关进行了说明,可以通过以下地址了解API Gateway模式的具体信息。

         APIGatewayhttp://microservices.io/patterns/apigateway.html

         实际上,服务网关的路由过程我们称之为“反向代理”。如果大家曾经使用过Nginx,对反向代理这个概念不会陌生。说白了就是请求不会直接发送到目的地,而是通过一个中间件进行转发,这个中间件就是Nginx,它充当了反向代理的角色。

         在什么样场景下我们会考虑使用反向代理技术呢?

  • 使静态资源与动态资源分离

  • 实现AJAX跨域访问

  • 搭建统一服务网关接口

下面我们将使用Ocelet 实现一个服务网关的重要特性之一:反向代理。

 

7.2 使用Ocelot 实现一个反向代理

         Ocelot是一个使用.NET Core平台上的一个API Gateway,这个项目的目标是在.NET上面运行微服务架构,它很好的和Identity Server集成,由Identity Server负责验证授权。

         使用Ocelot 搭建一个反向代理,仅需要三步:

         第一步,使用VisualStudio 2017 创建一个ASP.NET Core空项目FitApiGateway,通过Nuget安装Ocelot

Install-PackageOcelot

第二步使用ASP.NET Core应用宿主Ocelot,在Startup.cs中配置,代码如下:

   publicclassStartup

   {

       public Startup(IHostingEnvironment env)

       {

            var builder = newConfigurationBuilder()

               .SetBasePath(env.ContentRootPath)

                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)

                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)

               .AddJsonFile("configuration.json")

                .AddEnvironmentVariables();

 

            Configuration = builder.Build();

       }

 

       // This method gets called by theruntime. Use this method to add services to the container.

       // For more information on how toconfigure your application, visithttps://go.microsoft.com/fwlink/?LinkID=398940

       publicvoid ConfigureServices(IServiceCollection services)

       {

            Action<ConfigurationBuilderCachePart> settings = (x) =>

            {

                x.WithMicrosoftLogging(log=>

                {

                    log.AddConsole(LogLevel.Debug);

                })

                .WithDictionaryHandle();

            };

 

           services.AddOcelotOutputCaching(settings);

           services.AddOcelotFileConfiguration(Configuration);

            services.AddOcelot();

       }

 

       publicIConfigurationRoot Configuration { get; }

 

       // This method gets called by theruntime. Use this method to configure the HTTP request pipeline.

       publicvoid Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

       {

           loggerFactory.AddConsole(Configuration.GetSection("Logging"));

            app.UseOcelot();

       }

    }

上面代码使用json配置作为Ocelot的配置,配置文件的详细说明参看 https://github.com/TomPallister/Ocelot/blob/develop/configuration-explanation.txt,配置主要分两部分,路由和全局的配置:

路由是Ocelot的核心配置,Ocelot的核心功能就是将到达的Http请求转发给下游的服务,目前还只能是Http请求,将来支持其他任何传输机制。一条路由规则如下:

{

  "ReRoutes": [

   {

     "DownstreamPathTemplate": "/api/values",

     "DownstreamScheme": "http",

     "DownstreamHost": "localhost",

     "DownstreamPort": 9030,

     "UpstreamPathTemplate": "/api/values",

     "UpstreamHttpMethod": "Get",

     "FileCacheOptions": { "TtlSeconds": 15 }

   }

 ],

 

  "GlobalConfiguration": {

   "RequestIdKey": "OcRequestId",

   "ServiceDiscoveryProvider": {

     "Provider": "Consul",

     "Host": "localhost",

     "Port": 8500

   }

  }

}

DownstreamPathTemplate, DownstreamScheme,DownstreamPort DownstreamHost组成请求被转发的URLUpstreamPathTemplateOcelot 用于识别转发请求,UpstreamHttpMethod用于识别相同的URL请求的不同操作。可以在模板里使用占位符{something}要同时出现在DownstreamPathTemplate UpstreamPathTemplate.

Ocelot默认不区分大小写,可以在配置中指定区分大小写:

  "ReRouteIsCaseSensitive": true

        

RequestIdKey

除了记录访问记录外, 在处理每个用户请求过程中, 涉及业务逻辑处理和后端服务调用等, 对某些操作也需要记录相应日志和错误.对每个请求, 都生成一个唯一的requestID. 在这个请求的生命周期中, 所有打印的日志都会带上requestID信息,通过RequestI还可以构建Http请求路径,前端一个请求,可能要经过后端好几个服务,可以在http头上加上RequestIdRequestIndex把这些服务串起来,例如 A->B->CA服务调用B服务的时候,如果发现http head里面没有RequestId则可以通过GuId生成一个,同时RequestIndex1 B服务调用C服务端时候, 因为RequestId已经有了,就直接传递下去,同时RequestIndex1 ,把这些信息记录到日志中,通过分析,整个调用就串起来了,通过完整的数据就可以绘制出整个服务的调用链路图。 

 

Ocelot从实现上来说就是一系列的中间件组合,在HTTP请求到达Ocelot,经过一系列的中间件的处理转发到下游的服务。

至此,一个ASP.NET Core 反向代理服务器就搭建完毕,下面我们使用Apache Bench对其性能做个简单的测试。我们模拟了1000 个用户,每次并发100个请求,以下是测试结果,机器的配置是CPUIntel i5 2核, 4G内存的机器上测试:

D:\Workshop\ab>ab.exe -n 1000 -c 100 http://localhost:5800/api/values/

This isApacheBench, Version 2.3 <$Revision: 1757674 $>

Copyright 1996Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to TheApache Software Foundation, http://www.apache.org/

 

Benchmarkinglocalhost (be patient)

Completed 100requests

Completed 200requests

Completed 300requests

Completed 400requests

Completed 500requests

Completed 600requests

Completed 700requests

Completed 800requests

Completed 900requests

Completed 1000requests

Finished 1000requests

 

 

ServerSoftware:        Kestrel

ServerHostname:        localhost

ServerPort:            5800

 

DocumentPath:          /api/values/

DocumentLength:        19 bytes

 

ConcurrencyLevel:      100

Time taken fortests:   0.230 seconds

Completerequests:      1000

Failedrequests:        0

Totaltransferred:      178000 bytes

HTMLtransferred:       19000 bytes

Requests persecond:    4345.52 [#/sec] (mean)

Time perrequest:       23.012 [ms] (mean)

Time perrequest:       0.230 [ms] (mean, acrossall concurrent requests)

Transferrate:          755.37 [Kbytes/sec]received

 

Connection Times(ms)

              min  mean[+/-sd] median   max

Connect:        0   0   0.3      0      4

Processing:     5  21   9.6     19     66

Waiting:        4  18   9.8     17     65

Total:          6  21   9.6     20     66

 

Percentage ofthe requests served within a certain time (ms)

  50%    20

  66%    22

  75%    27

  80%    30

  90%    34

  95%    39

  98%    44

  99%    48

 100%    66 (longest request)

 

 可见,平均每秒请求数(吞吐率)为4345.52, 从不同分布下的请求数来看,响应时间也比较平稳, 相比直接访问接口的性能相差不大。

 

ab.exe -n 1000 -c 100http://localhost:9030/api/values/

This is ApacheBench, Version 2.3 <$Revision:1757674 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd,http://www.zeustech.net/

Licensed to The Apache Software Foundation,http://www.apache.org/

 

Benchmarking localhost (be patient)

Completed 100 requests

Completed 200 requests

Completed 300 requests

Completed 400 requests

Completed 500 requests

Completed 600 requests

Completed 700 requests

Completed 800 requests

Completed 900 requests

Completed 1000 requests

Finished 1000 requests

 

 

Server Software:        Kestrel

Server Hostname:        localhost

Server Port:            9030

 

Document Path:          /api/values/

Document Length:        19 bytes

 

Concurrency Level:      100

Time taken for tests:   0.200 seconds

Complete requests:      1000

Failed requests:        0

Total transferred:      158000 bytes

HTML transferred:       19000 bytes

Requests per second:    5011.40 [#/sec] (mean)

Time per request:       19.954 [ms] (mean)

Time per request:       0.200 [ms] (mean, across all concurrentrequests)

Transfer rate:          773.24 [Kbytes/sec] received

 

Connection Times (ms)

             min  mean[+/-sd] median   max

Connect:       0    0   0.3     0       1

Processing:    3   19   3.4    19      29

Waiting:       2   13   4.8    13      25

Total:         3   19   3.4    20      29

 

Percentage of the requests served within acertain time (ms)

 50%     20

 66%     20

 75%     21

 80%     21

 90%     22

 95%     23

 98%     25

 99%     25

 100%    29 (longest request)

 

         Asp.netcore的性能绝不亚于Nginx,但扩展性却远高于Nginx,我们可以动态的指定被代理的目标地址,而在Nginx中配置的目标地址是静态的,这一点对于我们将来实现服务发现功能及其重要,因为我们需要从ServiceRegistry中获取需要代理的微服务信息(例如IP和端口),并执行反向代理操作,调用相应的微服务REST API

         以上实际上是服务网关的基础框架,将来我们会在此基础上进行扩展,实现一个具有反向代理和服务发现的服务网关。当然服务网关并非仅提供反向代理与服务发现特性,此外还需要具备安全认证、性能监控、数据缓存、请求分片、静态响应等众多特性,我们可以根据实际情况进行扩展。


相关文章:

        
  • API网关Ocelot 使用Polly 处理部分失败问题

  • 微服务的误读与误解

  • 微服务(Microservices)

  • Fabio 安装和简单使用


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分表分库时机选择及策略

转载自 分表分库时机选择及策略 一. 分表 应用场景&#xff1a; 对于大型的互联网应用来说&#xff0c;数据库单表的记录行数可能达到千万级甚至是亿级&#xff0c;并且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构&#xff0c;只能够对数据库的读进…

2015蓝桥杯省赛---java---A---2(星系炸弹)

题目描述 思路分析 方案一 方案二 package TEST;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;class Main{public static void main(String[] args) {SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd");…

NuGet社区使用体验调查

Nuget 是我们使用.NET Core的一项基础设施&#xff0c;针对国内访问NuGet服务器速度不稳定的问题我们希望通过收集一些来自用户的反馈来改善社区使用NuGet的体验。恳请您花2-3分钟时间完成以下的问题&#xff0c;我们会非常重视您的反馈。当我们收集完成所有的问卷&#xff0c;…

在护卫神上部署javaWeb项目,已经测试通过

以前一直在护卫神上部署PHP项目&#xff0c;今天忽然来了需求是部署javaWeb项目&#xff0c;刚开始一脸蒙蔽&#xff0c;后来发现也不是很难。那么接下来我们看看怎么在护卫神上部署java项目&#xff1a; 第一步&#xff1a;打开护卫神&#xff0c;在护卫神中添加一个网站&…

为什么选择微服务架构?如何取舍?

转载自 为什么选择微服务架构&#xff1f;如何取舍&#xff1f; 微服务是什么 微服务是一种架构风格&#xff0c;一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署&#xff0c;各个微服务之间是松耦合的。每个微服务仅关注于完成…

三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...

又一设备直升鸿蒙系统&#xff0c;现有操作系统被抛弃&#xff0c;和三星的想法一样&#xff01;前段时间华为正式发布了鸿蒙系统&#xff0c;这个系统可以说是期待已久了&#xff0c;在华为处于禁令时期时&#xff0c;鸿蒙被认为是替代安卓的操作系统。在鸿蒙发布后&#xff0…

从真实项目中抠出来的设计模式——第一篇:策略模式

有时候因为种种原因导致我们会写出很多丑陋的代码&#xff0c;比如赶工时&#xff0c;短暂性的偷懒&#xff0c;不会设计模式等等导致代码沉积&#xff0c;一个cs上万行代码这样场景是有发生&#xff0c; 当然这里也包括我。。。所以时间充裕一点之后就想重构一下&#xff0c;…

jquery实现单击div切换背景,再次单击回到原来样式

首先来看看效果图&#xff1a; 1.这是默认的的div样式&#xff1a; 2.当我们单击第一个div时的样式&#xff1a; 3.当我们再次单击第一个div时的样式&#xff1a; 如果你需要的效果是这样的&#xff0c;那么请您继续往下面看&#xff0c;如果不是&#xff0c;您也可以看看实…

Java进阶之对象克隆(复制)

转载自 Java进阶之对象克隆&#xff08;复制&#xff09; 假如说你想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅仅是int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但…

如何下载网页中的视频成mp4格式

1.在生活中&#xff0c;我们经常在网页上看到某个视频之后想要下载下来&#xff0c;可是&#xff0c;网上大部分的视频都在几大播放器所占领&#xff0c;比如爱奇艺、优酷、腾讯等等&#xff0c;当你在这些上面下载的时候会发现先要让你下载播放器&#xff0c;才能下载视频。这…

微软CNTK 2.0版本发布,支持C#

微软 CNTK 2.0 版本今天正式发布。 CNTK&#xff08;Cognitive Toolkit&#xff09;是微软的深度学习工具包&#xff0c;可以帮助企业加速图像和语音识别进程。有了今天的更新&#xff0c;企业可以在本地或云端结合 Azure GPU 使用 CNTK了。 伴随着今天的新版本发布&#xff0c…

Android碎片Fragment详讲(1)

Fragment Fragment创建的步骤 1、 继承fragment一定是V4包下的 2、 有且只有一个无参的构造方法 3、 如果Fragment需要显示界面&#xff0c;需要重写onCreateView方法 4、 指定布局资源&#xff0c;或者创建布局&#xff0c;返回即可 静态创建frag…

这些BATJ必考的Java面试题,你都懂了吗?

转载自 这些BATJ必考的Java面试题&#xff0c;你都懂了吗&#xff1f; 题目一 请对比 Exception 和 Error&#xff0c;另外&#xff0c;运行时异常与一般异常有什么区别&#xff1f; 考点分析&#xff1a; 分析 Exception 和 Error 的区别&#xff0c;是从概念角度考察了…

计算机玩游戏特别卡,Win7电脑游戏卡顿怎么办 win7玩游戏卡如何解决

很多人都喜欢在win7系统中玩游戏&#xff0c;而在玩游戏的时候经常会碰到一些故障&#xff0c;比如有很多用户反映的游戏卡顿、玩游戏太卡&#xff0c;这让很多游戏玩家很是苦恼&#xff0c;那么Win7电脑游戏卡顿怎么办呢&#xff1f;下面给大家介绍一下win7玩游戏卡的解决方法…

在IIS上部署你的ASP.NET Core项目

概述 与ASP.NET时代不同&#xff0c;ASP.NET Core不再是由IIS工作进程&#xff08;w3wp.exe&#xff09;托管&#xff0c;而是使用自托管Web服务器&#xff08;Kestrel&#xff09;运行&#xff0c;IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中&a…

2020蓝桥杯省赛---java---A---2(既分数组)

题目描述 代码实现 package TEST;public class Main {public static void main(String[] args) {int ans 0;for(int i1; i<2020; i)for(int j1; j<2020; j) // if(j>i){{if(gcd(i, j) 1) ans;} // }else { // if(gcd(i, j) …

西安理工大学计算机专业毕业,西安理工大学什么专业好找工作?毕业工资大概多少?答案在这里...

文/圆梦志愿 马老师西安理工大学是中央与地方共建的省属高水平大学&#xff0c;在本省的知名度较高&#xff0c;是一所实力还不错的理工类高校。那么&#xff0c;西安理工大学就业最好的专业是哪些&#xff1f;学校毕业生的薪资水平如何呢&#xff1f;一起来了解一下吧。一、西…

这些排序算法的使用时机,你都知道吗?

转载自 这些排序算法的使用时机&#xff0c;你都知道吗&#xff1f; 概述 排序有内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存…

2020蓝桥杯省赛---java---A---7(回文日期)

题目描述 思路分析 暴力判断 代码实现 package lanqiao;import java.util.Scanner;public class Main {public static String str"";public static boolean isLeap(int year){return (year%40&&year%100!0)||year%4000;}public static boolean check(int …

Spring Cloud 面试题

转载自 Spring Cloud 面试题 问题一&#xff1a; 什么是Spring Cloud&#xff1f; Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快…