上篇文章我们介绍了如何扩展Ocelot网关,并实现数据库存储,然后测试了网关的路由功能,一切都是那么顺利,但是有一个问题未解决,就是如果网关配置信息发生变更时如何生效?以及我使用其他数据库存储如何快速实现?本篇就这两个问题展开讲解,用到的文档及源码将会在GitHub上开源,每篇的源代码我将用分支的方式管理,本篇使用的分支为
course2
。
附文档及源码下载地址:[https://github.com/jinyancao/CtrAuthPlatform/tree/course2]
一、实现动态更新路由
上一篇我们实现了网关的配置信息从数据库中提取,项目发布时可以把我们已有的网关配置都设置好并启动,但是正式项目运行时,网关配置信息随时都有可能发生变更,那如何在不影响项目使用的基础上来更新配置信息呢?这篇我将介绍2种方式来实现网关的动态更新,一是后台服务定期提取最新的网关配置信息更新网关配置,二是网关对外提供安全接口,由我们需要更新时,调用此接口进行更新,下面就这两种方式,我们来看下如何实现。
1、定时服务方式
网关的灵活性是设计时必须考虑的,实现定时服务的方式我们需要配置是否开启和更新周期,所以我们需要扩展配置类AhphOcelotConfiguration
,增加是否启用服务和更新周期2个字段。
配置文件定义完成,那如何完成后台任务随着项目启动而一起启动呢?IHostedService
接口了解一下,我们可以通过实现这个接口,来完成我们后台任务,然后通过Ioc容器注入即可。
新建DbConfigurationPoller
类,实现IHostedService
接口,详细代码如下。
项目代码很清晰,就是项目启动时,判断配置文件是否开启定时任务,如果开启就根据启动定时任务去从数据库中提取最新的配置信息,然后更新到内部配置并生效,停止时关闭并释放定时器,然后再注册后台服务。
//注册后端服务
builder.Services.AddHostedService<DbConfigurationPoller>();
现在我们启动网关项目和测试服务项目,配置网关启用定时器,代码如下。
启动后使用网关地址访问http://localhost:7777/ctr/values
,可以得到正确地址。
然后我们在数据库执行网关路由修改命令,等10秒后再刷新页面,发现原来的路由失效,新的路由成功。
UPDATE AhphReRoute SET UpstreamPathTemplate='/cjy/values' where ReRouteId=1
看到这个结果是不是很激动,只要稍微改造下我们的网关项目就实现了网关配置信息的自动更新功能,剩下的就是根据我们项目后台管理界面配置好具体的网关信息即可。
2、接口更新的方式
对于良好的网关设计,我们应该是可以随时控制网关启用哪种配置信息,这时我们就需要把网关的更新以接口的形式对外进行暴露,然后后台管理界面在我们配置好网关相关信息后,主动发起配置更新,并记录操作日志。
我们再回顾下Ocelot
源码,看是否帮我们实现了这个接口,查找法Ctrl+F
搜索看有哪些地方注入了IFileConfigurationRepository
这个接口,惊喜的发现有个FileConfigurationController
控制器已经实现了网关配置信息预览和更新的相关方法,查看源码可以发现代码很简单,跟我们之前写的更新方式一模一样,那我们如何使用这个方法呢?
从源码中可以发现控制器中增加了授权访问,防止非法请求来修改网关配置,Ocelot源码经过升级后,把不同的功能进行模块化,进一步增强项目的可配置性,减少冗余,管理源码被移到了Ocelot.Administration里,详细的源码也就5个文件组成,代码比较简单,就不单独讲解了,就是配置管理接口地址,并使用IdentityServcer4进行认证,正好也符合我们我们项目的技术路线,为了把网关配置接口和网关使用接口区分,我们需要配置不同的Scope进行区分,由于本篇使用的IdentityServer4会在后续篇幅有完整介绍,本篇就直接列出实现代码,不做详细的介绍。现在开始改造我们的网关代码,来集成后台管理接口,然后测试通过授权接口更改配置信息且立即生效。
注意,由于Ocelot.Administration
扩展使用的是OcelotMiddlewareConfigurationDelegate
中间件配置委托,所以我们扩展中间件AhphOcelotMiddlewareExtensions
需要增加扩展代码来应用此委托。
新建IdeitityServer
认证服务,并配置服务端口6666
,并添加二个测试客户端,一个设置访问scope为gateway_admin
,另外一个设置为其他,来分别测试认证效果。
配置好认证服务器后,我们使用PostMan
来测试接口调用,首先使用有权限的client2
客户端,获取access_token
,然后使用此access_token
访问网关配置接口。
访问http://localhost:7777/CtrOcelot/configuration
可以得到我们数据库配置的结果。
我们再使用POST的方式修改配置信息,使用PostMan测试如下,请求后返回状态200(成功),然后测试修改前和修改后路由地址,发现立即生效,可以分别访问http://localhost:7777/cjy/values
和http://localhost:7777/cjy/values
验证即可。然后使用client1
获取access_token,请求配置地址,提示401未授权,为预期结果,达到我们最终目的。
到此,我们网关就实现了2个方式更新配置信息,大家可以根据实际项目的情况从中选择适合自己的一种方式使用即可。
二、实现其他数据库扩展(以MySql为例)
我们实际项目应用过程中,经常会根据不同的项目类型选择不同的数据库,这时网关也要配合项目需求来适应不同数据库的切换,本节就以mysql为例讲解下我们的扩展网关怎么实现数据库的切换及应用,如果有其他数据库使用需求可以根据本节内容进行扩展。
在【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置信息(1)中介绍了网关的数据库初步设计,里面有我的设计的概念模型,现在使用mysql数据库,直接生成mysql的物理模型,然后生成数据库脚本,详细的生成方式请见上一篇,一秒搞定。是不是有点小激动,原来可以这么方便。
新建MySqlFileConfigurationRepository
实现IFileConfigurationRepository
接口,需要NuGet
中添加MySql.Data.EntityFrameworkCore
。
实现代码后如何扩展到我们的网关里呢?只需要在注入时增加一个扩展即可。在ServiceCollectionExtensions
类中增加如下代码。
最后把mysql数据库插入sqlserver一样的路由测试信息,然后启动测试,可以得到我们预期的结果。为了方便大家测试,附mysql插入测试数据脚本如下。
如果想扩展其他数据库实现,直接参照此源码即可。
三、回顾与预告
本篇我们介绍了2种动态更新配置文件的方法,实现访问不同,各有利弊,正式使用时可以就实际情况选择即可,都能达到我们的预期目标,也介绍了Ocelot扩展组件的使用和IdentityServer4的基础入门信息。然后又扩展了我们mysql数据库的存储方式,增加到了我们网关的扩展里,随时可以根据项目实际情况进行切换。
网关的存储篇已经全部介绍完毕,有兴趣的同学可以在此基础上继续拓展其他需求,下一篇我们将介绍使用redis来重写Ocelot里的所有缓存,为我们后续的网关应用打下基础。
相关文章:
AspNetCore中使用Ocelot之 IdentityServer4
Ocelot-基于.NET Core的开源网关实现
.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权
Swagger如何访问Ocelot中带权限验证的API
Ocelot.JwtAuthorize:一个基于网关的Jwt验证包
.NET Core微服务之基于Ocelot实现API网关服务
.NET Core微服务之基于Ocelot实现API网关服务(续)
.NET微服务体系结构中为什么使用Ocelot实现API网关
Ocelot简易教程(一)之Ocelot是什么
Ocelot简易教程(二)之快速开始1
Ocelot简易教程(二)之快速开始2
Ocelot简易教程(三)之主要特性及路由详解
Ocelot简易教程(四)之请求聚合以及服务发现
Ocelot简易教程(五)之集成IdentityServer认证以及授权
Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据
Ocelot简易教程(七)之配置文件数据库存储插件源码解析
ASP.NET Core中Ocelot的使用:API网关的应用
ASP.NET Core中Ocelot的使用:基于Spring Cloud Netflix Eureka的动态路由
ASP.NET Core中Ocelot的使用:基于服务发现的负载均衡
【.NET Core项目实战-统一认证平台】第一章 功能及架构分析
定制Ocelot来满足需求
【.NET Core项目实战-统一认证平台】第三章 网关篇-数据库存储配置(1)
原文地址: http://www.cnblogs.com/jackcao/p/9950305.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com