openapi release namespace issue
Closed this issue · 10 comments
开发者你好。
我在使用openapi进行配置发布时,遇到了两个问题。
- 使用OpenApi初次调用【配置发布】接口时,管理后台显示tag:有修改,发布历史:存在新纪录,但是内容空白。当第二次调用时,一切正常。
- 配置了 webhook,但当使用openapi的【配置发布】接口时,没有成功触发webhook通知。
参考文档:3.2.13配置发布
我的平台:.NET 4.6
使用的SDK版本:Com.Ctrip.Framework.Apollo.OpenApi v2.10.0.0
以下是第一次调用与第二次管理端变化的截图
期待回复!
第一次调用和第二次调用参数及返回值一样么?
我的流程
- 修改 hhcx.open.json 公共配置文件的参数
原始参数
{
"key1":"val1",
"key2":"val2",
"key3":"val3"
}
- 第一次修改并发布配置(均使用openapi)
修改接口入参
{
"DataChangeLastModifiedBy": "hhcx",
"Value": "{\"key1\":\"val1\",\"key2\":\"val2\",\"key3\":\"val3-edit\"}",
"Comment": "旧项目-Settings配置项",
"DataChangeCreatedBy": "hhcx",
"Key": "content",
"Name": "hhcx.open.json",
"Env": "DEV",
"AppId": "hhcx-pub",
"ClusterName": "default"
}
发布配置入参
{
"ReleaseTitle": "生产项目配置变动",
"ReleaseComment": "来源:生产项目",
"ReleasedBy": "hhcx",
"Name": "hhcx.open.json",
"Env": "DEV",
"AppId": "hhcx-pub",
"ClusterName": "default"
}
result
{
"Id": 160,
"AppId": "hhcx-pub",
"ClusterName": "default",
"NamespaceName": "hhcx.open.json",
"Name": "生产项目配置变动",
"Configurations": {
"content": "{\n \"key1\":\"val1\",\n \"key2\":\"val2\",\n \"key3\":\"val3\"\n}"
},
"Comment": "来源:生产项目",
"DataChangeCreatedBy": "hhcx",
"DataChangeLastModifiedBy": "hhcx",
"DataChangeCreatedTime": "2023-07-04T18:48:11.028+08:00",
"DataChangeLastModifiedTime": "2023-07-04T18:48:11.028+08:00"
}
注意:这里发布配置后返回的content内容并非我修改的配置,我不清楚为什么。
- 第二次修改并发布配置(均使用openapi)
修改接口入参
{
"DataChangeLastModifiedBy": "hhcx",
"Value": "{\"key1\":\"val1\",\"key2\":\"val2\",\"key3\":\"val3\",\"key4\":\"val4-add\"}",
"Comment": "旧项目-Settings配置项",
"DataChangeCreatedBy": "hhcx",
"Key": "content",
"Name": "hhcx.open.json",
"Env": "DEV",
"AppId": "hhcx-pub",
"ClusterName": "default"
}
发布配置入参
{
"ReleaseTitle": "生产项目配置变动",
"ReleaseComment": "来源:生产项目",
"ReleasedBy": "hhcx",
"Name": "hhcx.open.json",
"Env": "DEV",
"AppId": "hhcx-pub",
"ClusterName": "default"
}
result
{
"Id": 161,
"AppId": "hhcx-pub",
"ClusterName": "default",
"NamespaceName": "hhcx.open.json",
"Name": "生产项目配置变动",
"Configurations": {
"content": "{\"key1\":\"val1\",\"key2\":\"val2\",\"key3\":\"val3\",\"key4\":\"val4-add\"}"
},
"Comment": "来源:生产项目",
"DataChangeCreatedBy": "hhcx",
"DataChangeLastModifiedBy": "hhcx",
"DataChangeCreatedTime": "2023-07-04T18:49:25.905+08:00",
"DataChangeLastModifiedTime": "2023-07-04T18:49:25.905+08:00"
}
整个流程下来,这次在第一次发布配置后,后端的【有修改tag】没有展示,不过依然存在【空白的发布日志】。
第二次与正常预期符合。
提醒:为什么没有触发webhook通知,是openapi的方式不支持吗?
第一个问题用到的C# api好像不是Com.Ctrip.Framework.Apollo.OpenApi提供的api。createIfNotExists是否设置为true?
第二个问题我问一下服务端开发者
谢谢。
展示的入参对象是基于sdk提供的方法进行的二次封装的方法入参。
我的源代码
// 👇 封装
/// <summary>
/// 更新 namespaces item配置项
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static void NamespacesItemUpdatestatic(NamespacesItemUpdateInput input)
{
try
{
new OpenApiFactory(new OpenApiOptions()
{
PortalUrl = portalUrl,
Token = token,
Timeout = timeOut,
})
.CreateNamespaceClient(appId: input.AppId
, env: input.Env
, cluster: input.ClusterName
, @namespace: input.Name)
.UpdateItem(item: new Item()
{
Key = input.Key,
Value = input.Value,
Comment = input.Comment,
DataChangeLastModifiedBy = input.DataChangeLastModifiedBy
});
}
catch (Exception ex)
{
Logger.Warn("apollo", ex.Message);
}
}
// 👇 使用
ApolloOpenApi.NamespacesItemUpdatestatic(input: new NamespacesItemUpdateInput()
{
AppId = "hhcx-pub",
ClusterName = "default",
Name = namespaceName,
Comment = "旧项目-Settings配置项",
DataChangeCreatedBy = "hhcx",
DataChangeLastModifiedBy = "hhcx",
Env = "DEV",
Key = "content",
Value = content
});
对于第一个问题,我的猜测:修改配置的事件在服务端还没有执行完成,便调用了发布事件。即 A - B - C 变成了 A - B/C - B(完成)。我将添加线程休眠来验证下这个猜测。
对于第二个问题,若服务端对OpenApi的配置发布没有进行webhook通知,我将只能进行监听来完成通知动作吗?
Update接口只能修改,CreateOrUpdateItem接口才是创建或者修改。
apollo包已经支持更新客户端通知的功能啊,不需要单独的webhook。
这个issue是基于“修改配置”引发的问题而提出的,按照预期情况使用 Update 应该是可以满足业务流程的。
不过还是感谢你的提醒,我会用 CreateOrUpdateItem 验证下流程是否满足业务。
另外我没有看到“更新客户端”的功能文档,方便贴出吗?
好的,我先关闭了这个问题,再次感谢。
hi!
现在根据客户端设计,我已经完成了我的需求。感谢 Apollo .net 开发者支持。
我的客户端平台:.NET7
使用了 选项模式 IOptionsMonitor 来刷新配置选项,这很好用!
一个小建议
1、add/update/remove/addorupdate 配置更新增加 isRelease 入参项。
在反复的实验,可以确定的是:在极短的时间内调用 配置变动 方法和 发布命名空间流程,后者发布的最新配置内容并非是本次配置变动的内容(可以通过增加休眠或者分步操作来解决)。
最后
希望我的经验能带来帮助 :)