# 公共小组件机制

原始文档链接：[公共小组件机制](https://weapp.eteams.cn/build/techdoc/wdoc/index.html#/public/repository/b90d212e-0cab-40a6-9845-d9476f717caf/doc/958005864293203968)
目录分组：对接方案

# E10多eb组件后端服务统一合并发布规范

### 背景：

> 公共服务可以解决什么样的问题： 各个业务模块都会开发公共组件，服务太多不利于维护升级，统一用一个公共服务解决各个业务组件部署问题

### 公共服务适用部署哪些业务场景：

（1）、业务模块需要开发的功能是一个通用的功能或组件，可以被多个模块重复使用。

（2）、不同业务模块需要相似或相同的功能，比如人员分配组件

（3）、公共组件或功能的需求足够通用，以至于可以在多个业务模块中重复使用

所有的组件以jar包的形式提供，并引用到主服务weaver-component-web服务中

### 业务模块开发的一个方式:

业务模块单独仓库开发（最后形成一个jar），开发相互独立，打成对应的jar包部署在公共服务运行

# 一、组件项目架构

![](/api/file/preview?fileId=920098882557698048&type=imgs)

## 1.1独立仓库

各模块申请独立的git仓库用来开发组件，各个组件做到隔离

## 1.2项目结构

```java
|——weaver-customerservice-component（模块EB业务组件仓库）

   |--weaver-customerservice-distribution-component-api（dubbo api）
        |-com.weaver.customerservice.distribution.component.rest
   |--weaver-customerservice-distribution-component(业务实现)
        |——com.weaver.customerservice.distribution.component.controller （前端调用api）
        |——com.weaver.customerservice.distribution.component.entity（实体类）
        |——com.weaver.customerservice.distribution.component.dao（dao层）
        |——com.weaver.customerservice.distribution.component.service（service层）
        |——com.weaver.customerservice.distribution.component.mapper（mapper）
        |——com.weaver.customerservice.distribution.component.util（工具类）

   |--weaver-customerservice-call-component-api（dubbo api）
		|-com.weaver.customerservice.call.component.rest
   |--weaver-customerservice-call-component(业务实现)
        |——com.weaver.customerservice.call.component.controller （前端调用api）
        |——com.weaver.customerservice.call.component.entity（实体类）
        |——com.weaver.customerservice.call.component.dao（dao层）
        |——com.weaver.customerservice.call.component.service（service层）
        |——com.weaver.customerservice.call.component.mapper（mapper）
        |——com.weaver.customerservice.call.component.util（工具类）	

```

### 1.2.1项目命名规范

weaver-模块-component 作为模块的根组件仓库，例如客服模块的组件仓库叫weaver-customerservice-component

weaver-模块-组件名-component作为模块组件的开发仓库包括具体的业务实现，例如客服模块的人员分配组件叫weaver-customerservice-distribution-component

weaver-模块-组件名-component-api作为模块组件的暴露的dubboapi，例如客服模块的人员分配组件包括的dubboapi叫weaver-customerservice-distribution-component-api

### 1.2.3、包名规范

com.weaver.模块.组件名.component.xxx，例如客服模块的人员分配组件命名规范为com.weaver.customerservice.distribution.component.xxx

### 1.2.4、rest接口暴露规范

- 接口前缀请以/api/component/modules/模块名/feature/功能名开头，sapi/papi接口同理
- 如需要统一license拦截,接口前缀以/api/component/license/采购license名/modules/模块名/feature/功能名定义
- 方便后续有需要统一修改的的校验、配置时，组件可以统一修改 ![](http://10.10.10.40:4999/server/index.php?s=/api/attachment/visitFile&sign=bb3e29c11af40fe5ba973c31135d7745)
- TODO:后续会提供统一开发类

![](/api/file/preview?fileId=918618544783654913&type=imgs)

### 1.2.5、rpc接口暴露规范

1、在jar包的resources目录下添加dubbo xml文件，文件命名为applicationContext-xxx-component-dubbo.xml,其中xxx由模块定义。 其中dubbo:service定义需要注意必须要加一个scope参数，并且自定义变量为${rpcservice.modules.xxx..scope:local}

```xml
<dubbo:service ref="example_remote_service" interface="com.weaver.example.api.IRemoteExampleService" scope="${modules.example.rpcservice.scope:local}"/>
```

加modules.example.rpcservice.scope的目的是为了防止jar包被其它服务误引用而抛出rpc服务

2、转到weaver-componnet-web项目，在application.properties添加一下配置 ![](http://10.10.10.40:4999/server/index.php?s=/api/attachment/visitFile&sign=c98954ed00ff3b367a7099e73545cb8f)

![](/api/file/preview?fileId=918618712172576770&type=imgs)

3、重启weaver-componnet-web项目，验证rpc是否成功发布

### 1.2.6、脚本升级规范

目前的脚本升级，请直接将脚本推送至weaver-component-web服务下，已协调升级组提供jar包脚本升级机制，待功能完成后后续进行替换。(2023.10.12注)

### 1.2.7、license相关

由于宿主服务weaver-component-web为默认安装服务，如接口等需要进行license控制，请自行控制。也可在rest接口前缀添加固定license前缀

### 1.2.8、pom使用规范

在组件中pom引用一般分为两种

1、基础能力pom引用，如批处理能力需要引用weaver-common-batch包，这中jar可以直接引用

2、需要通过rpc获取其它服务的能力或者数据，如通过任务id获取任务名称，进行一系列操作

- 2.1、如业务模块已经有该rpc且存在比较干净的契约包，可以引用处理
- 2.2、业务模块无该功能，优先由我方提供api接口，由模块方引用我方契约包实现接口暴露rpc
  
  如非特殊情况，禁止直接引用大型sdk包

## #1.2.9、nacos规范

- nacos配置文件名，请以weaver-xxx-component.properties定义
- 配置key为了避免不同组件重复，请以weaver.modules.xxx为前缀

# 二、公共配置类的使用

在使用以下功能时，需要找师源协助，需要提供统一方案，不允许直接jar包能新增

1、拦截器、过滤器类功能使用

2、启动运行类，applicationRunner相关功能使用

3、统一异常拦截类，ControllerAdvice相关功能使用

4、AOP类，原则上禁止使用AOP机制，请以显式的方式处理

其它会影响整个服务功能的稳定性的配置类功能

# 四、待完成部分

jar包注册机制:后续提供注册机制
