Spring Cloud实现提供API给客户端的方法详解

前言

现在越来越多的公司开始拥抱Spring Cloud了,Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝。很多Java方向的同学也开始积极的学习Spring Cloud,其实这边还有一个问题就是说:虽然大家学了Eureka,Ribbon,Hystrix,Zuul,Feign等等,但是要运用到实际的项目中去还是有些难度的。

微服务难就难在服务的拆分上,框架只是工具,很多人都会用,服务拆分,服务之间的关系这些都是在拆分时候需要考虑的事情。

今天就有一位同学给我发邮件,咨询我下面2个问题:

下面以我自己的经验来做一些解答,仅供参考:

关于第一个问题中的API是各个微服务下的Controller?

我们所说的API其实就是一个接口,大部分都是用Spring MVC方式去开发的,也就是Controller中的一个加了注解的方法,注解就是我们常用的那几个:

  • @RequestMapping
  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping

关于第一个问题中的是否需要统一的一个工程,在里面封装其他微服务的controller?

这种其实也没有固定的模式,大部分是直接通过API网关转发到你的业务服务上

以猿天地这样的博客网站的业务类举例:

有一个业务功能,当我查看具体的博客文章的时候,需要返回的信息如下:

  • 博文标题
  • 发布时间
  • 作者
  • 标签
  • 阅读数量
  • 评论信息
  • 作者信息(昵称,介绍)

这个时候我们这个查看文章的接口其实就涉及到了3部分的数据,文章本身的信息,评论信息,作者的信息

就是有3个服务,用户服务,博客服务,评论服务

那么问题来了,涉及到多个服务之前的交互,其实跟上面那位同学问我的是一样的问题,是否需要统一工程,组装其他服务?是否可以相互调用?

这种的话我推荐2种实现方式:

一. API网关直接转发到博客服务中

我们这个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之间的调用即可。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • 浅谈Spring Cloud中的API网关服务Zuul
(0)

相关推荐

  • 浅谈Spring Cloud中的API网关服务Zuul

    到目前为止,我们Spring Cloud中的内容已经介绍了很多了,Ribbon.Hystrix.Feign这些知识点大家都耳熟能详了,我们在前文也提到过微服务就是把一个大的项目拆分成很多小的独立模块,然后通过服务治理让这些独立的模块配合工作等.那么大家来想这样两个问题:1.如果我的微服务中有很多个独立服务都要对外提供服务,那么对于开发人员或者运维人员来说,他要如何去管理这些接口?特别是当项目非常大非常庞杂的情况下要如何管理?2.权限管理也是一个老生常谈的问题,在微服务中,一个独立的系统被拆分成很

  • Spring Cloud实现提供API给客户端的方法详解

    前言 现在越来越多的公司开始拥抱Spring Cloud了,Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.很多Java方向的同学也开始积极的学习Spring Cloud,其实这边还有一个问题就是说:虽然大家学了Eureka,Ribbon,Hystrix,Zuul,Feign等等,但是要运用到实际的项目中去还是有些难度的. 微服务难就难在服务的拆分上,框架只是工具,很多人都会用,服务拆分,服务之间的关系这些都是在拆分时候需

  • Spring Cloud Config对特殊字符加密处理的方法详解

    前言 之前写过一篇关于配置中心对配置内容加密解密的介绍:<Spring Cloud构建微服务架构:分布式配置中心(加密解密) >.在这篇文章中,存在一个问题:当被加密内容包含一些诸如=.+这些特殊字符的时候,使用上篇文章中提到的类似这样的命令curl localhost:7001/encrypt -d去加密和解密的时候,会发现特殊字符丢失的情况. 比如下面这样的情况: $ curl localhost:7001/encrypt -d eF34+5edo= a34c76c4ddab706fbca

  • Spring Cloud 覆写远端的配置属性实例详解

    应用的配置源通常都是远端的Config Server服务器,默认情况下,本地的配置优先级低于远端配置仓库.如果想实现本地应用的系统变量和config文件覆盖远端仓库中的属性值,可以通过如下设置: spring: cloud: config: allowOverride: true overrideNone: true overrideSystemProperties: false overrideNone:当allowOverride为true时,overrideNone设置为true,外部的配

  • Spring Boot项目中定制拦截器的方法详解

    这篇文章主要介绍了Spring Boot项目中定制拦截器的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供HandlerInterceptor(拦截器)工具.根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前.request被响应之后.视

  • Spring框架开发IOC两种创建工厂方法详解

    1.IOC有两种创建工厂的方法 IoC 通过工厂模式创建 bean 的方式有两种: 静态工厂方法 实例工厂方法 2.两种方法的不同 2.1静态方法创建 就是直接可以通过静态方法来实例化一个对象,采用类名.方法名的方式创建 public class HelloFactory { public static HelloWorld getInstance(){ return new Hello(); } } HelloWorldFactory.getInstance(); 2.2实例方法创建 采用ne

  • Spring Data MongoDB中实现自定义级联的方法详解

    前言 Spring Data MongoDB 项目提供与MongoDB文档数据库的集成,Spring与Hibernate集成时,Spring提供了org.springframework.orm.hibernate3.HibernateTemplate实现了对数据的CRUD操作, Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,包括对集成的对象映射文件和POJO之间的

  • Java如何提供给第三方使用接口方法详解

    目录 前言 接口Controller 接口幂等性校验 实现类ServiceImpl 第三方调用接口Api实现类 生成签名工具类 HttpCilent工具类 附:分享一个获取IP工具类 总结 前言 相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的接口,但是自己需要开发接口提供给第三方使用的场景应该不是很多,很多小伙伴可能会想不就开发一个接口对外开放嘛岂不是很简单,但是在开发接口对外开放,我们需要考虑一个问题,没

  • Java Spring Controller 获取请求参数的几种方法详解

    Java Spring Controller 获取请求参数的几种方法  1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交.若"Content-Type"="application/x-www-form-urlencoded",可用post提交 url形式:http://localhost:8080/SSMDemo/demo/addUser1?username=lixiaoxi&password=1

  • python实现TCP服务器端与客户端的方法详解

    本文实例讲述了python实现TCP服务器端与客户端的方法.分享给大家供大家参考.具体如下: TCP服务器程序(tsTserv.py): from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) tcpSerSock.bind(ADDR) tcpSerSock.liste

  • Spring Cloud 中@FeignClient注解中的contextId属性详解

    目录 @FeignClient注解中的contextId属性 解决方法一 解决方法二 FeignClient注解及参数问题 问题背景 解决办法 @FeignClient注解中的contextId属性 在使用@FeignClient注解前,我们需要先引入其相关依赖,版本为3.0.1 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter

随机推荐