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

简介: 在此之前,各个微服务都是以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实现的,所以它自带了客户端负载均衡功能。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
存储 分布式计算 大数据
hadoop和spark的区别
学习hadoop已经有很长一段时间了,好像是二三月份的时候朋友给了一个国产Hadoop发行版下载地址,因为还是在学习阶段就下载了一个三节点的学习版玩一下。在研究、学习hadoop的朋友可以去找一下看看
4468 0
|
存储 前端开发 测试技术
DDD - 六边形架构和CQRS架构
DDD - 六边形架构和CQRS架构
1321 0
|
5月前
|
机器学习/深度学习 JSON 自然语言处理
小模型,大用途!用于结构化输出的小型语言模型
小型语言模型(SLM)通常被用于端侧推理,搜索推荐query改写这类对于资源要求低,大规模并发时延要求高的场景
260 0
|
6月前
|
存储 缓存 前端开发
http协议调试代理工具,Fiddler免费版下载,抓包工具使用教程
Fiddler是一款功能强大的HTTP协议调试代理工具,能记录并检查电脑与互联网间的HTTP通信,支持断点设置和数据编辑。相比其他网络调试器,Fiddler操作更简单且用户友好,支持查看Cookie、HTML、JS、CSS等文件内容。它还具备HTTPS抓包、过滤设置、统计页面总重量等功能,适用于安全测试与功能测试。通过插件扩展,用户可自定义视图或分析缓存行为。支持多种HTTP请求方法(如GET、POST等)及状态码分类(1xx-5xx),是开发者调试网络请求的得力工具。同类工具有HttpWatch、Firebug、Wireshark等。
591 1
|
11月前
|
存储 安全 Windows
电脑怎么格式化?格式化详细步骤
格式化是我们在日常使用电脑时可能会用到的一种操作,无论是清理磁盘空间、安装新系统,还是解决磁盘读写错误,都可能需要格式化。不过,对于一些不熟悉电脑操作的用户来说,格式化听起来可能有些复杂。其实,只要掌握正确的方法,格式化并没有那么困难。本文将带您了解什么是格式化,并一步步讲解如何格式化电脑。
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1322 2
|
数据采集 数据可视化 算法
基于Python flask的boss直聘数据分析与可视化系统案例,能预测boss直聘某个岗位某个城市的薪资
本文介绍了一个基于Python Flask框架的Boss直聘数据分析与可视化系统,系统使用selenium爬虫、MySQL和csv进行数据存储,通过Pandas和Numpy进行数据处理分析,并采用模糊匹配算法进行薪资预测。
495 0
基于Python flask的boss直聘数据分析与可视化系统案例,能预测boss直聘某个岗位某个城市的薪资
|
Kubernetes Cloud Native 应用服务中间件
对比 5 个开源网关项目,这家 SaaS 企业如何统一网关架构
对比 5 个开源网关项目,这家 SaaS 企业如何统一网关架构
45423 116
|
网络安全 NoSQL Redis
StackExchange.Redis使用配置
转自:http://www.cnblogs.com/deosky/p/4848403.html Configurationredis有很多不同的方法来配置连接字符串 , StackExchange.Redis 提供了一个丰富的配置模型,当调用Connect 或者 ConnectAsync 时需要传入。
2340 0