微服务和单体定义切换接口

最后更新于:2022-04-02 07:10:50

> 这个文档的目的是实现单体接口和微服务接口的自动切换机制。因为JeecgBoot官方默认兼容单体和微服务自由切换,所以增加了这个机制,如果你完全是微服务开发不考虑自由切换,可以忽略此文章直接看 [#实战微服务模块结构2.4](http://doc.jeecg.com/2159148) 微服务中往往有这么一个场景,A服务需要调用B服务里面的方法,那么我们可以使用openfeign,在A服务中定义接口,声明方法远程调用B服务内暴露出来的地址(一般指向controller中定义的方法),那么当出现C,D,E.....更多服务的时候,并且这些服务都有可能调用B服务,如果让其他服务每次都在自己代码里重新声明一遍调用B服务的接口,显然是不合理的,所以需要将这些接口抽离出来,独立成一个接口模块。如项目中已经实现了的system服务的接口 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/44/f7/44f73f4bee6e77783c7bf8bce027e6a7_329x142.png) 注意: - 接口项目的命名一致使用-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内添加依赖: ~~~ org.jeecgframework.boot jeecg-system-local-api ~~~ 微服务在pom内添加依赖 ~~~ org.jeecgframework.boot jeecg-system-cloud-api ~~~ ## 总结: 上述说明的是system模块api的实现以及使用,如果有自己的新模块需要写api,参照其规则即可。 1.新增两个api项目 2.命名以local-api/cloud-api结尾 3.分别在两个项目中定义接口 4.在自己模块定义实现类 实现local-api中的接口 5.在自己模块定义controller,注入local-api中的接口,方法请求地址和cloud-api保持一致 6.其他模块调用只需要根据单体或微服务的需要切换具体的依赖即可。
';