apolloconfig / apollo.net

Apollo .Net Client
Apache License 2.0
481 stars 167 forks source link

openapi release namespace issue #232

Closed Developer-echo closed 1 year ago

Developer-echo commented 1 year ago

开发者你好。 我在使用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

期待回复!

pengweiqhca commented 1 year ago

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

Developer-echo commented 1 year ago

我的流程

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

    原始参数

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

  3. 第二次修改并发布配置(均使用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的方式不支持吗?

pengweiqhca commented 1 year ago

第一个问题用到的C# api好像不是Com.Ctrip.Framework.Apollo.OpenApi提供的api。createIfNotExists是否设置为true?

第二个问题我问一下服务端开发者

Developer-echo commented 1 year ago

谢谢。

展示的入参对象是基于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通知,我将只能进行监听来完成通知动作吗?

pengweiqhca commented 1 year ago

Update接口只能修改,CreateOrUpdateItem接口才是创建或者修改。

pengweiqhca commented 1 year ago

apollo包已经支持更新客户端通知的功能啊,不需要单独的webhook。

Developer-echo commented 1 year ago

这个issue是基于“修改配置”引发的问题而提出的,按照预期情况使用 Update 应该是可以满足业务流程的。 不过还是感谢你的提醒,我会用 CreateOrUpdateItem 验证下流程是否满足业务。

另外我没有看到“更新客户端”的功能文档,方便贴出吗?

pengweiqhca commented 1 year ago

客户端设计

Developer-echo commented 1 year ago

好的,我先关闭了这个问题,再次感谢。

Developer-echo commented 1 year ago

hi!

现在根据客户端设计,我已经完成了我的需求。感谢 Apollo .net 开发者支持。 我的客户端平台:.NET7 使用了 选项模式 IOptionsMonitor)) 来刷新配置选项,这很好用!

一个小建议 1、add/update/remove/addorupdate 配置更新增加 isRelease 入参项。

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

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