Skip to content

Commit 5e7e1a6

Browse files
authored
Merge pull request #222 from dotnetcore/master
Use publish timeline virtual id to compare the version between client
2 parents a52f028 + ec9a3ee commit 5e7e1a6

File tree

12 files changed

+189
-54
lines changed

12 files changed

+189
-54
lines changed

src/AgileConfig.Server.Apisite/AgileConfig.Server.Apisite.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<PropertyGroup>
44
<TargetFramework>net8.0</TargetFramework>
55
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
6-
<AssemblyVersion>1.9.15</AssemblyVersion>
7-
<Version>1.9.15</Version>
8-
<PackageVersion>1.9.15</PackageVersion>
6+
<AssemblyVersion>1.10.0</AssemblyVersion>
7+
<Version>1.10.0</Version>
8+
<PackageVersion>1.10.0</PackageVersion>
99
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
10-
<FileVersion>1.9.15</FileVersion>
10+
<FileVersion>1.10.0</FileVersion>
1111
<Authors>kklldog</Authors>
1212
<Company>kklldog</Company>
1313
</PropertyGroup>

src/AgileConfig.Server.Apisite/Controllers/api/ConfigController.cs

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using AgileConfig.Server.Apisite.Models.Mapping;
1010
using AgileConfig.Server.Data.Entity;
1111
using AgileConfig.Server.IService;
12+
using Microsoft.AspNetCore.Http;
1213
using Microsoft.AspNetCore.Mvc;
1314
using Microsoft.Extensions.Caching.Memory;
1415

@@ -60,24 +61,32 @@ public async Task<ActionResult<List<ApiConfigVM>>> GetAppConfig(string appId, [F
6061
}
6162

6263
var cacheKey = $"ConfigController_AppConfig_{appId}_{env.Value}";
63-
List<ApiConfigVM> configs = null;
64-
_cacheMemory?.TryGetValue(cacheKey, out configs);
65-
if (configs != null)
64+
AppConfigsCache cache = null;
65+
_cacheMemory?.TryGetValue(cacheKey, out cache);
66+
67+
if (cache == null)
6668
{
67-
return configs;
68-
}
69+
cache = new AppConfigsCache();
6970

70-
var appConfigs = await _configService.GetPublishedConfigsByAppIdWithInheritanced(appId, env.Value);
71-
var vms = appConfigs.Select(x => x.ToApiConfigVM()).ToList();
71+
var publishTimelineId = await _configService.GetLastPublishTimelineVirtualIdAsync(appId, env.Value);
72+
var appConfigs = await _configService.GetPublishedConfigsByAppIdWithInheritance(appId, env.Value);
73+
var vms = appConfigs.Select(x => x.ToApiConfigVM()).ToList();
7274

73-
//增加5s的缓存,防止同一个app同时启动造成db的压力过大
74-
var cacheOp = new MemoryCacheEntryOptions()
75-
.SetAbsoluteExpiration(TimeSpan.FromSeconds(5));
76-
_cacheMemory?.Set(cacheKey, vms, cacheOp);
75+
cache.Key = cacheKey;
76+
cache.Configs = vms;
77+
cache.VirtualId = publishTimelineId;
78+
79+
//cache 5 seconds to avoid too many db query
80+
var cacheOp = new MemoryCacheEntryOptions()
81+
.SetAbsoluteExpiration(TimeSpan.FromSeconds(5));
82+
_cacheMemory?.Set(cacheKey, cache, cacheOp);
83+
}
84+
85+
Response?.Headers?.Append("publish-time-line-id", cache.VirtualId);
7786

7887
_meterService.PullAppConfigCounter?.Add(1, new("appId", appId), new("env", env));
7988

80-
return vms;
89+
return cache.Configs;
8190
}
8291

8392
/// <summary>

src/AgileConfig.Server.Apisite/Controllers/api/Models/ApiConfigVM.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
1-
using AgileConfig.Server.Apisite.Models;
1+
using System.Collections.Generic;
2+
using AgileConfig.Server.Apisite.Models;
23
using AgileConfig.Server.Data.Entity;
3-
using System;
4-
using System.Collections.Generic;
5-
using System.Linq;
6-
using System.Threading.Tasks;
74

85
namespace AgileConfig.Server.Apisite.Controllers.api.Models
96
{
@@ -53,6 +50,16 @@ public class ApiConfigVM : IAppIdModel
5350
public string Description { get; set; }
5451
}
5552

53+
54+
public class AppConfigsCache
55+
{
56+
public string Key { get; set; }
57+
58+
public string VirtualId { get; set; }
59+
60+
public List<ApiConfigVM> Configs { get; set; }
61+
}
62+
5663
public static class ApiConfigVMExtension
5764
{
5865
public static ConfigVM ToConfigVM(this ApiConfigVM model)

src/AgileConfig.Server.Apisite/Websocket/MessageHandlers/MessageHandler.cs

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ internal class MessageHandler : IMessageHandler
1919
private readonly IConfigService _configService;
2020
private readonly IRegisterCenterService _registerCenterService;
2121
private readonly IServiceInfoService _serviceInfoService;
22-
22+
23+
private int ClientVersion { get; set; }
24+
2325
public MessageHandler(
24-
IConfigService configService,
25-
IRegisterCenterService registerCenterService,
26+
IConfigService configService,
27+
IRegisterCenterService registerCenterService,
2628
IServiceInfoService serviceInfoService)
2729
{
2830
_configService = configService;
2931
_registerCenterService = registerCenterService;
3032
_serviceInfoService = serviceInfoService;
3133
}
32-
34+
3335
public bool Hit(HttpRequest request)
3436
{
3537
var ver = request.Headers["client-v"];
@@ -40,6 +42,8 @@ public bool Hit(HttpRequest request)
4042

4143
if (int.TryParse(ver.ToString().Replace(".", ""), out var verInt))
4244
{
45+
ClientVersion = verInt;
46+
4347
return verInt >= 160;
4448
}
4549

@@ -63,12 +67,14 @@ public async Task Handle(string message, HttpRequest request, WebsocketClient cl
6367
appId = HttpUtility.UrlDecode(appId);
6468
var env = request.Headers["env"].ToString();
6569
ISettingService.IfEnvEmptySetDefault(ref env);
66-
var md5 = await _configService.AppPublishedConfigsMd5CacheWithInheritanced(appId, env);
70+
71+
var data = await GetCPingData(appId, env);
72+
6773
await SendMessage(client.Client, JsonConvert.SerializeObject(new WebsocketAction()
6874
{
6975
Action = ActionConst.Ping,
7076
Module = ActionModule.ConfigCenter,
71-
Data = md5
77+
Data = data
7278
}));
7379
}
7480
else if (message.StartsWith("s:ping:"))
@@ -98,4 +104,22 @@ await SendMessage(client.Client, JsonConvert.SerializeObject(new WebsocketAction
98104
await SendMessage(client.Client, "0");
99105
}
100106
}
107+
108+
private async Task<string> GetCPingData(string appId, string env)
109+
{
110+
if (ClientVersion <= 176)
111+
{
112+
// 1.7.6及以前的版本,返回V:md5
113+
var md5 = await _configService.AppPublishedConfigsMd5CacheWithInheritance(appId, env);
114+
115+
return md5;
116+
}
117+
else
118+
{
119+
// 1.7.7及以后的版本,返回 publish time line id
120+
var publishTimeLineId = await _configService.GetLastPublishTimelineVirtualIdAsyncWithCache(appId, env);
121+
122+
return publishTimeLineId;
123+
}
124+
}
101125
}

src/AgileConfig.Server.Apisite/Websocket/MessageHandlers/OldMessageHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public async Task Handle(string message, HttpRequest request, WebsocketClient cl
4646
var appId = request.Headers["appid"];
4747
var env = request.Headers["env"].ToString();
4848
env = ISettingService.IfEnvEmptySetDefault(ref env);
49-
var md5 = await _configService.AppPublishedConfigsMd5CacheWithInheritanced(appId, env);
49+
var md5 = await _configService.AppPublishedConfigsMd5CacheWithInheritance(appId, env);
5050
await SendMessage(client.Client, $"V:{md5}");
5151
}
5252
else

src/AgileConfig.Server.Data.Abstraction/IPublishTimelineRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ namespace AgileConfig.Server.Data.Abstraction
44
{
55
public interface IPublishTimelineRepository : IRepository<PublishTimeline, string>
66
{
7+
Task<string> GetLastPublishTimelineNodeIdAsync(string appId, string env);
78
}
89
}

src/AgileConfig.Server.Data.Repository.Freesql/PublishTimelineRepository.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,15 @@ public PublishTimelineRepository(IFreeSql freeSql) : base(freeSql)
1212
{
1313
this.freeSql = freeSql;
1414
}
15+
16+
public async Task<string> GetLastPublishTimelineNodeIdAsync(string appId, string env)
17+
{
18+
var node = await freeSql.Select<PublishTimeline>()
19+
.Where(x => x.AppId == appId && x.Env == env)
20+
.OrderByDescending(x => x.Version)
21+
.FirstAsync();
22+
23+
return node?.Id;
24+
}
1525
}
1626
}
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
namespace AgileConfig.Server.Data.Repository.Mongodb;
1+

2+
namespace AgileConfig.Server.Data.Repository.Mongodb;
23

3-
public class PublishTimelineRepository: MongodbRepository<PublishTimeline, string>, IPublishTimelineRepository
4+
public class PublishTimelineRepository : MongodbRepository<PublishTimeline, string>, IPublishTimelineRepository
45
{
56
public PublishTimelineRepository(string? connectionString) : base(connectionString)
67
{
@@ -10,4 +11,11 @@ public PublishTimelineRepository(string? connectionString) : base(connectionStri
1011
public PublishTimelineRepository(IConfiguration configuration) : base(configuration)
1112
{
1213
}
14+
15+
public async Task<string> GetLastPublishTimelineNodeIdAsync(string appId, string env)
16+
{
17+
var nodes = await this.QueryPageAsync(x => x.AppId == appId && x.Env == env, 1, 1, nameof(PublishTimeline.Version), "DESC");
18+
19+
return nodes?.FirstOrDefault()?.Id;
20+
}
1321
}

src/AgileConfig.Server.IService/IConfigService.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ public interface IConfigService: IDisposable
3636
/// </summary>
3737
/// <param name="appId"></param>
3838
/// <returns></returns>
39-
Task<List<Config>> GetPublishedConfigsByAppIdWithInheritanced(string appId, string env);
39+
Task<List<Config>> GetPublishedConfigsByAppIdWithInheritance(string appId, string env);
4040
/// <summary>
4141
/// 获取app的配置项继承的app配置合并进来转换为字典
4242
/// </summary>
4343
/// <param name="appId"></param>
4444
/// <returns></returns>
45-
Task<Dictionary<string, Config>> GetPublishedConfigsByAppIdWithInheritanced_Dictionary(string appId, string env);
45+
Task<Dictionary<string, Config>> GetPublishedConfigsByAppIdWithInheritance_Dictionary(string appId, string env);
4646
Task<bool> AddAsync(Config config, string env);
4747

4848
Task<bool> AddRangeAsync(List<Config> configs, string env);
@@ -77,7 +77,7 @@ public interface IConfigService: IDisposable
7777
/// </summary>
7878
/// <param name="appId"></param>
7979
/// <returns></returns>
80-
Task<string> AppPublishedConfigsMd5WithInheritanced(string appId, string env);
80+
Task<string> AppPublishedConfigsMd5WithInheritance(string appId, string env);
8181

8282
/// <summary>
8383
/// 计算已发布配置项的MD5进行缓存
@@ -91,7 +91,7 @@ public interface IConfigService: IDisposable
9191
/// </summary>
9292
/// <param name="appId"></param>
9393
/// <returns></returns>
94-
Task<string> AppPublishedConfigsMd5CacheWithInheritanced(string appId, string env);
94+
Task<string> AppPublishedConfigsMd5CacheWithInheritance(string appId, string env);
9595

9696
/// <summary>
9797
/// 构造key
@@ -213,5 +213,10 @@ public interface IConfigService: IDisposable
213213
/// clear all cache
214214
/// </summary>
215215
void ClearCache();
216+
217+
Task<string> GetLastPublishTimelineVirtualIdAsync(string appId, string env);
218+
219+
Task<string> GetLastPublishTimelineVirtualIdAsyncWithCache(string appId, string env);
220+
216221
}
217222
}

0 commit comments

Comments
 (0)