添加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的更多相关文章

  1. asp.net core系列 60 Ocelot 构建服务认证示例

    一.概述 在Ocelot中,为了保护下游api资源,用户访问时需要进行认证鉴权,这需要在Ocelot 网关中添加认证服务.添加认证后,ReRoutes路由会进行身份验证,并使用Ocelot的基于声明的 ...

  2. Ocelot + IdentityServer4 构建 GateWay

    上一篇已经构建好了例子,接下来将IdentityServer4添加到Ocelot中去实现 配置一个客户端配置,可以构建一个简单的客户端信息,这里我用的混合模式,配置比较多,对于客户端模式而言实际很多都 ...

  3. asp.net core系列 59 Ocelot 构建基础项目示例

    一.入门概述 从这篇开始探讨Ocelot,Ocelot是一个.NET API网关,仅适用于.NET Core,用于.NET面向微服务/服务的架构中.当客户端(web站点.ios. app 等)访问we ...

  4. asp.net core系列 61 Ocelot 构建服务发现简单示例

    一.概述 Ocelot允许指定服务发现提供程序,如Consul或Eureka. 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口.目前Ocelo ...

  5. .NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

    先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访问系统的组件. 参考 本文将使用 Ocelot 构建统一入口的 Gateway. 关于 IdentityS ...

  6. Ocelot 资源汇总

    前言 最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多,Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认 ...

  7. NET Core + Ocelot + IdentityServer4 + Consul

    .NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访 ...

  8. 【转】.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

    作者:Zhang_Xiang 原文地址:.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发 ...

  9. 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)

    原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...

随机推荐

  1. C# 汉字排序

    转载:http://blog.csdn.net/lgx040605112/article/details/6042316 using System; using System.Globalizatio ...

  2. mininet invalid literal for int() with base 10: 'cpu.cfs_period_us:'

    问题产生原因:内核编译时没有加入 CONFIG_CFS_BANDWIDTH 选项 http://www.haifux.org/lectures/299/netLec7.pdf https://mail ...

  3. js 语法高亮插件之 Prism.js

    之前也介绍过几款语法高亮插件<为博客园选择一个小巧霸气的语法高亮插件>以及关于他们的综合性能<再议 语法高亮插件的选择>.今天在小影志博客看到<使用 Prism.js 实 ...

  4. html5 canvas 奇怪的形状水平渐变(因为大多数的之前的文章把基础都打过了,所以开始写的快了,如果有不明白的,可以回顾下之前的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. angularJs入门篇-hello world 开头

    AngularJS 采用了完全不同的解决方案,它创建实时视图模板代替视图,而不是将数据合并进模板之后更新DOM. 任何一个独立视图组件中的值都是 动态替换的.这个功能可以说是AngularJS中最重要 ...

  6. iOS 根据生日得到生肖,星座,年龄的算法

    根据用户生日,得到相应的年龄,星座和生肖.有的项目中可能会用到,贴出来共享. 得到年龄,这个很简单了: - (void)getAgeWith:(NSDate*)birthday{ //日历 NSCal ...

  7. Struts2不扫描jar包中的action

    今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action.st ...

  8. 【干货】Windows系统信息收集篇

    市场分析:计算机取证,就是应急响应.而应急响应的市场在于黑产的攻击频率.在当今的社会里,更多的人为了钱铤而走险的比比皆是,这个市场随着比特币,大数据,物联网的来临,规模将更加的庞大与有组织性.这将导致 ...

  9. Java反射--基于ParameterizedType实现泛型类,参数化类型

    一.引子: 项目中使用Gson的反序列化将json转化成具体的对象,具体方法是: package com.google.gson;下的反序列化方法 public <T> T fromJso ...

  10. Linux的软中断处理实现 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3070190.html 一.概念   首先我们要知道为什么中断需要下半部 .我们可以想象一下,如果没有下半部 ...