# 微服务调用帮助类

`kd.bos.servicehelper.DispatchServiceHelper `微服务调用帮助类为微服务调用上层封装，简化集群中不同微服务之间的调用操作。

苍穹依据应用进行微服务拆分。对于平台应用而言平台的功能为通用型，jar包会在每一个节点上进行部署。而对于业务而言其功能jar包只会部署在自身所在的应用节点上，因此需要调用到正确的节点才能的到正确的调用返回。因此微服务调用帮助类中区分了以下类型的调用:

* **平台微服务调用**，该类别的微服务调用会依据负载均衡算法调用到集群中任一节点
* **业务微服务调用**，该类别的微服务调用会调用到指定的业务集群的节点上
* **二开微服务调用**，该类别的微服务调用会调用到指定二开注册的微服务节点上

目前苍穹使用的负载均衡算法为健康度负载算法。

举例，调用平台健康检查服务：

```java
String result = DispatchServiceHelper.invokeBOSService(
    "bos", "HealthValidateService","validate",appNumbers);
```



## API 概览 

| 方法                                                         | 说明                           |
| ------------------------------------------------------------ | ------------------------------ |
| static <T> T getBOSService(String appId, String serviceName, Class<T> bizCls) | 通过应用Id获取平台提供的微服务 |
| static Object invokeBOSService(String appId, String serviceName, String methodName, Object... paras) | 平台微服务调用                 |
| static <T> T invokeBizService(String cloudId, String appId, String serviceName, String methodName,Object... paras) | 业务微服务调用                 |
| static <T> T invokeService(String factoryQualifiedPrefix, String appId, String serviceName, String methodName,  Object... paras) | 二开业务调用                   |



## API 详情

### 1、通过应用Id获取平台提供的微服务接口

```java
static <T> T getBOSService(String appId, String serviceName, Class<T> bizCls)
```

传入参数：

| 参数名称       | 参数        | 参数类型 | 是否必传 |
| -------------- | ----------- | -------- | -------- |
| 应用Id         | appId       | String   | 是       |
| 注册的服务名称 | serviceName | String   | 是       |
| 微服务接口类   | bizCls      | Class<T> | 是       |

返回数据：

**微服务代理实现**，Class<T>



### 2、平台微服务调用

```java
static Object invokeBOSService(String appId, String serviceName, String methodName, Object... paras)
```

传入参数：

| 参数名称       | 参数        | 参数类型 | 是否必传 |
| -------------- | ----------- | -------- | -------- |
| 应用Id         | appId       | String   | 是       |
| 注册的服务名称 | serviceName | String   | 是       |
| 调用服务方法   | methodName  | String   | 是       |
| 方法入参       | paras       | Object[] | 是       |

返回数据：

**微服务调用返回结果**，Object



### 3、业务微服务调用

```java
static <T> T invokeBizService(String cloudId, String appId, String serviceName, String methodName, Object... paras)
```

传入参数：

| 参数名称       | 参数        | 参数类型 | 是否必传 |
| -------------- | ----------- | -------- | -------- |
| 云Id           | cloudId     | String   | 是       |
| 应用Id         | appId       | String   | 是       |
| 注册的服务名称 | serviceName | String   | 是       |
| 调用服务方法   | methodName  | String   | 是       |
| 方法入参       | paras       | Object[] | 是       |

返回数据：

**微服务调用返回结果**，Object



### 4、二开微服务调用

```java
static <T> T invokeService(String factoryQualifiedPrefix, String appId, String serviceName, String methodName, Object... paras)
```

传入参数：

| 参数名称                                                     | 参数                   | 参数类型 | 是否必传 |
| ------------------------------------------------------------ | ---------------------- | -------- | -------- |
| Factory类限定前缀，如：服务工厂`isv.ti.bo.ServiceFactory `<br/>的` factoryQualifiedPrefix`为`isv.ti.bo` | factoryQualifiedPrefix | String   | 是       |
| 应用Id                                                       | appId                  | String   | 是       |
| 注册的服务名称                                               | serviceName            | String   | 是       |
| 调用服务方法                                                 | methodName             | String   | 是       |
| 方法入参                                                     | paras                  | Object[] | 是       |

返回数据：

**微服务调用返回结果**，Object

