• 微服务网关从零搭建——(七)更改存储方式为oracle


    资源准备:

    下载开源项目

    新建oracle表:

    -- ----------------------------
    -- Table structure for OcelotGlobalConfiguration
    -- ----------------------------
    
    CREATE TABLE OcelotGlobalConfiguration (
      Id NUMBER(11) NOT NULL ,
      GatewayName NVARCHAR2(200) NOT NULL ,
      RequestIdKey NVARCHAR2(100) ,
      BaseUrl NVARCHAR2(100) ,
      DownstreamScheme NVARCHAR2(50) ,
      ServiceDiscoveryProvider NVARCHAR2(300) ,
      QoSOptions NVARCHAR2(300) ,
      LoadBalancerOptions NVARCHAR2(300) ,
      HttpHandlerOptions NVARCHAR2(300) ,
      LastUpdateTime DATE ,
      AddTime DATE NOT NULL ,
      IsDefault NUMBER(4) NOT NULL 
    )
    ;
    COMMENT ON COLUMN OcelotGlobalConfiguration.Id IS '主键';
    COMMENT ON COLUMN OcelotGlobalConfiguration.GatewayName IS '网关名称';
    COMMENT ON COLUMN OcelotGlobalConfiguration.AddTime IS '添加时间';
    COMMENT ON COLUMN OcelotGlobalConfiguration.IsDefault IS '是否默认';
    
    -- ----------------------------
    -- Records of OcelotGlobalConfiguration
    -- ----------------------------
    INSERT INTO OcelotGlobalConfiguration VALUES ('1', '第一个网关', 'FirstGateway', '', '', '', '', '', '', TO_DATE('1900-01-01 00:00:00.000', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-10-22 18:06:22.337', 'SYYYY-MM-DD HH24:MI:SS'), '1');
    COMMIT;
    
    -- ----------------------------
    -- Table structure for OcelotReRoutes
    -- ----------------------------
    
    CREATE TABLE OcelotReRoutes (
      Id NUMBER(11) NOT NULL ,
      OcelotGlobalConfigurationId NUMBER(11) NOT NULL ,
      UpstreamPathTemplate NVARCHAR2(150) NOT NULL ,
      UpstreamHttpMethod NVARCHAR2(50) NOT NULL ,
      UpstreamHost NVARCHAR2(100) NOT NULL ,
      DownstreamScheme NVARCHAR2(50) ,
      DownstreamPathTemplate NVARCHAR2(200) ,
      DownstreamHostAndPorts NVARCHAR2(500) ,
      AuthenticationOptions NVARCHAR2(300) ,
      RequestIdKey NVARCHAR2(100) ,
      CacheOptions NVARCHAR2(200) ,
      ServiceName NVARCHAR2(100) ,
      QoSOptions NVARCHAR2(200) ,
      LoadBalancerOptions NVARCHAR2(200) ,
      Key NVARCHAR2(100) ,
      DelegatingHandlers NVARCHAR2(200) ,
      Priority NUMBER(11) ,
      Timeout NUMBER(11) ,
      IsStatus NUMBER(11) NOT NULL ,
      AddTime DATE NOT NULL 
    )
    ;
    COMMENT ON COLUMN OcelotReRoutes.Id IS '主键';
    COMMENT ON COLUMN OcelotReRoutes.OcelotGlobalConfigurationId IS '全局配置ID';
    COMMENT ON COLUMN OcelotReRoutes.AddTime IS '添加时间';
    
    -- ----------------------------
    -- Records of OcelotReRoutes
    -- ----------------------------
    INSERT INTO OcelotReRoutes VALUES ('1', '1', '/connect/token', '[ "POST","GET" ]', ' ', 'http', '/connect/token', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('2', '1', '/connect/authorize', '[ "POST","GET" ]', ' ', 'http', '/connect/authorize', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('3', '1', '/.well-known/openid-configuration', '[ "POST","GET" ]',  ' ', 'http', '/.well-known/openid-configuration', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('4', '1', '/.well-known/openid-configuration/jwks', '[ "POST","GET" ]', ' ', 'http', '/.well-known/openid-configuration', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('5', '1', '/connect/userinfo', '[ "POST","GET" ]', ' ', 'http', '/connect/userinfo', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('6', '1', '/connect/endsession', '[ "POST","GET" ]', ' ', 'http', '/connect/endsession', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('7', '1', '/connect/checksession', '[ "POST","GET" ]', ' ', 'http', '/connect/checksession', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('8', '1', '/connect/revocation', '[ "POST","GET" ]', ' ', 'http', '/connect/revocation', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('9', '1', '/connect/introspect', '[ "POST","GET" ]', ' ', 'http', '/connect/introspect', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('10', '1', '/connect/authorize/callback', '[ "POST","GET" ]', ' ', 'http', '/connect/authorize/callback', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('11', '1', '/connect/endsession/callback', '[ "POST","GET" ]', ' ', 'http', '/connect/endsession/callback', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    INSERT INTO OcelotReRoutes VALUES ('12', '1', '/ss1/{everything}', '[ "POST","GET" ]', ' ', 'http', '/api/{everything}', ' [{"Host": "localhost","Port": "5003" },{"Host": "localhost","Port": "1002" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
    COMMIT;
    
    -- ----------------------------
    -- Primary Key structure for table OcelotGlobalConfiguration
    -- ----------------------------
    ALTER TABLE OcelotGlobalConfiguration ADD CONSTRAINT PK_OcelotGlobalConfiguration PRIMARY KEY (Id);
    
    -- ----------------------------
    -- Primary Key structure for table OcelotReRoutes
    -- ----------------------------
    ALTER TABLE OcelotReRoutes ADD CONSTRAINT PK_OcelotReRoutes PRIMARY KEY (Id);
    建表语句

     注: 修改UPSTREAMHOST 字段为可为空

    开始集成:

    1.在网关项目中添加对Ocelot.ConfigAuthLimitCache的引用

    2.在网关项目的Startup.cs 中修改ConfigureServices节点  标红部分

      services.AddOcelot(Configuration).AddAuthLimitCache(opt=> {
                    opt.DbConnectionStrings = Configuration.GetSection("Setting")["ConfigDBConnction"];
                }).AddConsul();

    3.在配置文件中添加数据库连接 蓝色部分

     "Setting": {
        "Port": "5001",
        "ConfigDBConnction": "Data Source=192.168.xxx.xxx/orcl;User ID=xxx;Password=xxx;"
      },

    4.在Program.cs中移除对原配置文件的依赖  注释部分

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseUrls($"http://*:{StartPort}");
                    //.ConfigureAppConfiguration((hostingContext, builder) =>
                    //{
                    //    builder.AddJsonFile("configuration.json", false, true);
                    //});

     5.修改Ocelot.ConfigAuthLimitCache项目的数据仓储实现

    增加文件

    代码:

    using Dapper;
    using Ocelot.Cache;
    using Ocelot.ConfigAuthLimitCache.Configuration;
    using Ocelot.ConfigAuthLimitCache.Extensions;
    using Ocelot.ConfigAuthLimitCache.Models;
    using Ocelot.Configuration.File;
    using Ocelot.Configuration.Repository;
    using Ocelot.Logging;
    using Ocelot.Responses;
    using Oracle.ManagedDataAccess.Client;
    using System;
    using System.Collections.Generic;
    using System.Threading.Tasks;
    
    namespace Ocelot.ConfigAuthLimitCache.Repository
    {
        /// <summary>
        /// nontracey
        /// 2019.04-08
        /// 实现从oracle数据库中提取配置信息
        /// </summary>
        public class OracleFileConfigurationRepository : IFileConfigurationRepository
        {
            private readonly IOcelotCache<FileConfiguration> _cache;
            private readonly IOcelotLogger _logger;
            private readonly ConfigAuthLimitCacheOptions _option;
            public OracleFileConfigurationRepository(ConfigAuthLimitCacheOptions option, IOcelotCache<FileConfiguration> cache, IOcelotLoggerFactory loggerFactory)
            {
                _option = option;
                _cache = cache;
                _logger = loggerFactory.CreateLogger<OracleFileConfigurationRepository>();
            }
    
            public Task<Response> Set(FileConfiguration fileConfiguration)
            {
                _cache.AddAndDelete(_option.CachePrefix + "FileConfiguration", fileConfiguration, TimeSpan.FromSeconds(1800), "");
                return Task.FromResult((Response)new OkResponse());
            }
    
            /// <summary>
            /// 提取配置信息
            /// </summary>
            /// <returns></returns>
            public async Task<Response<FileConfiguration>> Get()
            {
                var config = _cache.Get(_option.CachePrefix + "FileConfiguration", "");
    
                if (config != null)
                {
                    return new OkResponse<FileConfiguration>(config);
                }
                #region 提取配置信息
                var file = new FileConfiguration();
                string glbsql = "select  * from OcelotGlobalConfiguration where IsDefault=1 and rownum=1";
                //提取全局配置信息
                using (var connection = new OracleConnection(_option.DbConnectionStrings))
                {
                    var result = await connection.QueryFirstOrDefaultAsync<OcelotGlobalConfiguration>(glbsql);
                    if (result != null)
                    {
                        var glb = new FileGlobalConfiguration();
                        glb.BaseUrl = result.BaseUrl;
                        glb.DownstreamScheme = result.DownstreamScheme;
                        glb.RequestIdKey = result.RequestIdKey;
                        if (!String.IsNullOrEmpty(result.HttpHandlerOptions))
                        {
                            glb.HttpHandlerOptions = result.HttpHandlerOptions.ToObject<FileHttpHandlerOptions>();
                        }
                        if (!String.IsNullOrEmpty(result.LoadBalancerOptions))
                        {
                            glb.LoadBalancerOptions = result.LoadBalancerOptions.ToObject<FileLoadBalancerOptions>();
                        }
                        if (!String.IsNullOrEmpty(result.QoSOptions))
                        {
                            glb.QoSOptions = result.QoSOptions.ToObject<FileQoSOptions>();
                        }
                        if (!String.IsNullOrEmpty(result.ServiceDiscoveryProvider))
                        {
                            glb.ServiceDiscoveryProvider = result.ServiceDiscoveryProvider.ToObject<FileServiceDiscoveryProvider>();
                        }
                        file.GlobalConfiguration = glb;
    
                        //提取路由信息
    
                        string routesql = "select * from OcelotReRoutes where OcelotGlobalConfigurationId=:OcelotGlobalConfigurationId and IsStatus=1";
                        var routeresult = (await connection.QueryAsync<OcelotReRoutes>(routesql, new { OcelotGlobalConfigurationId=result.Id })).AsList();
                        if (routeresult != null && routeresult.Count > 0)
                        {
                            var reroutelist = new List<FileReRoute>();
                            foreach (var model in routeresult)
                            {
                                var m = new FileReRoute();
                                if (!String.IsNullOrEmpty(model.AuthenticationOptions))
                                {
                                    m.AuthenticationOptions = model.AuthenticationOptions.ToObject<FileAuthenticationOptions>();
                                }
                                if (!String.IsNullOrEmpty(model.CacheOptions))
                                {
                                    m.FileCacheOptions = model.CacheOptions.ToObject<FileCacheOptions>();
                                }
                                if (!String.IsNullOrEmpty(model.DelegatingHandlers))
                                {
                                    m.DelegatingHandlers = model.DelegatingHandlers.ToObject<List<string>>();
                                }
                                if (!String.IsNullOrEmpty(model.LoadBalancerOptions))
                                {
                                    m.LoadBalancerOptions = model.LoadBalancerOptions.ToObject<FileLoadBalancerOptions>();
                                }
                                if (!String.IsNullOrEmpty(model.QoSOptions))
                                {
                                    m.QoSOptions = model.QoSOptions.ToObject<FileQoSOptions>();
                                }
                                if (!String.IsNullOrEmpty(model.DownstreamHostAndPorts))
                                {
                                    m.DownstreamHostAndPorts = model.DownstreamHostAndPorts.ToObject<List<FileHostAndPort>>();
                                }
                                //开始赋值
                                m.DownstreamPathTemplate = model.DownstreamPathTemplate;
                                m.DownstreamScheme = model.DownstreamScheme;
                                m.Key = model.Key;
                                m.Priority = model.Priority ?? 0;
                                m.RequestIdKey = model.RequestIdKey;
                                m.ServiceName = model.ServiceName;
                                m.Timeout = model.Timeout ?? 0;
                                m.UpstreamHost = model.UpstreamHost;
                                if (!String.IsNullOrEmpty(model.UpstreamHttpMethod))
                                {
                                    m.UpstreamHttpMethod = model.UpstreamHttpMethod.ToObject<List<string>>();
                                }
                                m.UpstreamPathTemplate = model.UpstreamPathTemplate;
                                reroutelist.Add(m);
                            }
                            file.ReRoutes = reroutelist;
                        }
                    }
                    else
                    {
                        throw new Exception("未监测到配置信息");
                    }
                }
                #endregion
                if (file.ReRoutes == null || file.ReRoutes.Count == 0)
                {
                    return new OkResponse<FileConfiguration>(null);
                }
                return new OkResponse<FileConfiguration>(file);
            }
        }
    }
    增加oracle仓储

    注:需要添加之前的CommonHelper引用或者 单独添加Oracle.ManagedDataAccess.Core nuget包引用

    至此搭建完毕 将配置文件部分的内容移动到数据库即可。

    参考链接:

    更改到sqlserver

     https://www.cnblogs.com/yilezhu/p/9839863.html

  • 相关阅读:
    HDU5470 Typewriter SAM 动态规划 单调队列
    BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树
    Codeforces 235C Cyclical Quest 字符串 SAM KMP
    HDU4622 Reincarnation 字符串 SAM
    Codeforces 452E Three strings 字符串 SAM
    BZOJ3926 [Zjoi2015]诸神眷顾的幻想乡 字符串 SAM
    2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
    2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
    2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
    UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
  • 原文地址:https://www.cnblogs.com/nontracey/p/10670162.html
Copyright © 2020-2023  润新知