Ocelot简易教程(二)之快速开始2
为什么这篇的标题叫“Ocelot简易教程(二)之快速开始2”呢,因为很多朋友跟我说上一篇“ Ocelot简易教程(二)之快速开始1”内容太少了,只是简单介绍Ocelot的一些简单配置,让Ocelot能跑起来!所以才有了这篇快速开始2.在这篇文章中,我会一步一步记录怎么跑起来一个Ocelot项目,并简单的介绍一下Ocelot怎么实现接口间的负载均衡!此篇文章的代码我会放在我的github上面。后续深入的记录Ocelot的使用的时候也会沿用这次的代码。
Ocelot简易教程目录
- Ocelot简易教程(一)之Ocelot是什么
- Ocelot简易教程(二)之快速开始1
- Ocelot简易教程(二)之快速开始2
- Ocelot简易教程(三)之主要特性及路由详解
- Ocelot简易教程(四)之请求聚合以及服务发现
- Ocelot简易教程(五)之集成IdentityServer认证以及授权
- Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据
- Ocelot简易教程(七)之配置文件数据库存储插件源码解析
本文作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/9638417.html
一步一步开始
演示项目概述
这次的演示项目因为要实现Ocelot的负载均衡的功能,因此至少需要三个项目:Ocelot网关,OrderApi,GoodApi .名字随便取的,可能博主认为这样起名字比较顺口,没有其他特别的含义。新建上面的三个asp.net core web api项目
相信看这篇文章的朋友至少应该懂asp.net core了吧,不然你也接触不到Ocelot的。所以,这里假设大家都会创建asp.net core web api(因为真的没什么技术含量)。创建后的项目接口如下图所示:

- 给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里面的配置,你可以在这里进行通用的一些配置信息。
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有没有正常工作,以及我们配置的负载均衡,有没有起作用吧。
测试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" };
}
结合我们上面的配置,可以知道改造的目的就是为了如下的测试,我们做出如下假设:
- 为了验证上游模板/{everything} 对应下游模板/api/{everything} 我们请求的路径即为http://localhost:1000/Values 并且把GoodApi以及GoodApi响应路径分别设置为:http://localhost:1001/api/Values ,http://localhost:1003/api/Values 并得到正确的响应
- 为了验证Ocelot项目起作用,我们请求ocelotDemo项目的路径values,应该返回GoodApi,或者OrderApi项目中values控制器的值,而不是返回ocelotDemo中values控制器的值
- 为了验证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”的补充!感谢大家的阅读!
Ocelot简易教程(二)之快速开始2的更多相关文章
- Ocelot简易教程(二)之快速开始1
Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...
- [转载]Ocelot简易教程(二)之快速开始2
为什么这篇的标题叫“Ocelot简易教程(二)之快速开始2”呢,因为很多朋友跟我说上一篇“ Ocelot简易教程(二)之快速开始1”内容太少了,只是简单介绍Ocelot的一些简单配置,让Ocelot能 ...
- Ocelot简易教程(七)之配置文件数据库存储插件源码解析
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9852711.html 上篇文章给大家分享了如何集成我写的一个Ocelot扩展插件把Ocelot的配置存储 ...
- Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据
本来这篇文章在昨天晚上就能发布的,悲剧的是写了两三千字的文章居然没保存,结果我懵逼了.今天重新来写这篇文章.今天我们就一起来探讨下如何重写Ocelot配置文件的存储方式以及获取方式. 作者:依乐祝 原 ...
- Ocelot简易教程(五)之集成IdentityServer认证以及授权
Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocelot简易教程(二)之快速开始1 Ocelot简易教程(二)之快速开始2 Ocelot简易教程(三)之主要特性及路由详解 ...
- Ocelot简易教程(四)之请求聚合以及服务发现
上篇文章给大家讲解了Ocelot的一些特性并对路由进行了详细的介绍,今天呢就大家一起来学习下Ocelot的请求聚合以及服务发现功能.希望能对大家有所帮助. 作者:依乐祝 原文地址:https://ww ...
- Ocelot简易教程(三)之主要特性及路由详解
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...
- Ocelot简易教程(一)之Ocelot是什么
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9557375.html Ocelot简易教程目录 Ocelot简易教程(一)之Ocelot是什么 Ocel ...
- [转载]Ocelot简易教程(三)之主要特性及路由详解
上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...
随机推荐
- 推荐一款Notepad++主题Dracula
https://draculatheme.com/notepad-plus-plus/ Activating theme Go to %AppData%\Notepad++\themes Place ...
- makefile与动态链接库案例分析——动态库链接动态库
http://blog.csdn.net/huqinwei987/article/details/50517780 背景:效率考虑,要重用把服务器主备机方案,以库Libmdpha(高可用)的形式加进主 ...
- jquery学习总结1-12
一.jquery入口函数的几种写法 1.$(document).ready(function() { } ) ; 2.jquery(document).ready(function() { } ) ...
- 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)
传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...
- Linux学习---内存分布基础
内核空间 应用程序不允许访问 -----------------------------------------3G 栈空间 局部变量 RW ----------------------------- ...
- spring深入学习(一)-----IOC容器
spring对于java程序员来说,重要性不可言喻,可以想象下如果没有他,我们要多做多少工作,下面一个系列来介绍下spring(5.x版本). spring模块 IOC概念 spring中最重要的两个 ...
- Python开发——13.操作系统、进程和线程
一.操作系统 1.定义 操作系统是用来协调.管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间.操作系统运行在内核态,拥有对所有硬件的完全访问权,可以执行机器能够运行的任何指令.软件的 ...
- 写给笨蛋徒弟的学习手册(3)—C#中15个预定义数据类型
在C#中学习中,你会很早的遇到预定义数据类型这个概念,但你有没有仔细想过它存在的意义?正所谓“存在即合理”,预定义数据类型的存在目的主要有俩个方面,一是为了增加程序的安全性,同时减轻编译器负担,加快编 ...
- [solution]JZOJ-5838 旅游路线
[solution] JZOJ-5838 旅游路线 Time Limits 1000ms,Memory Limits 128MB 题面 Description GZOI队员们到X镇游玩.X镇是一个很特 ...
- python2 python3区别(续)
1.除法 Python2 Python3 int/int → int int/int → float python2下整数除以整数返回整数类型,python3下整数除以整数返回浮点数类型 当某些语句假 ...