WSO2-AM:重新启动后存储中的 API 调用失败

标签 wso2 kubernetes wso2-am

我们已经设置了最新版本的

  • API 经理
  • 身份服务器
  • 数据分析服务器

  • 在 kubernetes 集群上的单独 pod 中(我们使用现有脚本作为创建 docker 镜像的基础),所有这些都共享托管在同一集群的另一个 pod 中的相关 MySQL 数据库。经过大量配置后一切都按预期工作,我们可以添加用户/角色,创建/发布/调用 API 并收集对这些调用的分析。然而,我们面临的最后一个问题是,一旦 API 发布,就可以在商店中调用它。一旦 API-manager pod 重新启动(例如,通过缩小/扩大相关部署,而不是通过使用 carbon 仪表板),问题就会出现,一旦 API-Manager 在此类(硬)重新启动后重新启动并运行,已发布的 API 在商店中仍然可见,但是,如果尝试调用(以前工作的)端点之一,则会返回 404 消息,并且 API 管理器会记录以下错误:

    INFO {org.apache.synapse.mediators.builtin.LogMediator} - STATUS = Message dispatched to the main sequence. Invalid URL, RESOURCE = /"context"/"endpoint being called"



    其中“上下文”是在发布给定 API 时为给定 API 设置的上下文,“端点被调用”是应该接收调用的服务的 REST 端点。此外,如果我们尝试更改发布者中的 API(即重新发布它),它似乎有 50/50 的机会可以工作并修复所有问题,直到下一次重新启动 pod 或出现错误第一步点击“下一步:实现”按钮时抛出,已记录here已经(尽管它说它已经在以前的版本中解决了)。

    其余设置如下:

    用户/角色
  • 用户:prod,用于在发布者
  • 中创建和发布API
  • 角色:prod-role(没有特权的空角色),内部/创建者,
    内部/发布者
  • 用户:cons,用于调用 store 中的 API
  • 角色:cons-role(空角色,没有特权,只是为了提供
    访问商店中的 API),内部/订阅者

  • 数据库
  • WSO2_CARBON_DB 引用 MySQL pod 上的数据库,仅供 API-Manager
  • 使用
  • WSO2REG_DB 应该是三个模块(am、das、is)之间的共享注册表数据库

  • 摘自上午的 master-datasources.xml:
            <datasource>
                 <name>WSO2_CARBON_DB</name>
                 <description>The datasource used by the registry</description>
                 <jndiConfig>
                   <name>jdbc/WSO2CarbonDB</name>
                 </jndiConfig>
                 <definition type="RDBMS">
                   <configuration>
                     <url>jdbc:mysql://mysql-apimdb:3306/amcarbondb?autoReconnect=true&amp;useSSL=false</url>
                     <username>wso2carbon</username>
                     <password>abc</password>
                     <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                     <maxActive>50</maxActive>
                     <maxWait>60000</maxWait>
                     <testOnBorrow>true</testOnBorrow>
                     <validationQuery>SELECT 1</validationQuery>
                     <validationInterval>30000</validationInterval>
                   </configuration>
                 </definition>
            </datasource> 
    
            <datasource>
                <name>WSO2AM_DB</name>
                <description>The datasource used for API Manager database</description>
                <jndiConfig>
                    <name>jdbc/WSO2AM_DB</name>
                </jndiConfig>
                <definition type="RDBMS">
                    <configuration>
                        <url>jdbc:mysql://mysql-apimdb:3306/apimgtdb?autoReconnect=true&amp;useSSL=false</url>
                        <username>wso2carbon</username>
                        <password>abc</password>
                        <defaultAutoCommit>false</defaultAutoCommit>
                        <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                        <maxActive>50</maxActive>
                        <maxWait>60000</maxWait>
                        <testOnBorrow>true</testOnBorrow>
                        <validationQuery>SELECT 1</validationQuery>
                        <validationInterval>30000</validationInterval>
                    </configuration>
                </definition>
            </datasource>
    
            <datasource>
                 <name>WSO2UM_DB</name>
                 <description>The datasource used by user manager</description>
                 <jndiConfig>
                   <name>jdbc/WSO2UM_DB</name>
                 </jndiConfig>
                 <definition type="RDBMS">
                   <configuration>
                     <url>jdbc:mysql://mysql-apimdb:3306/userdb?autoReconnect=true&amp;useSSL=false</url>
                     <username>wso2carbon</username>
                     <password>abc</password>
                     <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                     <maxActive>50</maxActive>
                     <maxWait>60000</maxWait>
                     <testOnBorrow>true</testOnBorrow>
                     <validationQuery>SELECT 1</validationQuery>
                     <validationInterval>30000</validationInterval>
                   </configuration>
                 </definition>
            </datasource>
    
            <datasource>
                <name>WSO2REG_DB</name>
                <description>The datasource used for registry</description>
                <jndiConfig>
                    <name>jdbc/WSO2REG_DB</name>
                </jndiConfig>
                <definition type="RDBMS">
                    <configuration>
                        <url>jdbc:mysql://mysql-apimdb:3306/regdb?autoReconnect=true&amp;useSSL=false</url>
                        <username>wso2carbon</username>
                        <password>abc</password>
                        <driverClassName>com.mysql.jdbc.Driver</driverClassName>
                        <maxActive>50</maxActive>
                        <maxWait>60000</maxWait>
                        <testOnBorrow>true</testOnBorrow>
                        <validationQuery>SELECT 1</validationQuery>
                        <validationInterval>30000</validationInterval>
                    </configuration>
                </definition>
            </datasource>
    

    所有这些数据库在使用时都会被填充,并使用来自不同产品的 DBscripts 进行初始化以进行初始设置。此外,registry.xml 配置如下(仅显示更改,文件的其余部分与默认配置相同):
    <currentDBConfig>wso2registry</currentDBConfig>
    <readOnly>false</readOnly>
    <enableCache>false</enableCache>
    <registryRoot>/</registryRoot>
    
    <dbConfig name="wso2registry">
        <dataSource>jdbc/WSO2CarbonDB</dataSource>
    </dbConfig>
    <dbConfig name="govregistry">
        <dataSource>jdbc/WSO2REG_DB</dataSource>
    </dbConfig>
    
    <remoteInstance url="https://localhost:9943/registry"> 
       <id>gov</id>
       <dbConfig>govregistry</dbConfig>
       <cacheId>wso2carbon@jdbc:mysql://mysql-apimdb:3306/regdb</cacheId>
       <readOnly>false</readOnly>
       <enableCache>false</enableCache>
       <registryRoot>/</registryRoot>
    </remoteInstance>
    
    <mount path="/_system/governance" overwrite="true">
           <instanceId>gov</instanceId>
           <targetPath>/_system/governance</targetPath>
    </mount>
    
    <mount path="/_system/config" overwrite="true">
           <instanceId>gov</instanceId>
           <targetPath>/_system/config</targetPath>
    </mount>
    

    最后,由于 am pod 上的内存不是持久的,因此重新启动时丢失了一些数据似乎是一个问题,因为我们已将所有数据库移动到另一个 pod 上的持久存储中,但这应该不是问题——除非我们错过了什么。是否需要添加/更改另一个注册表/数据源?上面未显示的所有其他默认数据源(STATS、MB_STORE、METRICS)也设置为使用 MySQL 服务器,因此除非数据源文件夹中提供的数据源之外还有其他内容,否则所有数据都应保留在相应的 MySQL 数据库中.

    最佳答案

    我猜你还没有为 API Manager 使用任何持久存储。创建 API 时,会在文件系统中创建 API 工件并存储在 wso2am-2.1.0/repository/deployment/server/synapse-configs/de‌​fault/api 位置。您需要为“wso2am-2.1.0/repository/deployment/server/”提供持久存储。就您而言,在重新启动期间,您没有相关数据,因为您有一个新包。

    关于WSO2-AM:重新启动后存储中的 API 调用失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46831230/

    相关文章:

    iOS 代理未连接到 WSO2 物联网服务器 3.1.0 的本地设置

    kubernetes - Traefik信息中心-自定义API路径

    wso2 - 尝试连接到端点时出错。无法为 ssl 借用客户端

    kubernetes - AWS EKS未找到分er荚,但 Helm 安装正常

    wso2 - 应用程序用户 token 在 WSO2 API 管理器中给出资源禁止错误

    WSO2 API 管理器异步 API 支持

    mysql - 使用 WS02 从多个 MySQL 数据库中读取相似的表

    algorithm - 为 WSO2 ESB 编写负载均衡算法

    oauth-2.0 - WSO2:端点是一个休息服务,有自己的 oauth2 服务。是否有可能在 WSO2 中为一个 API 禁用身份验证?

    debugging - 如何调试 Kubernetes 负载均衡器服务未在端口上响应的原因?