注意:自v3.5.0开始远程调用方式更新为如下方式
当新建的微服务模块需要提供给内部其他模块使用时,可新建kems-api
模块和新建kems-api-xx
模块,同时定义被调用的接口,消费模块引用kems-api-xx
即可。
配置类如下(需指定clients才能扫描到,也可以直接指定basePackages为包名扫描整个模块,但是会增加扫描时间【不建议】):
@EnableServiceClients(clients = {ApiClient.class, DictClient.class, MenuClient.class, OrgClient.class, ParamClient.class, RegionClient.class, RoleClient.class, UserClient.class})
public class ApiSystemAutoConfiguration {
}
具体请参考
kems-api-system.jar
中的声明及kems-dependency-system.jar
中的实现。以kems-api-system
为例,使用步骤如下。
1. 新建api模块
引入依赖,目录结构参考上图
<dependency>
<groupId>com.szkingdom.koca.base</groupId>
<artifactId>koca-core</artifactId>
</dependency>
<dependency>
<groupId>com.szkingdom.koca.base</groupId>
<artifactId>koca-client</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>compile</scope>
</dependency>
2. 接口声明
新建UserClient.java并声明所需接口,@PostMapping中额外添加/rpc
以区分用途(虽然也可以直接调用)
- 注意:同模块的接口要分多个Client存放时,@ServiceClient的name同为服务名,alias不能和其他的重复!
@ServiceClient(name = "module-system", alias = "userClient")
public interface UserClient {
/**
* 新增用户
*
* @param sysUserInfoParam 用户信息
* @return 用户信息
*/
@PostMapping("/user/rpc/save")
Result<SysUserDTO> addUser(@RequestBody SysUserInfoParam sysUserInfoParam);
}
3. 接口实现
在原始接口模块(一般为module-xxx)新增rpc文件夹,用于存放UserClient的实现类UserClientImpl,并引入依赖
<dependency>
<groupId>com.kingengine.kems.api</groupId>
<artifactId>kems-api-system</artifactId>
</dependency>
远程接口实现参考如下:(逻辑等同于原Controller的逻辑,可直接copy过来稍作修改)
@RestController
@ApiIgnore
@Primary //添加@Primar, 确保在引入demo-provider-impl时不报bean冲突
public class UserClientImpl implements UserClient {
@Resource
private ISysUserService userService;
/**
* 新增用户
*
* @param sysUserInfoParam 用户信息
* @return 用户信息
*/
@Override
public Result<SysUserDTO> addUser(SysUserInfoParam sysUserInfoParam) {
SysUserAddParam param = new SysUserAddParam();
BeanUtils.copyProperties(sysUserInfoParam, param);
SysUser sysUser = userService.insertUser(param);
SysUserDTO sysUserDTO = new SysUserDTO();
BeanUtils.copyProperties(sysUser, sysUserDTO);
return Result.success(BaseResultMessage.SUCCESS, sysUserDTO);
}
}
4. 依赖集成
在需要远程调用的模块同样引入依赖:
<dependency>
<groupId>com.kingengine.kems.api</groupId>
<artifactId>kems-api-system</artifactId>
</dependency>
调用方式参考如下:
@Resource
UserClient userClient;
public void test() {
SysUserInfoParam sysUserInfoParam = new SysUserInfoParam();
SysUserDTO sysUserDTO = userClient.addUser(sysUserInfoParam).getBody();
}