为了对业务服务进行统一管理,同时避免网络防火墙的繁琐配置,可以采用总分结构业务系统在 CSB 级联发布 HTTP 服务。

前提条件

  • 创建专享实例
    说明 仅专享实例支持级联发布服务。
  • 您需要先提交工单,由 CSB 技术支持人员为您配置 CSB 实例的级联链路。

背景信息

业务系统总分级联结构示意如下:

HTTP 总分级联结构
说明
  • 直接级联路由:接收到 HTTP 级联服务请求的 CSB Broker 直接将请求转发给指定 CSB Broker级联网关地址(格式为http://xxx:8081)。
  • 总分级联路由:接收到 HTTP 级联服务请求的 CSB Broker 根据请求 HTTP 头信息中的目标 CSB 别名,动态路由到指定目标 CSB Broker 网关地址。
  • 总部制定业务服务规范,各分部业务应用实现对应的服务集。也就是每个分部都会实现相同的业务服务。
  • 总部与分部之间双向 HTTP 服务调用。
    • 各分部业务服务发布到总部 CSB 实例,供总部应用访问(即:总部访问分部服务):对于每个分部业务服务,总部应用希望总部 CSB 实例暴露一个业务服务,根据请求业务参数,由 CSB 自动路由到指定的分部应用。
    • 总部业务服务发布到各分部 CSB 实例,供分部应用访问(即:分部访问总部服务):对于总部业务服务,总部应用希望在总部 CSB 实例上发布一次,即可供各分部业务应用访问。

条件与约束

  • 目前仅支持 HTTP 的总分级联。
  • HTTP 附件:只支持单附件上传和下载,不支持多附件上传。
  • 总部与分部的 csbConsole 之间网络需要互通(端口 80、443)。
  • 总部与分部的 csbBroker 之间的网络需要互通(端口 8081、8086、9081)。
  • 要求总部与分部的 VIP 都绑定域名(如果没有统一 DNS,则至少使用 hosts 绑定),以便后续管理。

级联发布流程

  1. 创建服务组

    在总部和分部的实例上创建同名的服务组。

  2. 进入级联发布页面

    级联发布和普通路由发布入口不同,需要进入统一级联发布页面级联发布服务。

  3. 分部访问总部服务:总部服务发布到分部 CSB 实例

    为使分部服务访问总部服务,需要在总部 CSB 控制台实例上将总部服务级联发布到分部 CSB 实例上,且总部服务在每个分部 CSB 上只对应一个服务。

  4. 总部访问分部服务:分部服务发布到总部 CSB 实例

    为使总部服务访问分部服务,需要在分部 CSB 控制台实例上将分部服务级联发布到总部 CSB 实例上。然后总部 CSB 实例识别多个分部来的级联服务请求,将同名的多个分部服务映射到一个级联服务。

创建服务组

进行级联发布之前,需要在总部和分部的实例上创建同名的服务组。

  1. 登录 CSB 控制台
  2. 在顶部页面顶部选择地域
  3. 在左侧导航栏单击实例列表
  4. 实例列表单击具体实例名称。
    注意 如果您使用共享实例,请参考创建共享实例中的表格使用 CSB 指定的共享实例,否则会导致发布失败。共享实例仅用于体验试用,不建议正式生产使用。
  5. 在实例详情页面左侧导航栏中选择发布者 > 我的服务组
  6. 我的服务组页面右上角单击新建服务组
  7. 新建服务组对话框设置服务组参数,单击确认

    服务组接口文件指为这个服务组上传一个 JAR 类型的接口文件,用于自动生成参数。

    新建服务组
    新建服务组后,返回我的服务组,该服务组的状态启动,其它信息也与配置的一致。

进入级联发布页面

在级联发布服务前,需要先进入级联发布页面。

  1. 登录 CSB 控制台
  2. 在顶部页面顶部选择地域
  3. 在左侧导航栏单击实例列表
  4. 实例列表单击具体实例名称。
    注意 如果您使用共享实例,请参考创建共享实例中的表格使用 CSB 指定的共享实例,否则会导致发布失败。共享实例仅用于体验试用,不建议正式生产使用。
  5. 在实例详情页面左侧导航栏选择发布者 > 统一级联发布

分部访问总部服务:总部服务发布到分部 CSB 实例

总部业务人员在总部 CSB 控制台上选择总部 CSB 实例,将服务级联发布到分部的 CSB 实例上。

级联发布和单实例发布服务的流程基本一致,本文仅介绍级联发布服务的流程及需要注意的事项。

  1. 命名服务,详情请参见命名服务
    注意 所属服务组必须选择总部在总部 CSB 实例和分部 CSB 实例上创建的同名的服务组。
  2. 设置接入协议,详情请参见设置接入协议
    • 路由策略:目前仅支持直接路由
    • 接入协议:对于 HTTP 级联发布,则选择 RESTful-API
    • 端点:总部业务服务的 HTTP 访问地址。
    • 方法:总部业务服务要求的 HTTP 方法,目前支持 POST 和 GET。
    • 请求格式:普通 HTTP 请求或 JSON 请求内容。
    • 编辑入参:可以根据业务服务的入参信息,填写入参列表。也可以不填。
    • 编辑入参:可以根据业务服务的出参信息,填写出参列表。也可以不填。
  3. 设置开发协议,详情请参见设置开放协议
  4. 设置访问限制,详情请参见设置访问限制
    说明 如果想保证调用方服务的可用性,还可以配置熔断和降级,详情请参见如何使用熔断和降级保证调用方服务的可用性
  5. 设置目标实例。
    和普通路由发布不同,级联发布还需要设置级联发布的目标实例。在目标实例页面勾选服务发布目标实例,在目标实例路由方式右侧的列表中选择总分路由,然后单击下一步级联发布-目标实例
  6. 发布服务页面确认设置,单击完成发布

总部访问分部服务:分部服务发布到总部 CSB 实例

  • 总部无此级联服务:按现有 CSB 逻辑,直接新建总部的级联服务,并设置服务类型为直接路由服务。
  • 总部已有此级联服务:增加总部已有 CSB 级联服务的分部服务引用关系,并设置为“内容路由”服务。

定义路由规则:由系统根据规则生成总部级联服务路由到分部的规则。

  • 默认以 HTTP Query 的 csbRouter 参数作为路由参数。
  • 以分部 CSB 实例名作为 csbRouter 值。

级联发布和单实例发布服务的流程基本一致,本文仅介绍级联发布服务的流程及需要注意的事项。

  1. 命名服务,详情请参见命名服务
    注意 所属服务组必须选择总部在总部 CSB 实例和分部 CSB 实例上创建的同名的服务组。
  2. 设置接入协议,详情请参见设置接入协议
    • 路由策略:目前仅支持直接路由
    • 接入协议:对于 HTTP 级联发布,则选择 RESTful-API
    • 端点:总部业务服务的 HTTP 访问地址。
    • 方法:总部业务服务要求的 HTTP 方法,目前支持 POST 和 GET。
    • 请求格式:普通 HTTP 请求或 JSON 请求内容。
    • 编辑入参:可以根据业务服务的入参信息,填写入参列表。也可以不填。
    • 编辑入参:可以根据业务服务的出参信息,填写出参列表。也可以不填。
  3. 设置开发协议,详情请参见设置开放协议
  4. 设置访问限制,详情请参见设置访问限制
    说明 如果想保证调用方服务的可用性,还可以配置熔断和降级,详情请参见如何使用熔断和降级保证调用方服务的可用性
  5. 设置目标实例。
    和普通路由发布不同,级联发布还需要设置级联发布的目标实例。在目标实例页面勾选服务发布目标实例,在目标实例路由方式右侧的列表中选择总分路由,然后单击下一步级联发布-目标实例
  6. 发布服务页面确认设置,单击完成发布

执行结果

  • 如果该实例的拥有者将服务发布审批设置为不需要审批,发布后状态激活
  • 如果该实例的拥有者将服务发布审批设置为一级审批二级审批,则发布后状态等待一次审批等待二次审批,需要实例拥有者审批后才能激活。

后续步骤

级联发布服务成功后,您可以订阅和调用服务。
  • 订阅服务详情请参见订阅服务
  • 调用服务因总分结构会有所不同,但都需要先下载最新版本的 Java SDK,详情请参见工具包下载地址
    • 分部应用调用总部服务

      对于 CSB 客户端来说,与调用普通 CSB 服务无异,详情请参见调用服务CSB-SDK说明

    • 总部应用调用分部服务

      此场景需要总部应用发起总部 CSB 服务请求时,携带分部 CSB 路由信息。以便总部 CSB 根据此路由信息将请求路由到正确的分部 CSB 实例。所以,需要总部应用在原有 CSB 服务调用方式基础上增加一个 HttpHeadercsbCasRouter = 分部 CSB 实例别名)。详情请参见调用服务

      为帮助您理解,分别列举命令行和代码两种方式的调用示例。

      • 命令行调用示例
        java -jar http-client-1.1.5.7.jar -method post -url "http://csb-broker.hq.com:8086/CSB?key1=value1" \
                -api "branch-headquarters-service1_csb_cas" -version "1.0.0"    -ak "ak1" -sk "sk1" \
                -H "csbCasRouter:b01"
      • 代码调用示例
        public void testHttp2Http() {
            HttpParameters.Builder builder = new HttpParameters.Builder();
            builder.requestURL("http://总部CSB服务地址:8086/CSB") 
                    .api("总部级联服务名") 
                    .version("1.0.0") 
                    .method("post")  
                    .accessKey("ak值").secretKey("sk值")  
                      .putHeaderParamsMap("csbCasRouter","分部CSB实例别名"); //设置总部级联服务路由信息
        
            // 设置HTTP FORM表单请求参数
            builder.putParamsMap("key1", "value1");
            try {
                String ret = HttpCaller.invoke(builder.build());
                System.out.println("------- ret=" + ret);
            } catch (HttpCallerException e) {
                e.printStackTrace();
            }
        }
        说明 CSB 总部服务地址即创建该实例时绑定的 SLB 的地址。