使用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 ...
随机推荐
- MT【91】空间余弦定理
评:空间余弦定理:空间四边形$ABCD$中$cos<AC,BD>=\frac{|(|AB|^2+|CD|^2)-(|BC|^2+|AD|^2)}{2|AC||BD|}$,证明用向量.
- 【刷题】BZOJ 3252 攻略
Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(s ...
- 【CF888E】Maximum Subsequence(meet in the middle)
[CF888E]Maximum Subsequence(meet in the middle) 题面 CF 洛谷 题解 把所有数分一下,然后\(meet\ in\ the\ middle\)做就好了. ...
- 前端学习 -- Css -- 有序列表和无序列表
列表就相当于去超市购物时的那个购物清单, 在HTML也可以创建列表,在网页中一共有三种列表: 1.无序列表 2.有序列表 3.定义列表 无序列表 - 使用ul标签来创建一个无序列表 - 使用li在ul ...
- 使用IntelliJ IDEA工具创建SSM(Spring+MyBatis)项目
1. 安装和使用IntelliJ IDEA 参考:IntelliJ IDEA 的安装和使用教程 2. 创建Web项目 参考:IntelliJ IDEA 创建Java Web项目 3. Spring整合 ...
- ByteBuffer: 当由一个byte[]来生成一个固定不变的ByteBuffer时,使用ByteBuffer.wrap(byte[]);
StringBuilder sb = new StringBuilder(1024); //向sb中写入900个左右的随机字符内容 for(int j=1; j< 50;j++) { sb.ap ...
- 使用swagger2配置springboot时出现的问题
这个问题踩了几次坑了,这次又遇到了,不记录一下看来是不长记性了: 测试普通的增删改查的时候,发现删除和查询是对的,可是增加和更新却数据绑定不到controller的参数上面去. 因为是自定义的实体类, ...
- NameError: name 'reload' is not defined
对于 Python 2.X: import sys reload(sys) sys.setdefaultencoding("utf-8") 对于 <= Python 3.3: ...
- openstack项目【day23】:openstack组件介绍
本节内容 openstack介绍 openstack项目(服务名是项目名的别名) openstack运行流程 openstack各组件详解 一:openstack介绍 open ...
- Linux 用户和组管理
这是用户和组管理的知识点,不想看文字就看视频吧,还是视频为主,文字为备忘录 视频链接: 项目1用户管理 1.创建一个新用户user01,设置其主目录为/home/user01: #useradd –d ...