微服务和单体定义切换接口
这个文档的目的是实现单体接口和微服务接口的自动切换机制。因为JeecgBoot官方默认兼容单体和微服务自由切换,所以增加了这个机制,如果你完全是微服务开发不考虑自由切换,可以忽略此文章直接看 #实战微服务模块结构2.4
微服务中往往有这么一个场景,A服务需要调用B服务里面的方法,那么我们可以使用openfeign,在A服务中定义接口,声明方法远程调用B服务内暴露出来的地址(一般指向controller中定义的方法),那么当出现C,D,E.....更多服务的时候,并且这些服务都有可能调用B服务,如果让其他服务每次都在自己代码里重新声明一遍调用B服务的接口,显然是不合理的,所以需要将这些接口抽离出来,独立成一个接口模块。如项目中已经实现了的system服务的接口
注意:
- 接口项目的命名一致使用-api结尾
- cloud-api 表示这是给cloud项目使用的
- local-api 表示单体下使用
- 声明两个服务接口 可以支持单体和微服务间的切换 实际根据自己需求决定使用哪个
实现:
1.在loca-api中定义接口(本项目中继承了CommonAPI,实际自定义新的接口如果不需要使用CommonAPI中的方法其实没必要):
//单体
public interface ISysBaseAPI extends CommonAPI {
LoginUser getUserById(String id);
}
2.在具体模块定义实现类 此处对应的system模块 实现步骤1接口对应的所有方法
@Slf4j
@Service
public class SysBaseApiImpl implements ISysBaseAPI {
@Override
public LoginUser getUserById(String id) {
if(oConvertUtils.isEmpty(id)) {
return null;
}
LoginUser loginUser = new LoginUser();
SysUser sysUser = userMapper.selectById(id);
if(sysUser==null) {
return null;
}
BeanUtils.copyProperties(sysUser, loginUser);
return loginUser;
}
}
3.在cloud-api中定义接口,FeignClient注解value是调用的服务名,方法注解GetMapping指向system中定义的请求接口
//微服务
@Component
@FeignClient(contextId = "sysBaseRemoteApi", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysBaseAPIFallbackFactory.class)
public interface ISysBaseAPI extends CommonAPI {
@GetMapping("/sys/api/getUserById")
LoginUser getUserById(@RequestParam("id") String id);
}
4.在具体模块定义controller,此处对应的system模块,用于微服务接口的调用
@RestController
@RequestMapping("/sys/api")
public class SystemAPIController {
@Autowired
private ISysBaseAPI sysBaseAPI;
@GetMapping("/getUserById")
LoginUser getUserById(@RequestParam("id") String id){
return sysBaseAPI.getUserById(id);
}
}
注意:
- 这个controller 中注入的接口 即步骤1里面声明的单体接口。
- 方法请求地址 和步骤3里面微服务接口方法的GetMapping保持一致。
至此 无论单体还是微服务都能调用system下的api了
使用:
单体下在pom内添加依赖:
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-local-api</artifactId>
</dependency>
微服务在pom内添加依赖
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-system-cloud-api</artifactId>
</dependency>
总结:
上述说明的是system模块api的实现以及使用,如果有自己的新模块需要写api,参照其规则即可。 1.新增两个api项目 2.命名以local-api/cloud-api结尾 3.分别在两个项目中定义接口 4.在自己模块定义实现类 实现local-api中的接口 5.在自己模块定义controller,注入local-api中的接口,方法请求地址和cloud-api保持一致 6.其他模块调用只需要根据单体或微服务的需要切换具体的依赖即可。