返回介绍

27.微服务中新增服务接口

发布于 2020-09-14 22:20:43 字数 7324 浏览 1621 评论 0 收藏 0

微服务中往往有这么一个场景,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.其他模块调用只需要根据单体或微服务的需要切换具体的依赖即可。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文