如今愈来愈多的公司开始拥抱Spring Cloud了,不少Java方向的同窗也开始积极的学习Spring Cloud,其实这边还有一个问题就是说:虽然你们学了Eureka,Ribbon,Hystrix,Zuul,Feign等等,可是要运用到实际的项目中去仍是有些难度的。bash
微服务难就难在服务的拆分上,框架只是工具,不少人都会用,服务拆分,服务之间的关系这些都是在拆分时候须要考虑的事情。微信
今天就有一位同窗给我发邮件,咨询我下面2个问题:app
下面以我本身的经验来作一些解答,仅供参考:框架
咱们所说的API其实就是一个接口,大部分都是用Spring MVC方式去开发的,也就是Controller中的一个加了注解的方法,注解就是咱们经常使用的那几个:微服务
这种其实也没有固定的模式,大部分是直接经过API网关转发到你的业务服务上工具
以猿天地这样的博客网站的业务类举例:学习
有一个业务功能,当我查看具体的博客文章的时候,须要返回的信息以下:网站
这个时候咱们这个查看文章的接口其实就涉及到了3部分的数据,文章自己的信息,评论信息,做者的信息ui
就是有3个服务,用户服务,博客服务,评论服务spa
那么问题来了,涉及到多个服务以前的交互,其实跟上面那位同窗问个人是同样的问题,是否须要统一工程,组装其余服务?是否能够相互调用?
这种的话我推荐2种实现方式:
咱们这个API就是一个获取博文信息的接口,主体确定是博客服务,在博客服务中有一个博文信息的接口,在接口中去调用用户服务提供的用户信息接口,还要去调用评论服务中博文的评论信息,下面看伪代码:
@GetMapping("/blog/detail/{id}")
public BlogInfo blogInfo(@PathVariable("id") Long id) {
// 获取博客信息
Blog blog = blogService.getById(id);
// 获取用户信息
UserInfo userInfo = userFeignClient.getUserInfo(blog.getUserId());
// 获取评论信息
CommentInfo commentInfo = commentFeignClient.getCommentInfo(id);
return 组装全部信息返回。
}
复制代码
集合服务层也就是上面那位同窗说的是否是须要有一个统一的工程来作组装服务的事情,这个就是说咱们博客服务仍是提供基础的博客信息,单独加一个业务的聚合服务用来组装这些信息统一返回给调用方,伪代码以下:
@GetMapping("/blog/detail/{id}")
public BlogInfo blogInfo(@PathVariable("id") Long id) {
// 获取博客信息
Blog blog = blogFeignClient.getById(id);
// 获取用户信息
UserInfo userInfo = userFeignClient.getUserInfo(blog.getUserId());
// 获取评论信息
CommentInfo commentInfo = commentFeignClient.getCommentInfo(id);
return 组装全部信息返回。
}
复制代码
数据都是远程调用的,固然这边你能够并行去调用,还有一种方式就是聚合操做在API网关中进行,这种方案也是可行的,我建议仍是不要在网关中作,API网关尽可能简单,只转发,增长聚合服务层是不错的选择。
若是你的服务治理是用dubbo构建的,聚合服务层也是比较好的方法,将dubbo服务聚合统一提供http接口给外部调用。
还有一种方式的话就是调用方本身去分别调用博客接口,评论接口,用户接口,这样的话接口只须要关注本身自己的数据,把组装的问题交给的使用方,这种通常用的比较少,最好是一次性将要用的数据返回给调用方,反复调用特别是在移动端,请求太多了,浪费流量。
至于要怎么去组装数据,仍是得你本身来定,能够将组装放在对应的业务服务中,也能够单独增长一个聚合服务来组装,也可让客户端本身去组装。
服务之间确定是能够相互调用的,要是不能相互调用,那么你拆开还有什么意义,用Feign来调用服务接口,你就把它当作Service之间的调用便可。 更多技术分享请关注微信公众号:猿天地