当前位置: 首页 > news >正文

白话文实战OpenFeign

远程调用-声明实现

OpenFeign是SpringCloud用来做远程调用的组件,官方定义是Declarative REST Client,翻译过来就是声明式 REST 客户端,而REST客户端就是能发送HTTP请求实现远程调用的工具,其实我们上一篇博客讲解Nacos远程调用中心的时候,用过一个RestTemplate,它就是可以发送HTTP请求的工具,不过我们一般认为它是编程式的,所谓的编程式就是整个远程调用的流程需要自己手动编码,回顾以前,我们要做的第一步使用DiscoveryClient先获取到对方微服务所有的地址列表,第二步在这个地址列表中随便挑一个(负载均衡策略),第三步挑到的地址使用RestTemplate给这个地址发送请求,第四步得到对方响应的数据。这样做起来会感觉有点麻烦,那声明式的意思就是你无需编码整个流程,只需要通过一些简单的注解,明确的告诉OpenFeign你想给哪发请求、请求方式是什么、想携带什么样的数据、想得到什么样的结果,把这些规则说清楚,OpenFeign就会按照这些规则自动的给远程发送请求,所以使用OpenFeign期间就需要熟悉相关的注解:
在这里插入图片描述
可以看出请求方式和携带参数的注解OpenFeign使用的是SpringMVC的这一套,这样就减少了学习负担,接下来进行测试一下OpenFeign的远程调用流程。

还是之前这个流程,这次我们用OpenFeign替换RestTemplate,从订单服务给商品服务发起远程调用:
在这里插入图片描述
实际我们只要知道要给哪发请求,怎么发就可以了。

使用OpenFeign的流程,先要在项目中引入依赖:

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

这个我们之前已经在功能services中引入过了。

还是以订单为例,controller里面有个请求叫创建订单,第一步有个请求先从远程获取到商品数据(完整代码参考上一篇博客):

Product product = getProductFromRemoteWithLoadBalancerAnnotation(productId);

上一篇博客实现是通过restTemplate:

    // 进阶3:基于注解的负载均衡
    private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId) {
   
        // restTemplate在请求时会动态的把url上微服务名称替换成负载均衡ip
        String url = "http://service-product/product/"+productId;
        //2. 给远程发送请求,service-product会被动态替换
        return restTemplate.getForObject(url, Product.class);
    }

要使用OpenFeign也非常简单,引入依赖后,

第一步:在订单服务里面,开启OpenFeign的远程调用功能

@EnableFeignClients // 开启Feign远程调用功能
@EnableDiscoveryClient // 开启服务发现功能
@SpringBootApplication
public class OrderMainApplication {
   
    public static void main(String[] args) {
   
        SpringApplication.run(OrderMainApplication.class, args);
    }
 }

第二步:编写一个远程调用客户端
在这里插入图片描述

package com.example.order.feign;

import org.springframework.cloud.openfeign.FeignClient;

@FeignClient // Feign客户端
public interface ProductFeignClient {
   
}

接下来就看给哪发请求以及怎么发了,比如我们想要获取到商品数据,我们先要给service-product发请求,因为商品服务可能启动了多个,到底要给哪个服务器哪个端口发,还不一定,以前我们还要去注册中心拿它的地址,有了Feign,这些都是Feign自动做的,想要让Feign自动做,很简单,只要给@FeignClient上面加上对方微服务的名字,此时这个客户端就明确了是用来调用商品服务的,接下来我们准备一个根据商品id获取商品数据的方法,该方法上面写一个@GetMapping注解,可以看出就是SpringMVC的注解,如果这个注解标注在Controller上,它就是用来接收Get请求,如果标注在Feign客户端上,它就是用来发送Get请求,代码如下:

package com.example.order.feign;

import com.example.product.bean.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(value = "service-product") // Feign客户端
public interface ProductFeignClient {
   
    // mvc注解的两套使用逻辑
    // 1. 标注在Controller上,是接收这样的请求
    // 2. 标注在FeignClient上࿰

相关文章:

  • 基于opencv的 24色卡IQA评测算法源码-可完全替代Imatest
  • SpringBoot 集成 Caffeine 实现本地缓存
  • WPF创建自定义类和控件及打包成dll引用
  • 2.10 Playground Chat提示工程实战:从交互调试到企业级应用的全链路指南
  • 驱动开发、移植(最后的说法有误,以后会修正)
  • 【Apache Paimon】-- 16 -- 利用 paimon-flink-action 同步 kafka 数据到 hive paimon 表中
  • Linux环境下安装mkcert
  • Python--正则表达式
  • SAP-ABAP:SAP中REPORT程序和online程序的区别对比
  • Modbus通讯协议
  • YOLOv5-Seg 完全指南:从训练到后处理
  • 阅读论文笔记《Efficient Estimation of Word Representations in Vector Space》
  • YOLOV8的学习记录(二) yolo8的几个内置模型简介
  • RabbitMQ介绍以及基本使用
  • 小米平板怎么和电脑共享屏幕
  • c++--静态联编--动态联编
  • 动态库与静态库:深入解析与应用
  • CAS单点登录(第7版)12.密码管理
  • CANopen 基础
  • 13 责任链(Chain of Responsibility)模式
  • 商务部再回应中美经贸高层会谈
  • 首届上海老年学习课程展将在今年10月举办
  • 菲护卫艇企图侵闯中国黄岩岛领海,南部战区:依法依规跟踪监视、警告驱离
  • 明查|这是“C919迫降在农田”?实为飞机模型将用于科普体验
  • 个人住房公积金贷款利率下调,100万元30年期贷款总利息将减少近5万元
  • 马斯克的胜利?OpenAI迫于压力放弃营利性转型计划