返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloudFeign的使用案例详解
  • 364
分享到

SpringCloudFeign的使用案例详解

SpringCloudFeign使用SpringCloudFeign 2023-02-09 12:02:51 364人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录Feign简介使用传参拓展配置超时、连接时间日志打印Feign简介 Feign是Netflix开发的⼀个轻量级RESTful的Http服务客户端(⽤它来发起请求,远程调⽤的),是

Feign简介

Feign是Netflix开发的⼀个轻量级RESTful的Http服务客户端(⽤它来发起请求,远程调⽤的),是以Java接⼝注解的⽅式调⽤Http请求,⽽不⽤像Java中通过封装HTTP请求报⽂的⽅式直接调⽤,Feign被⼴泛应⽤在spring cloud 的解决⽅案中。类似于dubbo,服务消费者拿到服务提供者的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。

Feign可帮助我们更加便捷,优雅的调⽤HTTP api:不需要我们去拼接url然后调⽤restTemplate的api,在SpringCloud中,使⽤Feign⾮常简单,创建⼀个接⼝(在消费者–服务调⽤⽅这⼀端),并在接⼝上添加⼀些注解,代码就完成了。

springCloud对Feign进⾏了增强,使Feign⽀持了springMVC注解(OpenFeign),本质:封装了Http调⽤流程,更符合⾯向接⼝化的编程习惯,类似于Dubbo的服务调⽤,Dubbo的调⽤⽅式其实就是很好的⾯向接⼝编程。

?它是声明性(注解)WEB服务客户端

要使用Feign,需创建一个接口并对其进行注解它是一个远程调用的组件(接口,注解)http调用的

?Feign集成了ribbon ribbon里集成了eureka

使用

与上篇文章ribbon的案例相似,也是客户端互相访问、互相帮助

实现:两个商家,一个中介,一个提供商,用户访问中介的接口,中介向提供商发送请求去制作

同样是创建两个client,之前创过就不走流程了

我这里创建了一个order-service-01和一个user-service-02

order-service-01: 提供商

配置文件配置:

server:
  port: 8080
spring:
  application:
    name: order-service
eureka:
  client:
    service-url:
      defaultZone: 你的远程eureka地址

启动类开启客户端

@EnableEurekaClient

编写一个出订单的controller

@RestController
public class OrderControll {
    @GetMapping("doOrder")
    public String doOrder(){
        return "正在制作面条";
    }
}

启动即可

user-service-02: 中介

关键依赖:

<!--        feign依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

配置文件application.yml:

server:
  port: 8081
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: 你的远程eureka地址

启动类开启服务

@EnableFeignClients:开启feign

@EnableDiscoveryClient
@EnableFeignClients

关键:创建接口类UserOrderfeign

需要调用提供商(order-service)的doOrder的接口即向下方代码编写即可


@FeignClient(value="order-service")
public interface UserOrderfeign {
    
    @GetMapping("doOrder")
    String doOrder();
}

编写controller实现类

直接引入编写的userOrderfeign即可直接调用提供商的接口

@RestController
public class UserControll {
    @Autowired
    public UserOrderfeign userOrderfeign;
    @GetMapping("userDoOrder")
    public String userDoOrder(){
        System.out.println("来客人了...");
        //发起远程调用
        String str=userOrderfeign.doOrder();

        return str;
    }
}

运行最终访问localhost:8081/userDoOrder页面就会显示提供商返回的内容了~

传参

需确保参数列表一致,返回值一致,方法签名一致

  • URL传参:参数列表使用@PathVariable
  • GET传参:参数列表使用@RequestParam
  • POST传参:参数列表使用@RequestParam或者Requestbody

基于上方案例继续使用

order-service控制器编写方法

URL拼接传参

//url拼接传参
    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name,@PathVariable("age")Integer age){
        System.out.println(name+":"+age);
        return "ok";
    }

GET传参

 //url传递一个参数
    @GetMapping("oneParam")
    public String oneParam(@RequestParam String name){
        System.out.println(name);
        return "ok";
    }

    //url传递多个参数
    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age){
        System.out.println(name);
        System.out.println(age);
        return "ok";
    }

POST传参

编写实体类order

这里用到了lambok实现自动添加有参无参set、get等方法

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {

    private Integer id;
    private String name;
    private Double price;
    private Date time;
}
//Post请求传递一个对象
    @PostMapping("oneObj")
    public String oneObj(@RequestBody Order order){
        System.out.println(order);
        return "ok";
    }

    //Post请求传递一个对象一个参数
    @PostMapping("oneObjOneParam")
    public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name){
        System.out.println(order);
        System.out.println(name);
        return "ok";
    }

调用

user-service的feign接口中编写控制类的传参方法

/url拼接传参
    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name, @PathVariable("age")Integer age);

    //url传递一个参数
    @GetMapping("oneParam")
    public String oneParam(@RequestParam String name);

    //url传递多个参数
    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false) String name,@RequestParam(required = false)Integer age);

    //Post请求传递一个对象
    @PostMapping("oneObj")
    public String oneObj(@RequestBody Order order);

    //Post请求传递一个对象一个参数
    @PostMapping("oneObjOneParam")
    public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name);

user-service控制器中编写方法调用

 @GetMapping("testParam")
    public String testParam(){
        String zt = userOrderFeign.testUrl("zt", 21);
        System.out.println(zt);

        String xzl = userOrderFeign.oneParam("xzl");
        System.out.println(xzl);

        String wf = userOrderFeign.twoParam("wf", 22);
        System.out.println(wf);

        Order order= Order.builder()
                     .name("牛排")
                     .price(188D)
                     .time(new Date())
                     .id(1)
                     .build();
        String s = userOrderFeign.oneObj(order);
        System.out.println(s);

        String param = userOrderFeign.oneObjOneParam(order, "dqf");
        System.out.println(param);

        return "ok";

    }

以上即可实现传参~

拓展

feign的默认等待时间是1s,超过1s就直接报错超时

配置超时、连接时间

Tip:feign只是封装了远程调用的功能 底层还是ribbon 所以需要修改ribbon的时间

#feign只是封装了远程调用的功能  底层还是ribbon 所以需要修改ribbon的时间
ribbon:
  ReadTimeout: 3000 #3s超时时间
  ConnectTimeout: 3000 #连接服务的超时时间

日志打印

编写日志功能有利于错误排查

日志级别

NONE:默认的,不显示任何日志;

BASIC:仅记录请求方法、URL、响应状态码及执行时间;

HEACIERS:除了BASIC中定义的信息之外,还有请求和响应的头信息

FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

在启动类application中编写


    @Bean
    public Logger.Level level(){
        return Logger.Level.FULL;
    }

配置文件中yml开启日志客户端

logging:
  level:
    com.pengke.userservice02.feign.UserOrderfeign: debug # 需要打印请求该接口的日志...

level下是feign接口的路径

这样即可实现用户访问该接口实现对应的日志打印相关信息

到此这篇关于Spring Cloud Feign的使用的文章就介绍到这了,更多相关Spring Cloud Feign的使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringCloudFeign的使用案例详解

本文链接: https://lsjlt.com/news/195329.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringCloudFeign的使用案例详解
    目录Feign简介使用传参拓展配置超时、连接时间日志打印Feign简介 Feign是Netflix开发的⼀个轻量级RESTful的HTTP服务客户端(⽤它来发起请求,远程调⽤的),是...
    99+
    2023-02-09
    Spring Cloud Feign使用 Spring Cloud Feign
  • CrashRpt使用案例详解
    CrashRpt介绍及简单应用 1、简介 CrashRpt是一个开源的第三方包,在程序出现未处理异常时,能够收集错误信息,并生成程序错误报告。CrashRpt可以将报告按照指定的方式...
    99+
    2024-04-02
  • MySql escape的使用案例详解
    MySQL转义 转义即表示转义字符原来的语义,一个转义字符的目的是开始一个字符序列,使得转义字符开头的该字符序列具有不同于该字符序列单独出现时的语义。 在sql like语句中,比如...
    99+
    2024-04-02
  • Vue使用Swiper的案例详解
    Vue使用Swiper看这一篇就够了 此案例实现需求 完成swiper动态异步数据下的slide渲染自定义分页器样式解决loop:true设置时的事件丢失问题swiper鼠标移入/移...
    99+
    2024-04-02
  • vue3 teleport的使用案例详解
    官网 https://cli.vuejs.org/zh/guide/ 有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分移动到 DOM 中 Vue app ...
    99+
    2024-04-02
  • SpringCloudFeign远程调用实现详解
    目录1. Feign远程调用1.1.Feign替代RestTemplate1.2.自定义配置1.2.1.配置文件方式1.2.2.Java代码方式2.Feign使用优化3. 最佳实践3...
    99+
    2022-11-13
    SpringCloud Feign SpringCloud Feign远程调用
  • IOS NSTimeInterval使用案例详解
    一 ios 获取时间间隔 想在程序开始或者进入某个界面 ,到结束程序或退出某个界面,获取到这个持续时间. 获取到这个时间还需要转化一个取得时分秒. -(NSString *)ge...
    99+
    2022-06-01
    IOS NSTimeInterval
  • Android GridLayout使用案例详解
    目录一、简介二、常用属性介绍三、平分问题四、小米计算器效果五、动态加载一、简介 GridLayout是Android4.0引入的网格布局,使用它可以减少布局嵌套。也算是常用,但一直没...
    99+
    2024-04-02
  • C# log4net使用案例详解
    这边先介绍简单的使用:在控制台输出和写入文件 首先添加log4net的nuget包 然后在app.config中添加配置项==configSections只能有一个,且是config...
    99+
    2024-04-02
  • Android ActivityManager使用案例详解
    前言 Activity可以获取运行中的应用信息,可以获取到servcie,process,app,memory,Task信息等。 获取信息 ActivityManager....
    99+
    2024-04-02
  • Android Handler使用案例详解
    什么是Handler? Handler可以发送和处理消息对象或Runnable对象,这些消息对象和Runnable对象与一个线程相关联。每个Handler的实例都关联了一个线程和线程...
    99+
    2024-04-02
  • C# PropertyGrid使用案例详解
    1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过Descripti...
    99+
    2024-04-02
  • C# AttributeUsage使用案例详解
    C# AttributeUsage的使用是如何的呢?首先让我们来了解一下什么是AttributeUsage类它是另外一个预定义特性类,AttributeUsage类的作用就是帮助我们...
    99+
    2024-04-02
  • Android VelocityTracker使用案例详解
       VelocityTracker顾名思义即速度跟踪,在android中主要应用于touch even。VelocityTracker通过跟踪一连串事件实时计算...
    99+
    2024-04-02
  • Android LayoutParams使用案例详解
    LayoutParams是什么? LayoutParams主要保存了一个View的布局参数,因此可以使用LayoutParams来改变布局参数从而达到View位置的效果,一般在自定义...
    99+
    2024-04-02
  • Java Date类的使用案例详解
    Date类表示特定的瞬间,精确到毫秒。 有2种方法可以创建Date对象(这里不考虑已过时的构造函数) 1、public Date()——分配 Date 对象并初始化此对象,以表示分配...
    99+
    2024-04-02
  • Android TextView的TextWatcher使用案例详解
    TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged. TextWa...
    99+
    2024-04-02
  • react 中 mobx的使用案例详解
    1.新建一个mobx.jsx文件 import { useContext } from "react" import MyContext from '../../utils/Cont...
    99+
    2023-05-15
    react mobx使用 react mobx
  • python中session的使用案例详解
    目录python中session的使用扩展:Selenium如何获取cookies保存起来用于下次访问一、获取cookie二、加载cookiepython中session的使用 使用...
    99+
    2023-05-19
    Selenium获取cookies Selenium获取cookies保存 python session使用
  • Java之Jackson使用案例详解
    序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作