Spring Cloud Alibaba系列(三)使用feign进行服务调用

什么是Feign

Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一天注解即可。

Nacos很好的兼容了Feign,Feign默认默认继承了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡的效果。

Ribbon支持的负载均衡策略

负载均衡就是将请求分摊给多个实例进行进行处理。

根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。

客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。

我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule,具体的负载策略如下图所示:
image.png

如何使用Feign

我们使用第一章中的nacos-discovery-server作为服务提供者,提供了一个“/hello”的接口。新建一个alibaba-client-feign的服务作为消费者。

  1. pom文件中假如openfeign的依赖

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>

  2. 在启动类上加上支持feign的注解

@EnableFeignClients // 开启feign

  1. 创建一个feign客户端并使用feign调用微服务

    @RestController
    class TestController{
    @Autowired
    Client client;
    @GetMapping("/test")
    String test(){


return client.hello("hahaha");
}
}

@FeignClient(name="nacos-discovery-server")
interface Client{
@GetMapping("/hello")
String hello(@RequestParam String name);
}

注意:在实际开发中,feign客户端都是写在公共模块当中,哪个服务需要调用引入公共模块即可。

Feign的两种实现方式

  1. 第一种就是本文中介绍的,Feign和生产者的RequestMapping保持一致
  2. 第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。

注意点

  1. 请求参数为对象是,使用@requestbody
  2. 请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")
  3. 请求参数用@pathVariable接收时,必须加上value属性,如@pathVariable("name")
1.1k 声望
6.1k 粉丝
0 条评论
推荐阅读
这份github上被14万人点赞的Java教程太强了
前几天有个小伙伴加我之后问了下面的这个问题。我看到后是一脸懵逼的状态,jcombobox?实话说,我已经完全忘了在Java中还有这么个东西。

Java旅途4阅读 1.8k

15分钟入门23种设计模式:图解,范例和对比
本文力图在15分钟内,通过UML图解、范例和类比,让你对面向对象的23种设计模式形成提纲挈领的认识,从而让我们在面临代码设计问题时更加成竹在胸。本文源代码: UML, Sample Code。

风云信步5阅读 482评论 1

微服务架构下使用Jenkins自动化部署
在微服务架构中,随着服务越来越多,服务的打包部署就会成为一个相当麻烦的事情。比如说我的ccos项目目前就有10个服务需要部署,有没有什么办法让我们部署一次之后,只要点击执行就可以自动部署呢?当然有!下面...

startshineye1阅读 4k

Golang如何优雅接入多个远程配置中心?
本地配置文件的接入能很快速的完成,那么对于远程apollo配置中心的接入,是否也能很快速完成呢?如果有多个apollo实例都需要接入,是否能支持呢?以及apollo远程配置变更后,是否能支持热加载,实时更新呢?

王中阳Go1阅读 999

封面图
Dubbo架构设计与源码解析(三)责任链模式
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传...

京东云开发者3阅读 595

封面图
麒麟操作系统 (kylinos) 从入门到精通 - 研发环境 - 第二十一篇 C++/C语言开发环境搭建
类别:笔记本型号:中国长城 NF14C硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,c++,c,内核飞腾,arm

码上世界1阅读 2.5k评论 1

封面图
WGCLOUD的指令下发和自定义监控项有什么区别
WGCLOUD监控系统有两个功能模块:指令下发和自定义监控项话说,WGCLOUD确实一款非常优秀的运维监控软件,轻量且性能好言归正传,那么它们两个有什么区别呢1、指令下发指令下发可以执行任何指令或者脚本,由agent...

一往情深1阅读 593

1.1k 声望
6.1k 粉丝
宣传栏