(2)ASP.NET Core3.1 Ocelot路由
1.路由
前一个章节我们已经介绍过Ocelot,相信大家也了解到,Ocelot的主要功能是接收客户端等传入的HTTP请求,并将其转发到下游服务。Ocelot当前仅以另一个http请求的形式支持此功能(将来可能是任何传输机制)。
Ocelot将一个请求路由到另一个请求。为了让Ocelot正常工作,您需要在配置中设置一个Route。下面我们就Ocelot基础项目构建简单介绍下路由功能。
2.Ocelot基础项目构建(APIGatewayBasicDemo)
现在我们根据GitHub贡献者开源项目来学习Ocelot,根据下载下来Ocelot基础项目结构来看,我们能看到有一个网关项目(APIGateway),一个客户API项目(CustomersAPIServices),一个产品API项目(ProductsAPIServices)。如下图所示:
2.1Ocelot网关配置
APIGateway网关项目根目录下面有一个configuration.json配置文件,内容如下:
{
//ReRoutes:处理上游请求的对象(客户端),每个数组{}就是配置:上游地址和对应下游地址
"ReRoutes": [
{
//以Downstream开头的,是要转发到下游服务器的地址(CustomersAPIServices),与nginx转发类似
//下面所有Downstream开头的,组成一个转发url,转发地址是http://localhost:9001/api/customers
"DownstreamPathTemplate": "/api/customers",
"DownstreamScheme": "http",
// "DownstreamHost": "localhost",
// "DownstreamPort": 9001,
//转发到下游服务器的主机和端口。
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9001
}
],
//Upstream开头是指上游服务器(客户端)访问地址,通过http get方式访问。
//也就是说客户端访问http://localhost:9000/customers 实际是转发到了http://localhost:9001/api/customers的服务
"UpstreamPathTemplate": "/customers",
"UpstreamHttpMethod": [ "Get" ]
},
{
"DownstreamPathTemplate": "/api/customers/{id}",
"DownstreamScheme": "http",
// "DownstreamHost": "localhost",
// "DownstreamPort": 9001,
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9001
}
],
"UpstreamPathTemplate": "/customers/{id}",
"UpstreamHttpMethod": [ "Get" ]
},
{
"DownstreamPathTemplate": "/api/products",
"DownstreamScheme": "http",
// "DownstreamPort": 9002,
// "DownstreamHost": "localhost",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 9002
}
],
"UpstreamPathTemplate": "/products",
"UpstreamHttpMethod": [ "Get" ]
}
],
//全局配置,允许覆盖ReRoutes特定设置
"GlobalConfiguration": {
"RequestIdKey": "OcRequestId",
"AdministrationPath": "/administration"
}
}
下面我们就文件中这些属性进行解释:
DownstreamPathTemplate:下游路由服务地址。
DownstreamScheme:下游服务地址访问协议类型http或者https。
DownstreamHostAndPorts:是一个数据集合,用于定义您希望将请求转发到的任何下游服务的主机和端口。通常,它仅包含一个条目,但是有时您可能希望对下游服务进行负载均衡请求,Ocelot允许您添加多个条目,然后选择一个负载均衡器。
UpstreamPathTemplate:上游服务地址,即下游服务真实访问地址。
UpstreamHttpMethod:上游服务HTTP请求方式,例如Get、Post。
GlobalConfiguration:顾名思义就是全局配置,此节点的配置允许覆盖ReRoutes里面的配置,你可以在这里进行通用的一些配置信息。
在Ocelot中,您可以以{something}的形式将变量的占位符添加到模板中。占位符变量需要同时存在于DownstreamPathTemplate和UpstreamPathTemplate属性中。当设置为Ocelot时,Ocelot将尝试为每个请求Ocelot进程将UpstreamPathTemplate占位符中的值替换为DownstreamPathTemplate。例如上述/customers/{id}。
2.2Core项目中添加Ocelot支持
现在我们在core项目中添加Ocelot支持,代码如下:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//.UseStartup<Startup>()
//设置网关url
.UseUrls("http://*:9000")
.ConfigureAppConfiguration((hostingContext, config) =>
{
//添加Ocelot配置文件
config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("configuration.json")
.AddEnvironmentVariables();
})
.ConfigureServices(s =>
{
//添加Ocelot服务
s.AddOcelot();
s.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
})
.Configure(a =>
{
//使用Ocelot中间件
a.UseOcelot().Wait();
});
Ocelot的配置如上代码基本完成了,下面我们看看一个基础Ocelot路由正常工作流程。
CustomersAPIServices项目的CustomersController有如下两个方法:
[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "Catcher Wong", "James Li" };
} [HttpGet("{id}")]
public string Get(int id)
{
return $"Catcher Wong - {id}";
}
}
ProductsAPIServices项目的ProductsController有如下一个方法:
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "Surface Book 2", "Mac Book Pro" };
}
}
上面这三个下游路由地址根据configuration.json配置文件都分别配置了上游分发地址,我们把这三个项目根据配置信息分别在IIS上部署起来,当然你们也可以使用dotnet run命令分别启动这个三个项目。APIGateway、CustomersAPIServices、ProductsAPIServices项目绑定主机地址分别是http://localhost:9000、http://localhost:9001、http://localhost:9002。
当我们在浏览器上打开http://localhost:9000/customers时候,会发现浏览器上输出如下信息:
为什么输入网关主机地址,返回过来却是客户主机处理结果?那是因为当客户端访问上游服务http://localhost:9000/customers时候,Ocelot会根据配置信息中下游模版把请求分发到http://localhost:9001/api/Customers/Get去处理,然后返回结果。
而当我们打开http://localhost:9000/customers/1时候,也会输出如下信息:
配置信息中上游模版/customers/{id}对应下游模版/api/customers/{id},当我们请求的路径为http://localhost:9000/customers/1时候,Ocelot会根据配置信息分发到对应的下游路由http://localhost:9001/api/Customers/Get/1去处理,然后返回结果。
同理,当客户端访问上游服务http://localhost:9000/products时候,Ocelot也会分发到对应的下游路由http://localhost:9002/api/Products去处理,然后返回结果:
根据上面测试结果,也就是说我们的Ocelot已经在起作用了,而且根据上下游路由进行了映射。当然该章节也只是简单介绍Ocelot路由功能,而configuration.json配置中有些属性还没有进行描述,例如负载均衡、限流,熔断等等。下面我会继续根据GitHub贡献者开源项目继续讲解其功能。
参考文献:
Ocelot官网
(2)ASP.NET Core3.1 Ocelot路由的更多相关文章
- (8)ASP.NET Core3.1 Ocelot Consul服务注册与发现
1.服务注册与发现(Service Discovery) ●服务注册:我们通过在每个服务实例写入注册代码,实例在启动的时候会先去注册中心(例如Consul.ZooKeeper.etcd.Eureka) ...
- (1)ASP.NET Core3.1 Ocelot介绍
1.简介 Ocelot原本设计仅为与.NET Core一起使用的,它是一个.NET API网关,作为面向使用.NET运行微型服务/面向服务的体系结构需要统一的系统入口点,即当客户端(Web站点,手机A ...
- (3)ASP.NET Core3.1 Ocelot认证
1.认证 当客户端通过Ocelot访问下游服务的时候,为了保护下游资源服务器会进行认证鉴权,这时候需要在Ocelot添加认证服务.添加认证服务后,随后使用Ocelot基于声明的任何功能,例如授权或使用 ...
- (4)ASP.NET Core3.1 Ocelot负载均衡
1.负载均衡 Ocelot可以在每个路由的可用下游服务中实现负载均衡,这使我们更有效地选择下游服务来处理请求.负载均衡类型:●LeastConnection:根据服务正在处理请求量的情况来决定哪个服务 ...
- (5)ASP.NET Core3.1 Ocelot服务质量
1.服务质量(Quality of Service) 对于微服务来说,熔断就是我们常说的"保险丝",意思是当服务出现某些状况时候,通过切断服务防止应用程序不断地执行可能会失败的操作 ...
- (7)ASP.NET Core3.1 Ocelot Swagger
1.前言 前端与后端的联系更多是通过API接口对接,API文档变成了前后端开发人员联系的纽带,开始变得越来越重要,而Swagger就是一款让你更好的书写规范API文档的框架.在Ocelot Swagg ...
- 探索Asp net core3中的 项目文件、Program.cs和通用host(译)
引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...
- 《Asp.Net Core3 + Vue3入坑教程》-Net Core项目搭建与Swagger配置步骤
简介 <Asp.Net Core3 + Vue3入坑教程> 此教程仅适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 教程后 ...
- 《Asp.Net Core3 + Vue3入坑教程》 - Vue 1.使用vue-cli创建vue项目
简介 <Asp.Net Core3 + Vue3入坑教程> 此教程适合新手入门或者前后端分离尝试者.可以根据图文一步一步进操作编码也可以选择直接查看源码.每一篇文章都有对应的源码 目录 & ...
随机推荐
- pytorch和tensorflow的爱恨情仇之基本数据类型
自己一直以来都是使用的pytorch,最近打算好好的看下tensorflow,新开一个系列:pytorch和tensorflow的爱恨情仇(相爱相杀...) 无论学习什么框架或者是什么编程语言,最基础 ...
- Anaconda安装Pytorch(通过本地安装包)
前提:你已经事先安装好了Anaconda 在线安装pytorch总是出现这样那样的问题,所以我选择先去清华镜像下载好与python版本对应的pytorch和torchvision文件,然后本地安装 清 ...
- 043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用
043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...
- 【题解】[ZJOI2009]狼和羊的故事
题目戳我 \(\text{Solution:}\) 显然思路,把所有羊看成一个源点,所有狼看成一个汇点,格子之间连容量为\(1\)的边,直接跑最小割. 技巧: 注意到篱笆不能把羊给割掉,狼同理.所以, ...
- LiteOS-任务篇-源码分析-任务调度函数
目录 前言 笔录草稿 核心源码分析 osTaskSchedule函数源码分析 osPendSV函数源码分析 TaskSwitch函数源码分析 调度上层源码分析 osSchedule函数源码分析 LOS ...
- 多测师讲解第一个月 _综合面试题_高级讲师肖sir
第一个月综合面试题 1. 冒烟测试是什么意思? 对主要的用例测试 2.你们公司的项目流程是什么? 3.你们公司的bug分几个级别? 4个 4.你对外键是怎么理解的? 你会使用外键吗?给一个表添加 ...
- ssh登录二次验证,让服务器更安全。
码云地址 sshdTwoVerification 介绍 ssh登录二次验证 问题:现在很多人的Linux服务器可能会被攻击,只校验一次后台用户名密码登录变得不再保险. 当然大家首先要做的是修改ssh服 ...
- 例题4-2 刽子手游戏(Hangman Judge, UVa 489)
#include<stdio.h> #include<string.h> int ok ,no; int left ,chance; char s[20] ,s2[20]; v ...
- .Net Mvc学习——ASP.NET MVC中常用的ActionResult类型
一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...
- linux 查看nginx的安装路径等信息
做个随笔,记录一下. 想查看nginx的配置文件,但不知道nginx是安装在哪个目录下? ps -ef | grep nginx Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的 ...