微服务和单体定义切换接口
最后更新于: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.其他模块调用只需要根据单体或微服务的需要切换具体的依赖即可。
';