Feign对服务的声明式定义和调用

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 在此之前,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端,使用起来很不方便,需要了解URL,有时还需要拼装真正请求的URL。有没有一种用起来更方便、更优雅的方式吗?答案是肯定的,Spring Cloud想到了这些————Feign。Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。在Spring Cloud中使用Feign, 我们只需要通过创建接口并用注解来配置既可完成对Web服务接口的绑定,可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,

Spring Cloud Feign


在此之前,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端,使用起来很不方便,需要了解URL,有时还需要拼装真正请求的URL。有没有一种用起来更方便、更优雅的方式吗?答案是肯定的,Spring Cloud想到了这些————Feign。Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。在Spring Cloud中使用Feign, 我们只需要通过创建接口并用注解来配置既可完成对Web服务接口的绑定,可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,感知不到这是个HTTP请求,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现,实现透明化的负载均衡。

Feign是一个声明式Web Service客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

举一个栗子

下面,通过一个例子来展现Feign如何方便的声明对 eureka-service-provider服务的定义和调用。

  • 为之前的服务提供者 eureka-service-provider 代码增加 Feign 支持,在pom.xml文件中添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 创建一个Feign的客户端接口定义。使用 @FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,一般情况,我会把这些 Client 放到一个core项目里,此项目就是提供给客户端调用,比如下面的代码放到 eureka-service-core项目中:
import com.gemantic.commons.ResultData;
import com.gemantic.simulate.model.EntrustQueue;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient("eureka-service-provider")
public interface EntrustQueueClient {
    @PostMapping("/entrusQueue")
    ResponseEntity<ResultData> addEntrust(@RequestBody EntrustQueue entrustQueue);
}
  • 将上面定义的接口引入客户端,在客户端项目中的pom.xml文件中增加依赖
<!-- Fegin 自定义Client接口依赖 -->
<dependency>
    <groupId>com.xxx.demo</groupId>
    <artifactId>eureka-service-core</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<!-- Fegin 依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
  • 最后,在 main方法上增加注解 @EnableFeignClients
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
/**
 * Hello world!
 */
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class Server {
    public static void main(String[] args) {
        SpringApplication.run(Server.class, args);
    }
}
  • 客户端调用,调用本地方法一样的编码体验!通过对比发现是不是更方便、更优雅哈~
@Slf4j
@RestController
@Api(description = "模拟交易委托队列接口")
public class EntrustQueueController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private EntrustQueueClient entrustQueueClient;
    @ApiOperation(value = "新增加委托请求")
    @PostMapping("/entrusQueue")
    public ResponseEntity<ResultData> addEntrust(@RequestBody EntrustQueue entrustQueue) {
        log.info("entrusQueue" + entrustQueue.toString());
        ResultData resultData = restTemplate.postForObject("http://simulate-trade-service/entrusQueue", entrustQueue, ResultData.class);
        return  ResponseEntity.ok(resultData);
    }
    @ApiOperation(value = "新增加委托请求Feign")
    @PostMapping("/entrusQueueFeign")
    public ResponseEntity<ResultData> addEntrust2(@RequestBody EntrustQueue entrustQueue) {
        log.info("entrusQueueFeign:" + entrustQueue.toString());
        ResponseEntity<ResultData> resultData = entrustQueueClient.addEntrust(entrustQueue);
        return  resultData;
    }
}

在完成了上面你的代码编写之后,就可以把eureka服务注册中心、服务提供者(多启动几个,体验一下负载均衡)、服务消费者启动进行测试了。由于Feign是基于Ribbon实现的,所以它自带了客户端负载均衡功能。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
7月前
|
C++
C++程序中的类声明与对象定义
C++程序中的类声明与对象定义
71 1
|
7月前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
397 0
Java接口中可以定义哪些方法?
|
7月前
|
存储 编译器 C语言
声明,定义,初始化,实例化
声明,定义,初始化,实例化
96 0
C#中声明、初始化和实例化
C#中声明、初始化和实例化
101 0
|
7月前
|
C++
26类的声明和对象的定义
26类的声明和对象的定义
38 0
|
7月前
|
C++
c++将一个类的回调函数注入到另一个类中的方法
c++将一个类的回调函数注入到另一个类中的方法
|
负载均衡 前端开发 Java
Feign 踩坑指南 (接口返回泛型设置属性为null)
Feign 简介 Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
1927 0
Feign 踩坑指南 (接口返回泛型设置属性为null)
|
C#
C#中方法函数的声明和调用
C#中方法函数的声明和调用
170 0
|
负载均衡 Nacos
一起用feign来调用接口(有源码)
nacos很好的兼容了feign,feign默认集成了Ribbon,所以Nacos下使用Feign就默认实现了负载均衡 一、测试结果
133 0
一起用feign来调用接口(有源码)
|
Dubbo 应用服务中间件 容器
问题记录:Dubbo服务实现类的成员变量未初始化问题
开发时碰到了一个这种问题:在类中定义了三个boolean类型的成员变量,这个类是Dubbo的服务实现类,也就是在类上使用DubboService注解的类,笔者在这个类里面声明了三个boolean类型的成员变量,默认初始值都是false,但是当程序进入到方法以后,还没开始操作这三个变量,其中有两个就变成了true,然后笔者不得不在方法内从新给他们初始化一次,因为这个问题导致了程序的流程出现了问题,因为笔者是使用他们来控制一个流程走向的。
96 0