为什么这篇的标题叫“Ocelot简易教程(二)之快速开始2”呢,因为很多朋友跟我说上一篇“ Ocelot简易教程(二)之快速开始1”内容太少了,只是简单介绍Ocelot的一些简单配置,让Ocelot能跑起来!所以才有了这篇快速开始2.在这篇文章中,我会一步一步记录怎么跑起来一个Ocelot项目,并简单的介绍一下Ocelot怎么实现接口间的负载均衡!此篇文章的代码我会放在我的github上面。后续深入的记录Ocelot的使用的时候也会沿用这次的代码。

Ocelot简易教程目录

本文作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9638417.html

一步一步开始

  1. 演示项目概述
    这次的演示项目因为要实现Ocelot的负载均衡的功能,因此至少需要三个项目:Ocelot网关,OrderApi,GoodApi .名字随便取的,可能博主认为这样起名字比较顺口,没有其他特别的含义。

  2. 新建上面的三个asp.net core web api项目
    相信看这篇文章的朋友至少应该懂asp.net core了吧,不然你也接触不到Ocelot的。所以,这里假设大家都会创建asp.net core web api(因为真的没什么技术含量)。创建后的项目接口如下图所示:

  1. 给OcelotDemo网关项目添加Ocelot包以及配置文件
    首先给OcelotDemo添加Nuget包,可以右键“管理Nuget”包,然后搜索Ocelot添加,如下图所示:


也可以通过命令 Install-Package Ocelot进行安装。方式随你喜欢。

然后给OcelotDemo项目新建一个json文件,新建的方式就是,右键OcelotDemo项目,然后选择“添加”-》“新建项”,在弹出的窗口里面找到json文件,并写好文件的名字即可,(当然,也可以用快捷键 Ctrl+Shilt+A)如下图所示:

当然,你还需要右键你刚刚设置的ocelot.json文件,并设置“复制到输出目录”的属性为“始终复制”如下所示:

接下来,可以按照我写的非常简单的配置进行配置。

  1. {
  2. "ReRoutes": [
  3. {
  4. "DownstreamPathTemplate": "/api/{everything}",
  5. "DownstreamScheme": "http",
  6. "DownstreamHostAndPorts": [
  7. {
  8. "Host": "localhost",
  9. "Port": 1001
  10. },
  11. {
  12. "Host": "localhost",
  13. "Port": 1002
  14. }
  15. ],
  16. "UpstreamPathTemplate": "/{everything}",
  17. "UpstreamHttpMethod": [ "Get", "Post" ],
  18. "LoadBalancerOptions": {
  19. "Type": "RoundRobin"
  20. }
  21. }
  22. ],
  23. "GlobalConfiguration": {
  24. }
  25. }

上面配置,有两个节点,分别是ReRoutes数组,以及GlobalConfiguration。这里简单做一下阐述:

ReRoutes:告诉Ocelot如何处理上游的请求。

DownstreamPathTemplate:下游的路由模板,即真实处理请求的路径模板

DownstreamScheme:请求的方式,如:http,htttps

DownstreamHostAndPorts:下游的IP以及端口,可以有多个(如果使用负载均衡),方便实现负载均衡,当然你也可以使用服务发现,实现下游服务的自动注册与发现,这篇文章不会讲解。

UpstreamPathTemplate:上游请求的模板,即用户真实请求的链接

UpstreamHttpMethod:上游请求的http方法,是个数组,你可以写多个。

LoadBalancerOptions:负载均衡选项(DownstreamHostAndPorts有多个的时候才能看到效果),有三种方式

LeastConnection : 将请求发往最空闲的那个服务器

RoundRobin :轮流发送

NoLoadBalance :不启用负载均衡,总是发往第一个请求或者服务发现的那个服务器

GlobalConfiguration:顾名思义就是全局配置,此节点的配置允许覆盖ReRoutes里面的配置,你可以在这里进行通用的一些配置信息。

  1. OcelotDemo中添加Ocelot支持。

    首先在OcelotDemo项目的Program.cs中加载上一步我们添加的Ocelot的配置文件,如下所示:

    1. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    2. WebHost.CreateDefaultBuilder(args)
    3. .ConfigureAppConfiguration((hostingContext, config) =>
    4. {
    5. config
    6. .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
    7. .AddJsonFile("appsettings.json", true, true)
    8. .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
    9. .AddJsonFile("Ocelot.json")
    10. .AddEnvironmentVariables();
    11. })
    12. .UseUrls("http://localhost:1000")
    13. .UseStartup<Startup>();

    然后,在Startup.cs中,添加Ocelot服务并启用Ocelot中间件,这里你需要在Startup.cs文件中引入下面两个命名空间:

    1. using Ocelot.DependencyInjection;
    2. using Ocelot.Middleware;

    然后,分别在ConfigureServices中注册Ocelot服务以及Configure中启用Ocelot中间件:

    1. public void ConfigureServices(IServiceCollection services)
    2. {
    3. services.AddOcelot();//注入Ocelot服务
    4. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    5. }
    6. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    7. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    8. {
    9. if (env.IsDevelopment())
    10. {
    11. app.UseDeveloperExceptionPage();
    12. }
    13. app.UseOcelot().Wait();//使用Ocelot中间件
    14. app.UseMvc();
    15. }

    这时候,Ocelot的配置基本完成了,下面我们验证下Ocelot有没有正常工作,以及我们配置的负载均衡,有没有起作用吧。

    1. 测试Ocelot项目以及负载均衡有没有起作用

      这里,首先分别对三个项目的ValuesController控制器做如下改造:

      OcelotDemo项目ValuesController中的Get方法改造如下:

      1. [HttpGet]
      2. public ActionResult<IEnumerable<string>> Get()
      3. {
      4. return new string[] { "value1 from Ocelot", "value2 from Ocelot" };
      5. }

      OrderApi项目中的ValuesController中的Get方法改造如下:

      1. [HttpGet]
      2. public ActionResult<IEnumerable<string>> Get()
      3. {
      4. return new string[] { "value1 from Order Api", "value2 from Order Api" };
      5. }

      GoodApi项目中的ValuesController中的Get方法改造如下:

      1. [HttpGet]
      2. public ActionResult<IEnumerable<string>> Get()
      3. {
      4. return new string[] { "value1 from Good Api", "value2 from Good Api" };
      5. }

    结合我们上面的配置,可以知道改造的目的就是为了如下的测试,我们做出如下假设:

    1. 为了验证上游模板/{everything} 对应下游模板/api/{everything} 我们请求的路径即为http://localhost:1000/Values 并且把GoodApi以及GoodApi响应路径分别设置为:http://localhost:1001/api/Values ,http://localhost:1003/api/Values 并得到正确的响应
    2. 为了验证Ocelot项目起作用,我们请求ocelotDemo项目的路径values,应该返回GoodApi,或者OrderApi项目中values控制器的值,而不是返回ocelotDemo中values控制器的值
    3. 为了验证Ocelot负载均衡起作用,我们连续访问ocelotDemo项目的路径values,则返回的结果应该是轮流返回GoodApi以及OrderApi的值。

    下面我们利用 dotnet run命令分别启动三个项目,当然你也可以多项目启动。然后访问OcelotDemo项目的Url并访问Values控制器,完整路径“http://localhost:1000/Values”,看到

    OcelotDemo的Url:http://localhost:1000

    GoodApi的Url:http://localhost:1001

    OrderApi的Url:http://localhost:1002

    我们第一次访问http://localhost:1000/Values 得到如下结果:

说明我们的假设1以及假设2都是没问题的。也就是说我们的Ocelot已经在起作用了,而且根据上下游路由进行了映射。

接下来我们刷新下页面,得到如下结果:

说明我们的假设3即Ocelot的负载均衡也起作用了。当然,你可以多刷新几次,可以看到返回的结果在GoodApi与Order Api之间来回切换。因为我们的负载均衡策略就是轮询啊!

源码链接

Github地址:https://github.com/yilezhu/OcelotDemo

最后

这篇文章主要是为了让记录如何快速的开始使用Ocelot。关于Ocelot的配置很多都没有描述,包括限流以及熔断策略,以及多配置文件自动加载功能,等等。这个超出了快速开始的范围,当然这些高级的用法会在下面的系列文章中会一一记录。

本文使用的是Ocelot最新版本,为了保持技术上的跟进,因此没有使用上篇文章介绍的老版本,所以演示都是通过最新的ocelot版本来跟进的!

总结

本篇文章只是记录了,如何快速的成功的使用ocelot,并进行了简单的配置,配置中又引入了一个负载均衡的策略,最后通过代码进行了相关的实现以及测试!关于其他的一些配置,我会在下面的文章中进行阐述。这里只是对上篇文章“Ocelot简易教程(二)之快速开始1”的补充!感谢大家的阅读!

作者:依乐祝

出处:https://www.cnblogs.com/yilezhu

联系:1015657114@qq.com .NET Core实战项目交流群:637326624

原文:https://www.cnblogs.com/yilezhu/p/9638417.html

 
 
 

[转载]Ocelot简易教程(二)之快速开始2的更多相关文章

  1. [转载]Ocelot简易教程(三)之主要特性及路由详解

    上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...

  2. [转载]Ocelot简易教程(五)之集成IdentityServer认证以及授权

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html 最近比较懒,所以隔了N天才来继续更新第五篇Ocelot简易教程,本篇教程会先简单介 ...

  3. [转载]Ocelot简易教程(一)Ocelot是什么

    Ocelot简易教程(一)Ocelot是什么 简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术. 可能你又要问了,什么是API网关技术呢?Ocelot又有什么特别呢?我们又该 ...

  4. [转载]Ocelot简易教程(二)之快速开始1

    Ocelot是为.net core量身定做的,目前是基于 netstandard2.0进行构建的. .NET Core 2.1中如何使用呢? 安装NuGet package 使用nuget安装Ocel ...

  5. [转载]Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html 很多人都说配置文件的配置很繁琐,如果存储在数据库就方便很多,可以通过自定义UI界面 ...

  6. [转载]Ocelot简易教程(四)之请求聚合以及服务发现

    上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍,今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能.希望能对大家有所帮助. 作者:依乐祝 原文地址:https://ww ...

  7. Ocelot简易教程(二)之快速开始2

    为什么这篇的标题叫"Ocelot简易教程(二)之快速开始2"呢,因为很多朋友跟我说上一篇" Ocelot简易教程(二)之快速开始1"内容太少了,只是简单介绍Oc ...

  8. Ocelot简易教程(二)之快速开始1

    Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...

  9. Ocelot简易教程(七)之配置文件数据库存储插件源码解析

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...

随机推荐

  1. LinearLayout-margin不起作用的处理

    1.如果LinearLayout中使用android:layout_marginRight不起作用,通过测试原来在android2.x中,如果一个控件中有android:layout_gravity属 ...

  2. 27.mutex跨进程通信

    创建互斥量mutex HANDLE mutex = CreateMutexA(NULL, TRUE, name); 根据id打开mutex HANDLE mutex = OpenMutexA(MUTE ...

  3. 用Fiddle跟踪调试移动表单

    简介:Fiddle,调试,移动表单 http://jingyan.baidu.com/article/925f8cb81e3a52c0dde05616.html

  4. Filebeat-1.3.1安装和设置(图文详解)(多节点的ELK集群安装在一个节点就好)(以Console Output为例)

    前期博客 Filebeat的下载(图文讲解) 前提 Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) Elasticse ...

  5. js全选反选按钮实现

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. position(static-relative-absolute-fixed),margin(top-right-bottom-left),top-right-bottom-left

    最近写css遇到一些问题,所以准备写下来捋一下思路. 1.position=satic下看margin的使用.(top-right-bottom-left在这种case下无效) 1-1)margin ...

  7. BZOJ5394: [Ynoi2016]炸脖龙(欧拉广义降幂)

    就是让你求这个: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5394 解题思路: NOIP2018后第一道题,感觉非常像那个上帝与集合的 ...

  8. 【LightOJ - 1205】Palindromic Numbers

    [链接]https://cn.vjudge.net/problem/LightOJ-1205 [题意] 求出L..R范围内的回文个数 [题解] 数位DP; 先求出1..x里面的回文串个数.则做一下前缀 ...

  9. oracle 日期

    http://blog.itpub.net/126211/viewspace-712986/

  10. mysql 获取自增id的值的方法

    原生jdbc方式: Statement.getGeneratedKeys() 示例: Statement stmt = null; ResultSet rs = null; try { // // C ...