上面我们可以看到,我们进行微服务调用,不管是使用get 或者post 方法,带有参数过多就会导致代码变得很臃肿,所以我们就可以使用同样是netflix 推出的Feign 来简化微服务调用,Feign 结合了Ribbon 以及Hystrix.Ribbon的功能它都有,并且还进行了封装,更加方便我们使用。所以我们使用的时候,只用引入 Feign 的依赖就可以。
那我们现在对上面的这些进行调整一下。
pom.xml在我们的ribbon-consumer 的pom 文件中删除ribbon 的依赖,增加feign 的依赖。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> 增加@EnableFeignClients在启动类中增加@EnableFeignClients 注解
在启动类中增加了@EnableFeignClients 注解,就可以在项目中使用Fegin 啦,那我们怎么使用呢?
其实还要使用@FeignClient 注解,这个注解是在具体的应用中注入的,用来指定服务提供者的服务名称。并且这个注解只能作用 interface 上。
前面我们调用服务提供者的接口需要写url,参数,返回类型等等非常的繁琐,所以Fegin 就帮我们进行了简化,让我们调用服务提供者的接口,可以像自身调用一样,非常放方便。 HelloService
我们来创建一个HelloService 的接口。内容如下
@FeignClient("ribbon-provider") public interface HelloService { @RequestMapping("/hello") public String hello(); @RequestMapping("/hello2") public String hello2(@RequestParam(value = "name") String name); @RequestMapping("/hello3") public String hello3(@RequestParam(value = "name") String name,@RequestParam(value = "age") String age); @RequestMapping("/hello4") public String hello4(@RequestBody Map<String, Object> parms); }可以看到,上面的接口内容主要是针对服务提供者暴露出的几个接口进行调用。
对比服务消费者中的接口,和服务提供者中的接口,可以发现其实是服务提供者中的接口对消费者中的HelloService 的实现。这个待会再说。从HelloService 中我们可以看到,我们调用服务提供者的接口一样的采用@RequestMapping,@RequestParam,@RequestBody来操作,这样更加简洁和方便。 FeginController
我们再创建一个FeginController 来测试一下,内容如下:
@RestController public class FeginController { @Autowired public HelloService helloService; @RequestMapping("/fegin") public String getHello(){ return helloService.hello(); } @RequestMapping("/fegin2") public String getHello2(){ String; return helloService.hello2(name); } @RequestMapping("/fegin3") public String getHello3(){ String; String age="18"; return helloService.hello3(name,age); } @RequestMapping("/fegin4") public String getHello4(){ Map<String, Object> parms=new HashMap<>(); parms.put("name","quellanan"); parms.put("age","18"); return helloService.hello4(parms); } }可以看到就是普通的controller层调用service 层。
测试好了我们现在来测试一下。
分别输入如下地址来看看效果:
好了,来说最后一个问题,刚刚上面我们说了服务消费者中的HelloService 和服务提供者的HelloController很像,感觉像是HelloController 实现了HelloService 。不错,当我们正式开发的时候,会发现接口调用非常多,并且也很复杂,如果按照上面的方式来的话,会存在很多的重复代码且很容易出错,所以我们可以将服务调用单独提取成一个模块么,然后分别在服务提供者和服务消费者中引入其依赖,然后在消费中的HelloService 继承其对应的接口。而在服务提供者中实现其对应的接口。当然@FeignClient还是在服务消费者之中的。
这里只是提供了一种思路,没有给出实现方式,感兴趣的可以看看《Spring cloud 微服务实战》,也可以和我讨论下嘿嘿。
番外总算是写完了,算是对ribbon 和fegin 有了一些了解,最起码现在可以使用他们,并将其使用到到项目中没有什么问题啦。
代码上传到github:
https://github.com/QuellanAn/springcloud
后续加油♡
很荣幸,今年参加了CSDN博客之星评选活动,帮忙投下票,可以投5票 ,谢谢您
CSDN博客之星评选活动
最后啦,
欢迎大家关注个人公众号 "程序员爱酸奶"
分享各种学习资料,包含java,linux,大数据等。资料包含视频文档以及源码,同时分享本人及投递的优质技术博文。
如果大家喜欢记得关注和分享哟❤