【转载】Ocelot网关的路由热更新
调用API修改Ocelot的配置文件
Ocelot是一个基于.net core的开源webapi服务网关开源项目,功能比较强大,Github项目地址为:https://github.com/ThreeMammals/Ocelot,关于Ocelot的学习资料可以看看张善友的网站:http://www.csharpkit.com/apigateway.html。
Ocelot的路由设置是基于配置文件的,同样在Ocelot中使用Consul做服务发现时,也是基于配置文件,当我们修改路由或者需要往Consul中添加ServiceName的时候,需要修改配置文件,网关服务也需要重启,这当然不是我们想要的。
在张善友的帮助下,得知可以通过调用api的方式来修改Ocelot的配置文件,官方文档:https://ocelot.readthedocs.io/en/latest/features/administration.html,本文以示例的方式来介绍怎样通过调用api的方式修改Ocelot的配置文件。
环境
- .net core:2.1.4
- Ocelot:6.0
- IdentityServer4:2.2.0
准备
使用VS2017创建解决方案UpdateOcelotConfig,并添加三个项目:
Client
- 控制台项目
- 添加Ocelot包引用
IdentityService
- WebAPI项目
- 添加IdentityServer4包引用
WebAPIGetway
- WebAPI项目
- 添加IdentityServer4包引用
- 添加Ocelot包引用
项目创建完成后如下图:

IdentityService
该项目使用IdentityService4实现一个认证服务,因为在调用Ocelot的api接口时需要用到认证。
1、首先添加对IdentityService4的NuGet包引用;
2、添加Config.cs类,代码如下:
|
public class Config
{
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("s2api", "My API")
};
}
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "client",
AllowedGrantTypes =GrantTypes.ClientCredentials,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "s2api" }
}
};
}
}
|
3、Startup类修改,代码如下:
|
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients());
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();
}
|
4、修改项目的启动端口为9500。
WebAPIGetWay
该项目是使用Ocelot的网关服务,具体实现步骤如下:
1、添加Ocelot和IdentityService4的NuGet包引用;
2、添加Ocelot.json配置文件,内容如下:
|
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/values",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 10001
}
],
"UpstreamPathTemplate": "/a/api/values",
"UpstreamHttpMethod": [ "Get" ]
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:10000/"
}
}
|
3、修改Program.cs类,添加对Ocelot.json文件的引用
|
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//add ocelot json config file
.ConfigureAppConfiguration((hostingContext, builder) => {
builder
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("Ocelot.json")
.AddEnvironmentVariables();
})
.UseStartup<Startup>()
.UseUrls("http://*:10000")
.Build();
|
4、Startup类修改,代码如下:
|
public void ConfigureServices(IServiceCollection services)
{
Action<IdentityServerAuthenticationOptions> options = o =>
{
//IdentityService认证服务的地址
o.Authority = "http://localhost:9500";
//IdentityService项目中Config类中定义的ApiName
o.ApiName = "s2api";
o.RequireHttpsMetadata = false;
o.SupportedTokens = SupportedTokens.Both;
//IdentityService项目中Config类中定义的Secret
o.ApiSecret = "secret";
};
services.AddOcelot()
.AddAdministration("/admin", options);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseOcelot().Wait();
}
|
4、修改项目的启动端口为10000.
使用Postman测试下WebAPIGetway和IdentityService
1、设置解决方案的属性,同时启动两个项目

启动后如下图:

2、在Postman中调用 http://localhost:9500/connect/token,获取token,调用方式为Post,form-data传三个参数:
- client_id:client
- client_secret:secret
- grant_type:client_credentials
调用成功后如下图:

3、在Postman中调用接口 http://localhost:10000/admin/configuration 获取Ocelot的配置,接口路径中的admin是在WebAPIGetway项目中的Startup类中定义的
|
services.AddOcelot()
.AddAdministration("/admin", options);
|
该接口请求为Get请求,需要在Headers中设置上面获取的token,格式为:
|
Authorization:Bearer token
|
请求成功如下图:

4、在Postman中通过接口 http://localhost:10000/admin/configuration 修改配置,修改和获取配置的接口地址一致,修改时请求为Post,同样在Headers中需要添加token,另外还需要设置Content-Type,格式如下:
|
Authorization:Bearer token
Content-Type:application/json
|
请求的body就是调整后的json数据,调用成功回返回200,如下图:

5、在WebAPIGetway项目的运行目录中打开Ocelot的配置文件,验证是否修改成功。
使用代码方式来修改配置文件
通过Postman来进行测试如果能够验证通过,说明WebAPIGetway和IdentityService都运行正常,下面在Client项目中用代码的方式来进行配置文件的修改。Client代码如下:
|
namespace Client
{
class Program
{
static void Main(string[] args) => MainAsync().GetAwaiter().GetResult();
private static async Task MainAsync()
{
//需要修改的配置
var configuration = new FileConfiguration
{
ReRoutes = new List<FileReRoute>
{
new FileReRoute
{
DownstreamPathTemplate = "/api/values",
DownstreamHostAndPorts = new List<FileHostAndPort>
{
new FileHostAndPort
{
Host ="localhost",
Port = 10001,
},
new FileHostAndPort
{
Host ="localhost",
Port = 10002,
}
},
DownstreamScheme = "http",
UpstreamPathTemplate = "/c/api/values",
UpstreamHttpMethod = new List<string> { "Get","Post" }
}
},
GlobalConfiguration = new FileGlobalConfiguration
{
BaseUrl = "http://localhost:10000/"
}
};
// 从元数据中发现客户端
var disco = await DiscoveryClient.GetAsync("http://localhost:9500");
// 请求令牌
var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
var tokenResponse = await tokenClient.RequestClientCredentialsAsync("s2api");
if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}
var client = new HttpClient();
client.SetBearerToken(tokenResponse.AccessToken);
HttpContent content = new StringContent(JsonConvert.SerializeObject(configuration));
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await client.PostAsync("http://localhost:10000/admin/configuration", content);
Console.ReadLine();
}
}
}
|
思考
1、Ocelot文档中介绍可以使用外部的IdentityService服务,也可以用内置的,各有什么优缺点?
2、上面例子中是直接将json数据去做更新,有没有什么弊端?是否应该先获取配置,做修改后再更新?
示例代码
本文的示例代码已经放到Github上:https://github.com/oec2003/StudySamples/tree/master/UpdateOcelotConfig
【转载】Ocelot网关的路由热更新的更多相关文章
- YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...
- (转载)李剑英的CSLight入门指南结合NGUI热更新
原地址:http://www.xuanyusong.com/archives/3075 李剑英的CSLight入门指南文档撰写者:GraphicQQ: 1065147807 一. CSLIGHT 作者 ...
- 新版本vue-cli3.x 无法热更新问题【转载】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_38644883/articl ...
- [转载]Ocelot简易教程(五)之集成IdentityServer认证以及授权
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html 最近比较懒,所以隔了N天才来继续更新第五篇Ocelot简易教程,本篇教程会先简单介 ...
- [转载]Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html 很多人都说配置文件的配置很繁琐,如果存储在数据库就方便很多,可以通过自定义UI界面 ...
- [转载]Ocelot简易教程(一)Ocelot是什么
Ocelot简易教程(一)Ocelot是什么 简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术. 可能你又要问了,什么是API网关技术呢?Ocelot又有什么特别呢?我们又该 ...
- React Native拆包及热更新方案 · Solartisan
作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
随机推荐
- springboot集成h2以及可视化操作
1.新建项目
- 【Core内存】.NET Core 2.0中使用MemoryCache
说到内存缓存大家可能立马想到了HttpRuntime.Cache,它位于System.Web命名空间下,但是在ASP.NET Core中System.Web已经不复存在.今儿个就简单的聊聊如何在ASP ...
- itsdangerous
将字典进行加密.解密 通过私钥保证安全性 serializer=TimedJSONWebSignatureSerializer(私钥,过期时间) dumps(字典)=====>返回加密字符串 l ...
- VSCode汉化
1.打开VSCode 点击箭头指示地方 在搜索框中输入chinese 然后安装中文简体 2.按住 Ctrl+shift+p 选择配置显示语言 然后会看见下面的样子 添加 "locale&q ...
- JQuery 获取select被选中的value和text
html代码: <select name="test" > <option value="0">请选择</option> & ...
- 『TensorFlow』one_hot化标签
tf.one_hot(indices, depth):将目标序列转换成one_hot编码 tf.one_hot(indices, depth, on_value=None, off_value=Non ...
- Java虚拟机JVM相关知识整理
Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...
- MongoDB AUTH结果验证及开启方法
创建超级管理员(root)和普通用户(gxpt) #创建超级管理员(root) RS1:PRIMARY> use admin RS1:PRIMARY> db.createUse ...
- Linux获取so/ko文件版本号教程
一.需要获取版本号的原因 从使用角度而言,有时只有特定版本的库才支持某些功能,所以我们需要确定库文件版本号. 从安全加固角度而言,有些版本存在漏洞有些版本不存在漏洞,所以我们需要获取版本号以确定当前使 ...
- webstorm keys
{"licenseId":"ThisCrackLicenseId","licenseeName":"xuza",&quo ...