Ocelot允许用户将委托处理程序添加到HttpClient
传输中。 这个功能在github #208中提出,我确定它会以各种方式被使用。之后我们在GitHub#264中进行了扩展。
为了将委托处理程序添加到HttpClient
传输中,有两件重要的事情要做。
首先,为了创建一个可以用于委托处理程序的类,它必须如下所示。 我们将在asp.net core容器中注册这些处理程序,以便您可以将您已注册的其他服务注入到处理程序的构造函数中。
public class FakeHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//do stuff and optionally call the base handler..
return await base.SendAsync(request, cancellationToken);
}
}
其次,您必须将处理程序添加到Ocelot
的容器。
services.AddOcelot()
.AddDelegatingHandler<FakeHandler>()
.AddDelegatingHandler<FakeHandlerTwo>()
这两个Add
方法都具有一个称为global
的默认参数,该参数设置为false
。 如果为false
,则DelegatingHandler
需要通过ocelot.json
设置特定的Routes
(稍后会详细介绍)。 如果将其设置为true
,则它将成为全局处理程序并将应用于所有Route
。
例如
如下…
services.AddOcelot()
.AddDelegatingHandler<FakeHandler>(true)
最后,如果你想要Route
指定DelegatingHandlers
为你的特定DelegatingHandlers
,或全局(稍后会详细介绍)DelegatingHandlers
,那么你必须将下面的json
添加到ocelot.json
中的特定Route
中。 数组中的名称必须与您的DelegatingHandlers
类名匹配,以便Ocelot
将它们匹配在一起。
"DelegatingHandlers": [
"FakeHandlerTwo",
"FakeHandler"
]
你可以有多个DelegatingHandlers
,他们的运行顺序如下:
ocelot.json
的DelegatingHandlers
数组中的全局处理程序按加入的顺序排序。DelegatingHandlers
以及来自ocelot.json
的DelegatingHandlers
数组中的所有全局变量都按照它们在DelegatingHandlers
数组中的顺序排列。DelegatingHandler
(看跟踪文档).QoS
,那么这一步是QoS DelegatingHandler
(看服务质文档).HttpClient
发生HttpRequestMessage
.希望其他人会洞悉这个功能是很有用的!
Ocelot最近整合了Rafty
,这是我在去年一直研究的Raft
的一个实现。 这个项目实验性非常强,所以在我认为它没问题之前,请不要在生产环境中使用Ocelot
的这个功能。
Raft
是一种分布式一致性算法,它允许一组服务器(Ocelots
)保持本地状态,而不需要一个集中式数据库(例如SQL Server
)存储状态。
要获得Raft支持,您必须首先安装Ocelot Rafty软件包。
Install-Package Ocelot.Provider.Rafty
为了在Ocelot
中启用Rafty
,您必须对Startup.cs / Program.cs
进行以下改动。
public virtual void ConfigureServices(IServiceCollection services)
{
services
.AddOcelot()
.AddAdministration("/administration", "secret")
.AddRafty();
}
除此之外,您还必须在您的主项目中添加名为peers.json的文件,其内容看起来如下所示:
{
"Peers": [{
"HostAndPort": "http://localhost:5000"
},
{
"HostAndPort": "http://localhost:5002"
},
{
"HostAndPort": "http://localhost:5003"
},
{
"HostAndPort": "http://localhost:5004"
},
{
"HostAndPort": "http://localhost:5001"
}
]
}
Ocelot
的每个实例必须在数组中有它的地址,以便它们可以使用Rafty
进行通信。
完成这些配置更改后,您必须使用peers.json
文件中的地址部署和启动Ocelot
的每个实例。 然后服务器应该开始彼此通信! 您可以通过发布配置更新来检测一切是否正常工作,并通过配置来检查它是否已复制到所有服务器。