apolloconfig/apollo.net

openapi release namespace issue

Closed this issue · 10 comments

开发者你好。
我在使用openapi进行配置发布时,遇到了两个问题。

  1. 使用OpenApi初次调用【配置发布】接口时,管理后台显示tag:有修改,发布历史:存在新纪录,但是内容空白。当第二次调用时,一切正常。
  2. 配置了 webhook,但当使用openapi的【配置发布】接口时,没有成功触发webhook通知。

参考文档:3.2.13配置发布

我的平台:.NET 4.6
使用的SDK版本:Com.Ctrip.Framework.Apollo.OpenApi v2.10.0.0

以下是第一次调用与第二次管理端变化的截图

  1. 第一次
    image

  2. 第二次
    image

期待回复!

第一次调用和第二次调用参数及返回值一样么?

我的流程

  1. 修改 hhcx.open.json 公共配置文件的参数

原始参数

{
    "key1":"val1",
    "key2":"val2",
    "key3":"val3"
}
  1. 第一次修改并发布配置(均使用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内容并非我修改的配置,我不清楚为什么。

  1. 第二次修改并发布配置(均使用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 入参项。

在反复的实验,可以确定的是:在极短的时间内调用 配置变动 方法和 发布命名空间流程,后者发布的最新配置内容并非是本次配置变动的内容(可以通过增加休眠或者分步操作来解决)。

最后
希望我的经验能带来帮助 :)