下載開源項目html
新建oracle表:git
-- ---------------------------- -- 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 字段爲可爲空github
1.在網關項目中添加對Ocelot.ConfigAuthLimitCache的引用sql
2.在網關項目的Startup.cs 中修改ConfigureServices節點 標紅部分數據庫
services.AddOcelot(Configuration).AddAuthLimitCache(opt=> { opt.DbConnectionStrings = Configuration.GetSection("Setting")["ConfigDBConnction"]; }).AddConsul();
3.在配置文件中添加數據庫鏈接 藍色部分json
"Setting": { "Port": "5001", "ConfigDBConnction": "Data Source=192.168.xxx.xxx/orcl;User ID=xxx;Password=xxx;" },
4.在Program.cs中移除對原配置文件的依賴 註釋部分api
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項目的數據倉儲實現session
增長文件oracle
代碼:app
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); } } }
注:須要添加以前的CommonHelper引用或者 單獨添加Oracle.ManagedDataAccess.Core nuget包引用
至此搭建完畢 將配置文件部分的內容移動到數據庫便可。
更改到sqlserver