使用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 ...
随机推荐
- poj 2528 (线段树+特殊离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51098 Accepted: 14788 ...
- 【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目 ...
- net 和Mono 构建的HTTP服务框架
Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...
- luogu3778/bzoj4898 商旅 (floyd+分数规划+spfa)
首先floyd求出来每两点间的最短距离,然后再求出来从某点买再到某点卖的最大收益 问题就变成了找到一个和的比值最大的环 所以做分数规划,二分出来那个答案r,把边权变成w[i]-r*l[i],再做spf ...
- Java实现的一个简单的模板渲染
代码 package com.hdwang; import java.util.HashMap; import java.util.Map; /** * Created by hdwang on 20 ...
- mybatis与分布式事务的面试
mybatis的面试: https://www.cnblogs.com/huajiezh/p/6415388.html 本地事务与分布式事务: https://www.cnblogs.com/xcj2 ...
- java基础基础总结----- RunTime
- Ajax跨域CORS
在Ajax2.0中多了CORS允许我们跨域,但是其中有着几种的限制:Origin.Methods.Headers.Credentials 1.Origin 当浏览器用Ajax跨域请求的时候,会带上一个 ...
- P3173 [HAOI2009]巧克力 && P1324 矩形分割
题目描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1×1的小方块. 对于一块木板,我们只能从某条横线或者某条竖线(要在方格线上),而且这木板是不均匀的,从不同的线切割下去要花不同的代价. ...
- JXL读取,写入Excel
JXL读取,写入Excel2003 相关阅读:poi 读写excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmlpoi 读写excel200 ...