Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

openapi release namespace issue #232

Closed
Developer-echo opened this issue Jul 4, 2023 · 10 comments
Closed

openapi release namespace issue #232

Developer-echo opened this issue Jul 4, 2023 · 10 comments

Comments

@Developer-echo
Copy link

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

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

@Developer-echo
Copy link
Author

我的流程

  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的方式不支持吗?

@pengweiqhca
Copy link
Contributor

pengweiqhca commented Jul 4, 2023

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

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

@Developer-echo
Copy link
Author

Developer-echo commented Jul 5, 2023

谢谢。

展示的入参对象是基于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
Copy link
Contributor

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

@pengweiqhca
Copy link
Contributor

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

@Developer-echo
Copy link
Author

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

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

@pengweiqhca
Copy link
Contributor

pengweiqhca commented Jul 5, 2023

客户端设计

@Developer-echo
Copy link
Author

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

@Developer-echo
Copy link
Author

Developer-echo commented Jul 6, 2023

hi!

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

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

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants