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

Ocelot简易教程目录

  1. Ocelot简易教程(一)之Ocelot是什么
  2. Ocelot简易教程(二)之快速开始1
  3. Ocelot简易教程(二)之快速开始2
  4. Ocelot简易教程(三)之主要特性及路由详解
  5. Ocelot简易教程(四)之请求聚合以及服务发现
  6. Ocelot简易教程(五)之集成IdentityServer认证以及授权
  7. Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据
  8. 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文件,并设置“复制到输出目录”的属性为“始终复制”如下所示:

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

{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 1001
},
{
"Host": "localhost",
"Port": 1002
}
],
"UpstreamPathTemplate": "/{everything}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
],
"GlobalConfiguration": { }
}

上面配置,有两个节点,分别是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的配置文件,如下所示:

     public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
    config
    .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
    .AddJsonFile("appsettings.json", true, true)
    .AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
    .AddJsonFile("Ocelot.json")
    .AddEnvironmentVariables();
    })
    .UseUrls("http://localhost:1000")
    .UseStartup<Startup>();

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

    using Ocelot.DependencyInjection;
    using Ocelot.Middleware;

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

     public void ConfigureServices(IServiceCollection services)
    {
    services.AddOcelot();//注入Ocelot服务
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
    if (env.IsDevelopment())
    {
    app.UseDeveloperExceptionPage();
    }
    app.UseOcelot().Wait();//使用Ocelot中间件
    app.UseMvc();
    }

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

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

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

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

       [HttpGet]
      public ActionResult<IEnumerable<string>> Get()
      {
      return new string[] { "value1 from Ocelot", "value2 from Ocelot" };
      }

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

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

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

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

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

    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”的补充!感谢大家的阅读!

最新文章

  1. Convert BSpline Curve to Arc Spline in OpenCASCADE
  2. nodejs学习笔记(一)
  3. POJ2001 Shortest Prefixes
  4. ffmpeg解码音频流
  5. ECMAScript继承
  6. [ROS]1 小乌龟
  7. ios 代码截屏模糊问题解决办法
  8. PHPStorm 2016.2 - 2016.3许可证服务器
  9. vmstat 命令详解
  10. Java实现RSA密钥对并在加解密、加签验签中应用的实例
  11. react rem
  12. git 合并多个commit
  13. Unity3d 屏幕截图。并保存。iOS
  14. 基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
  15. 【BZOJ】【1415】【NOI2005】聪聪和可可
  16. Linux Tcl和Expect的安装
  17. 在input文本框中存入对象格式的数据
  18. python全栈开发从入门到放弃之字符编码
  19. python 正则表达式 (重点) re模块
  20. 64945e3dtw1dii6vfdr19j.jpg(PNG 图像,1497x929 像素)

热门文章

  1. Vue+Webpack构建移动端京东金融(一、开发前准备)
  2. Js 常用调试的方法
  3. ----constructor 与 object----
  4. Springboot &amp; Mybatis 构建restful 服务二
  5. 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)
  6. 在java中,事务是什么?
  7. 关于echarts生成雷达图的一些参数介绍
  8. 数据库 的几种链接 join
  9. 【转载】java定义二维数组问题。分清数组与集合的区别
  10. java面试一、1.3线程与进程