写个重新加载 ocelot 配置的接口

原文:写个重新加载 ocelot 配置的接口

写个重新加载 ocelot 配置的接口

Intro

我们想把 ocelot 的配置放在自己的存储中,放在 Redis 或者数据库中,当修改了 Ocelot 的配置之后希望即时生效,又不想在网关这边定时刷新 ocelot 配置,ocelot 配置没变化的时候,定时刷新配置是一种无意义的资源浪费,ocelot 自带的有一个 Administration ,感觉对于我来说,有点太重了,不想去集成这个东西,于是就想自己实现一个重新加载配置的接口。

实现代码

在集成 Ocelot 网关的项目的 Startup 里的 Configure 方法中添加如下代码:

#region 更新 Ocelot 配置接口

            // PUT /ocelot/admin/configuration 需要 Admin 的角色
            app.Map(new PathString("/ocelot/admin/configuration"), appBuilder =>
            {
                appBuilder.Use(async (context, next) =>
                {
                    if (context.Request.Method.ToUpper() != "PUT")
                    {
                        context.Response.StatusCode = 404;
                        return;
                    }
                    var authenticateResult = await context.AuthenticateAsync(AuthenticationProviderKey);
                    if (!authenticateResult.Succeeded)
                    {
                        context.Response.StatusCode = 401;
                        return;
                    }
                    if (authenticateResult.Principal.IsInRole("Admin"))
                    {
                        var configurationRepo =
                            context.RequestServices.GetRequiredService<IFileConfigurationRepository>();
                        var ocelotConfiguration = await configurationRepo.Get();
                        var logger = context.RequestServices.GetRequiredService<ILoggerFactory>().CreateLogger("OcelotConfiguration");
                        if (!ocelotConfiguration.IsError)
                        {
                            var internalConfigurationRepo = context.RequestServices.GetRequiredService<IInternalConfigurationRepository>();
                            var internalConfigurationCreator =
                                context.RequestServices.GetRequiredService<IInternalConfigurationCreator>();
                            var internalConfiguration = await internalConfigurationCreator.Create(ocelotConfiguration.Data);
                            if (!internalConfiguration.IsError)
                            {
                                internalConfigurationRepo.AddOrReplace(internalConfiguration.Data);
                                context.Response.StatusCode = 200;
                                return;
                            }
                            else
                            {
                                logger.LogError($"update ocelot configuration error, error in create ocelot internal configuration, error messages:{string.Join(", ", ocelotConfiguration.Errors)}");
                            }
                        }
                        else
                        {
                            logger.LogError($"update ocelot configuration error, error in get ocelot configuration from configurationRepo, error messages:{string.Join(", ", ocelotConfiguration.Errors)}");
                        }
                        context.Response.StatusCode = 500;
                    }
                    else
                    {
                        context.Response.StatusCode = 403;
                    }
                });
            });

            #endregion 更新 Ocelot 配置接口

这里的代码包含了一些逻辑,检查了要操作的用户是否拥有 Admin 的角色,可以自己根据自己的需要自行修改进行定制,可以自定义要操作的角色,自定义要操作的接口地址以及请求方式。

AuthenticationProviderKey 是在 ConfigureServices 方法中定义的认证方式,示例代码如下:

        public IConfiguration Configuration { get; }

        private readonly string AuthenticationProviderKey = "IdentityApiKey";

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            //…
            services.AddAuthentication()
                .AddIdentityServerAuthentication(AuthenticationProviderKey, x =>
                {
                    x.Authority = Configuration["Authorization:Authority"];
                    x.ClaimsIssuer = Configuration["Authorization:ClaimsIssuer"];
                    x.RequireHttpsMetadata = false;
                });
            services.AddOcelot();
            // ......
        }

调用 API 接口更新配置

可以使用 Postman 或者 fiddler 等调用 API 来测试

返回 200 即配置更新成功

Memo

Enjoy it~

原文地址:https://www.cnblogs.com/lonelyxmas/p/10850722.html

时间: 2024-11-06 11:23:09

写个重新加载 ocelot 配置的接口的相关文章

atitit.动态加载数据库配置in orm hibernate mybatis

atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象,,,,生成工厂类,在opoenSession 1 2.1. Hibernate动态添加配置流程 1 2.2. mybatis动态添加配置流程 1 2.3. #===hb code 2 3. 参考 3 1. 动态加载数据库配置的优点::: 1.1. 组合多个配置文件... 1.2. 连接多个数据库 2

[Android学习系列2]用webview写界面,加载本地js,js,html文件

以jquery mobile为例 1.在android界面拖入一个webview,然后添加一个internet权限 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.INTERNET"/> <application ........

纯javascript写的table加载,包含分页、数据下载功能

直接先上效果图看看先. 首先简单说明一下,后面会给所涉及到的代码都贴上来的. 1.excel图标是一个用户控件,用来触发下载 2.首页.上页......每页多少条,这一块是一个整体,你可以选择放置在表格下面,或者表格上面都可以 3.表格则也是单独的一个,自己任意设置位置 4.复选框是否显示,自己设置,并可设置绑定的值,并有自带的方法可供你用于获取选中的复选框的对象跟值 5.表格的单行.双行.点击.悬浮.标题栏.表格的样式,都可以通过设置参数来修改,图为自带的效果 6.分页默认每页10行,分页的检

spring: 加载远程配置

通常在spring应用中,配置中的properties文件,都是打包在war包里的,部署规模较小,只有几台服务器时,这样并没有什么大问题.如果服务器多了,特别是集群部署时,如果要修改某一项配置,得重新打包.部署,一台台机器改过去,十分麻烦. 看了Spring-Cloud项目,深受启发,Spring-Cloud把配置文件放在远程的git或svn这类云平台之上,所有应用启动时从云上获取配置,配置需要修改时,直接修改git上的配置即可,十分方便,但是这个项目并不简单,新概念太多,需要一定时间熟悉. 借

基于.net 的加载自定义配置-误操作

有时候 需要 将程序加载自定义的配置文件,除了自己写解析xml文件.内置的ConfigutionManager对象 是个不错的选项. 按照 app.config 的方式,做一个副本.然后从你的配置文件中,加载指定的配置 键值对! //方法1-可以读取任意位置的xml文件 ExeConfigurationFileMap filemap = new ExeConfigurationFileMap(); filemap.ExeConfigFilename = QuartzConfigPath; //f

Spring BeanPostProcessor与动态加载数据源配置

前言: 本文旨在介绍Spring动态配置数据源的方式,即对一个DataSource的配置诸如jdbcUrl,user,password,driverClass都通过运行时指定,而非由xml静态配置. Spring构造Context的参数一般只包含配置文件路径和类加载器,如果需要达到动态传入配置参数的目的,需要Spring在初始化数据源相关bean的时候能够对原有配置执行修改或替换,为方便处理,本文将定义一个名为DynamicDataSourceConfigHolder的公共类提供配置数据存储.

网站后端_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置?

简单介绍: 说明: 复杂的项目需要配置各种环境,若设置少可直接硬编码,设置多的话可通过加载配置/加载文件/加载变量的方式来设置 app.config.update(     DEBUG=True, ) 扩展: app.config是flask.config.Config类的实例,继承子PY内置数据结构dict,所以可以使用如上update方法,支持传入多个键值对,其实app.config内置很多配置变量(http://flask.pocoo.org/docs/0.11/config/#Built

【Selenium】Option加载用户配置,Chrom命令行参数

about:version - 显示当前版本 about:memory - 显示本机浏览器内存使用状况 about:plugins - 显示已安装插件 about:histograms - 显示历史记录 about:dns - 显示DNS状态 about:cache - 显示缓存页面 about:gpu -是否有硬件加速 about:flags -开启一些插件 //使用后弹出这么些东西:"请小心,这些实验可能有风险",不知会不会搞乱俺的配置啊! chrome://extensions/

ubuntu开机自动加载iptables配置(转)

原文:http://www.xuebuyuan.com/730127.html iptables的使用参见http://wiki.ubuntu.org.cn/IptablesHowTo iptables配置完成后,规则是自动立即生效的,但是机器重启动后,规则会丢失 ubuntu下可以通过以下步骤保存iptables设置,并实现开机自动加载 1.iptables配置完成后手动保存 执行iptables-save > /etc/iptables.up.rules ,将当前配置保存再iptables.