使用Ocelot构建GateWay
添加Nuget包:Ocelot
添加配置文件Ocelot.json 具体配置可以看另一篇Ocelot配置
Json配置文件主要包含两个根节点:
ReRoutes:路由重定向配置 都是数组结构 可以配置多个
GlobalConfigrations:全局配置
ReRoutes 主要包含了上下游的路径、方式、限流、负载等设置
我们先配置一个最简单的设置:
这里我做了一个负载,把api部署了2份做了一个简单的分布式,当我访问test的时候会被转发到20001或者 20002上
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/values/getuser",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port":
},
{
"Host": "localhost",
"Port":
}
],
"UpstreamPathTemplate": "/test",
"UpstreamHttpMethod": [ "Get" ],
"LoadBalancer": "LeastConnection",
"ServiceName": "userservices",
"UseServiceDiscovery": true
}
], "GlobalConfiguration": {
"BaseUrl": "http://localhost:20000",
"ServiceDiscoveryProvider": {
"Host": "localhost",
"Port": } }
}
这里我结合了Consul来实现,关于Consul的使用可以看官方文档:
需要下载consul.exe程序并将其启动起来 这是一个服务发现健康检查的组件 如果没有添加系统path设置就直接进入consul.exe目录启动起来
httpServer的默认地址是8500,访问下会进入consul的ui
访问 :http://localhost:20000/test
访问:http://localhost:20001/api/values/getuser
得到一样的结果,这里已经被转发了,因为我们配置负载均衡及健康监测
从而保证了在服务器宕机后或者在高QPS下的正常访问
在APIGateWay网关里添加对Ocelot的设置
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, builder) =>
{
builder
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("Ocelot.json");
})
.UseStartup<Startup>()
.UseUrls("http://localhost:20000")
.Build();
添加相关服务注册及configure
services.AddOcelot();
app.UseOcelot().Wait();
网关配置好后,需要对业务接口服务实现健康检查,设置好先关的参数处理consul的频率
DeregisterCriticalServiceAfter 失败多久后注销服务的
Interval 检查发送的评率
HTTP 检查的地址
applicationLifetime.ApplicationStarted.Register(() =>
{ //自动获取当前接口服务地址 var features = app.Properties["server.Features"] as FeatureCollection;
var addessess = features.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url)); foreach (var address in addessess)
{ var httpcheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(userappsetting.Value.DeregisterCriticalServiceAfter),
Interval = TimeSpan.FromSeconds(userappsetting.Value.Interval),
HTTP = new Uri(address, "/api/Check").OriginalString, };
//这里可以注入配置
var agentReg = new AgentServiceRegistration()
{
ID = $"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}",
Check = httpcheck,
Name = userappsetting.Value.ServiceName,
Address = address.Host,
Port = address.Port };
client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
} });
applicationLifetime.ApplicationStopped.Register(() =>
{
var features = app.Properties["server.Features"] as FeatureCollection;
var addessess = features.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url));
foreach (var address in addessess)
{
client.Agent.ServiceDeregister($"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}").GetAwaiter().GetResult();
}
});
注:上述代码注册指适用于 Hosting方式 ,如果你用的IIS做寄宿,
var addessess = features.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url));
获取到的地址不是你期待的地址,它是本地 127.0.0.1:随机端口 ,会导致健康检查服务注册了之后无法进行健康检查
可以配置下不同的启动方式来设置
applicationLifetime.ApplicationStarted.Register(() =>
{ if (userappsetting.Value.IsIISHost)
{
#region IIS 寄宿方式
var httpcheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(userappsetting.Value.DeregisterCriticalServiceAfter),
Interval = TimeSpan.FromSeconds(userappsetting.Value.Interval),
HTTP = new Uri(new Uri(userappsetting.Value.CurrentIISUrl), userappsetting.Value.MatchPath).OriginalString };
//这里可以注入配置
var agentReg = new AgentServiceRegistration()
{
ID = $"{userappsetting.Value.ServiceName}_{userappsetting.Value.CurrentIISUrl}_{userappsetting.Value.CurrentIISPort}",
Check = httpcheck,
Name = userappsetting.Value.ServiceName,
Address = userappsetting.Value.CurrentIISUrl,
Port = userappsetting.Value.CurrentIISPort };
client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
#endregion
}
else
{
#region 服务注册健康检查 Hosting寄宿
var addessess = app.ServerFeatures.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url)); foreach (var address in addessess)
{
var httpcheck = new AgentServiceCheck()
{
DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(userappsetting.Value.DeregisterCriticalServiceAfter),
Interval = TimeSpan.FromSeconds(userappsetting.Value.Interval),
HTTP = new Uri(address, userappsetting.Value.MatchPath).OriginalString };
//这里可以注入配置
var agentReg = new AgentServiceRegistration()
{
ID = $"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}",
Check = httpcheck,
Name = userappsetting.Value.ServiceName,
Address = address.Host,
Port = address.Port };
client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
}
#endregion } });
applicationLifetime.ApplicationStopped.Register(() =>
{
if (userappsetting.Value.IsIISHost)
{
client.Agent.ServiceDeregister($"{userappsetting.Value.ServiceName}_{userappsetting.Value.CurrentIISUrl}_{userappsetting.Value.CurrentIISPort}").GetAwaiter().GetResult();
}
else
{ var addessess = app.ServerFeatures.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url));
foreach (var address in addessess)
{
client.Agent.ServiceDeregister($"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}").GetAwaiter().GetResult();
}
} });
return applicationLifetime;
使用Ocelot构建GateWay的更多相关文章
- asp.net core系列 60 Ocelot 构建服务认证示例
一.概述 在Ocelot中,为了保护下游api资源,用户访问时需要进行认证鉴权,这需要在Ocelot 网关中添加认证服务.添加认证后,ReRoutes路由会进行身份验证,并使用Ocelot的基于声明的 ...
- Ocelot + IdentityServer4 构建 GateWay
上一篇已经构建好了例子,接下来将IdentityServer4添加到Ocelot中去实现 配置一个客户端配置,可以构建一个简单的客户端信息,这里我用的混合模式,配置比较多,对于客户端模式而言实际很多都 ...
- asp.net core系列 59 Ocelot 构建基础项目示例
一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...
- asp.net core系列 61 Ocelot 构建服务发现简单示例
一.概述 Ocelot允许指定服务发现提供程序,如Consul或Eureka. 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口.目前Ocelo ...
- .NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现
先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访问系统的组件. 参考 本文将使用 Ocelot 构建统一入口的 Gateway. 关于 IdentityS ...
- Ocelot 资源汇总
前言 最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多,Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认 ...
- NET Core + Ocelot + IdentityServer4 + Consul
.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访 ...
- 【转】.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现
作者:Zhang_Xiang 原文地址:.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发 ...
- 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)
原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...
随机推荐
- [代码]--db2中left()函数和right()函数对应oracle中的substr()函数
DB2 LEFT.RIGHT函数 语法:LEFT(ARG,LENGTH).RIGHT(ARG,LENGTH) LEFT.RIGHT函数返回ARG最左边.右边的LENGTH个字符串,ARG可以是CHA ...
- pgm10
这部分讨论 MAP 估计.从某个角度上来说,我们可以将这个问题转换成为前面讨论过的: 这样一来我们只需要将原先的 sum-product 换成 max-sum 即可.话虽这么说,我们还是看看 Koll ...
- hdu 5274 Dylans loves tree (树链剖分 + 线段树 异或)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- IDEA中在目录中如何快速指定到当前的类
类似于myeclipse的 Link with Editor 其实也在IDEA的这个位置,跟狙击镜的图标一样,叫做Scroll from Source 不同的的是,IDEA的这个功能,需要手动点击,才 ...
- 【刷题】BZOJ 4078 [Wf2014]Metal Processing Plant
Description 定义集合S的价值D(S)为: 现在给你n个元素,并给出其中任意两个元素之间的d(i,j)值 要你将这些元素划分成两个集合A.B. 求min{D(A)+D(B)}. 注:d(i, ...
- Tomcat如何开启SSL配置(https)
一.创建证书 证书用于客户端与服务端安全认证.我们可以使用JDK自带的keytool工具来生成证书.真正在产品环境中使用肯定要去证书提供商去购买,证书认证一般都是由VeriSign认证,官方地址:ht ...
- JDK 目录结构
c:\jdk1.7.0: JDK软件安装根目录.包含版权,许可证和自述文件等. c:\jdk1.7.0\bin: 包含JDK中开发工具的可执行文件(在PATH环境变量中应该包含此目录). c:\jdk ...
- IAR ------ 基本使用
1.编译结果: 6 887 bytes of readonly code memory 621 bytes of readonly data memory 331 bytes of readwrite ...
- 记踩坑--Flask Web开发:S6电子邮件 ----[Errno 11004] getaddrinfo failed
必须要记录下踩过的坑,一来,为后来者铺路,二来,实在摔得疼,提醒自己写代码要谨小慎微. [Errno 11004] getaddrinfo failed 1.先排除邮箱账号和授权码的错误 测试如下代码 ...
- 解决小程序中 cover-view无法盖住canvas的问题,仅安卓真机出现
原因在于系统页面渲染的差异,在安卓中页面dom的渲染并不是完成按照上下顺序来的, 有可能出现写在后面的dom被先渲染出来,因此会随机出现能盖住.不能盖住的情况,很诡异是不是? 开发者工具中并非真机,只 ...