调用第三方服务

概念阐述

第三方服务没有在服务中心注册,不存契约信息,Java Chassis 提供一种透明的方式访问第三方服务。 使用该功能调用第三方服务时,发往第三方服务的请求会经过consumer端handler链、HttpClientFilter的处理, 即该功能支持对第三方服务调用的治理功能,并且也支持ServiceComb既有的用户自定义扩展处理机制。

另外开发者也可以使用 本地注册发现 实现第三方调用, 两种方式实现的效果是一致的。

示例代码

  1. 假设用户在本地开发了一个REST服务作为第三方REST服务,监听端口号为8080,其REST接口如契约所示:

    ```yaml
    ---
    swagger: "2.0"
    info:
    version: "0.0.1"
    title: "3rd party REST service for example"
    basePath: "/rest"
    consumes:
    - "application/json"
    produces:
    - "text/plain"
    paths:
    /{pathVar}:
      get:
        operationId: "testPathVar"
        parameters:
        - name: "pathVar"
          in: "path"
          required: true
          type: "string"
        responses:
          200:
            description: "response of 200, return \"Received, OK. [${pathVar}]\""
            schema:
              type: "string"
    ```
    
  2. 为调用此服务,需要先根据其REST接口编写一个Java接口类,并打上参数注解。 Java接口类的编写方式参照使用隐式契约开发SpringMVC和JAX-RS风格的provider方式。 接口代码示例如下:

    ```java
    @Path("/rest")
    @Api(produces = MediaType.TEXT_PLAIN)
    public interface VertxServerIntf {
    @Path("/{pathVar}")
    @GET
    String testPathVar(@PathParam("pathVar") String pathVar);
    }
    ```
    
  3. 通过实现 ThirdServiceWithInvokerRegister 注册第三方服务信息。 可以注册多个 schema。

    ```java
    @Configuration
    public class ThirdSvc extends ThirdServiceWithInvokerRegister {
      public ThirdSvc() {
        super("3rd-svc");
    
        addSchema("schema-1", VertxServerIntf.class);
      }
    }
    ```
    

    注意: java chassis 2.1.3 以上版本才支持 ThirdServiceWithInvokerRegister。

  4. 调用第三方服务,声明和调用方式与调用ServiceComb provider服务相同,此处以RPC调用方式为例。

    ```java
    VertxServerIntf client = BeanUtils.getContext().getBean(VertxServerIntf.class);
    client.testPathVar(pathVar);
    ```
    
  5. 使用治理功能。使用治理功能的方法与普通的consumer调用provider场景类似。以限流策略为例,在consumer 服务的microservice.yaml文件中进行如下配置:

    ```yaml
    servicecomb:
      flowcontrol:
        Consumer:
          qps:
            enabled: true
            limit:
              thirdPartyService: 1
    ```
    

    此时即将consumer调用名为thirdPartyService的第三方REST服务的QPS设置为1。当consumer调用thirdPartyService的流量高于1QPS时, 将会得到429 Too Many RequestsInvocationException异常。

  6. 配置第三分服务的实例信息

    3rd-svc:
      urls:
        - http://localhost:8080