广告位联系
返回顶部
分享到

OpenFeign服务接口调用的过程介绍

java 来源:互联网 作者:佚名 发布时间:2022-10-08 08:12:33 人浏览
摘要

OpenFeign服务接口调用 1、概述 Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。 Feign也支持可拔插式

OpenFeign服务接口调用

1、概述

Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。

Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。

Feign可以与Eureka和Ribbon组合使用以支持负载均衡

源码地址:https://github.com/spring-cloud/spring-cloud-openfeign

Feign能干什么

Feign旨在使编写Java Http客户端变得更容易。前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。

Feign集成了Ribbon

利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

Feign和OpenFeign两者的区别

Feign OpenFeign
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务
OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2、OpenFeign使用步骤

1、创建接口和使用注解@FeignClient

2、新建模块cloud-consumer-feign-order80

3、修改pom.xml依赖文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <artifactId>springcloud2022</artifactId>

        <groupId>com.zcl.springcloud</groupId>

        <version>1.0-SNAPSHOT</version>

    </parent>

    <modelVersion>4.0.0</modelVersion>

 

    <artifactId>cloud-consumer-feign-order80</artifactId>

 

    <properties>

        <maven.compiler.source>8</maven.compiler.source>

        <maven.compiler.target>8</maven.compiler.target>

    </properties>

 

    <dependencies>

        <!--openfeign-->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-openfeign</artifactId>

        </dependency>

        <!--eureka client-->

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

        </dependency>

        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->

        <dependency>

            <groupId>com.zcl.springcloud</groupId>

            <artifactId>cloud-api-commons</artifactId>

            <version>1.0-SNAPSHOT</version>

        </dependency>

        <!--web-->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-actuator</artifactId>

        </dependency>

        <!--一般基础通用配置-->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

            <scope>runtime</scope>

            <optional>true</optional>

        </dependency>

        <dependency>

            <groupId>org.projectlombok</groupId>

            <artifactId>lombok</artifactId>

            <optional>true</optional>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>

 

</project>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pA7pLsSP-1664844187557)(image/42、feign整合Ribbon.png)]

4、添加YAML配置文件

不将模块注册到Eureka服务中心

1

2

3

4

5

6

7

8

server:

  port: 80

 

eureka:

  client:

    register-with-eureka: false

    service-url:

      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

5、创建启动类

既然使用的是OpenFeign那必须使用@EnableFeignClients注解进行开启

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

package com.zcl.springcloud;

 

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.openfeign.EnableFeignClients;

 

/**

 * 描述:Feign项目启动类

 *

 * @author zhong

 * @date 2022-09-19 13:32

 */

@SpringBootApplication

@EnableFeignClients

public class OrderFeignMain80 {

    public static void main(String[] args) {

        SpringApplication.run(OrderFeignMain80.class, args);

    }

}

6、业务类

业务逻辑接口+@FeignClient注解完成服务调用,找指定微服务的实例和调用地址,访问的就是8001对外暴露的地址

主启动类上必须使用@EnableFeignClients注解进行激活开启

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

package com.zcl.springcloud.service;

 

import com.zcl.springcloud.entities.CommonResult;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.stereotype.Component;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

 

/**

 * 描述:Feign业务测试接口

 *

 * @author zhong

 * @date 2022-09-19 13:35

 */

@Component

@FeignClient(value = "CLOUD-PAYMENT-SERVICE")

public interface PaymentFeignService {

    /**

     * 根据id去调用

     * @param id

     * @return

     */

    @GetMapping("/payment/get/{id}")

    CommonResult getPaymentById(@PathVariable("id") Long id);

}

上面定义的接口其实就是服务提供者对外暴露的接口

7、创建控制器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.zcl.springcloud.controller;

 

import com.zcl.springcloud.entities.CommonResult;

import com.zcl.springcloud.entities.Payment;

import com.zcl.springcloud.service.PaymentFeignService;

import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RestController;

 

import javax.annotation.Resource;

 

/**

 * 描述:测试控制器

 *

 * @author zhong

 * @date 2022-09-19 14:11

 */

@Slf4j

@RestController

public class OrderFeignController {

 

    /**

     * 注入Feign业务接口

     */

    @Resource

    private PaymentFeignService paymentFeignService;

 

    /**

     * 测试调用服务接口

     * @param id

     * @return

     */

    @GetMapping("/consumer/payment/get/{id}")

    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {

        // 调用服务接口

        return paymentFeignService.getPaymentById(id);

    }

}

8、启动项目测试

  • 先启动7001、7002Eureka集群
  • 再启动8001、8002两个微服务提供者
  • 启动OpenFeign项目80
  • 调用接口访问http://localhost/consumer/payment/get/1

多请求两回会发现一样的有轮询负载均衡的效果

Feign自带负载均衡配置项

1

2

3

4

5

6

7

8

{

  "code": 200,

  "message": "查询成功,当前提供者端口号为:8002",

  "data": {

    "id": 1,

    "serial": "1515154151515"

  }

}

3、OpenFeign超时控制

1、在8001提供者上添加一个新的控制器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/**

 * 测试Feign程序访问停止三秒

 * @return

 */

@GetMapping("/feign/timeout")

public String paymentFeignTimeOut(){

    try {

        // 程序停止三秒

        TimeUnit.SECONDS.sleep(3);

    } catch (InterruptedException e) {

        e.printStackTrace();

    }

    return serverPort;

}

2、在消费者Feign80上添加接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

package com.zcl.springcloud.service;

 

import com.zcl.springcloud.entities.CommonResult;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.stereotype.Component;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

 

/**

 * 描述:Feign业务测试接口

 *

 * @author zhong

 * @date 2022-09-19 13:35

 */

@Component

@FeignClient(value = "CLOUD-PAYMENT-SERVICE")

public interface PaymentFeignService {

 

    /**

     * 测试请求三秒不响应接口

     * @return

     */

    @GetMapping("/payment/feign/timeout")

    String paymentFeignTimeOut();

}

3、在FeignOrder80消费者控制器上添加接口访问

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

 * 注入Feign业务接口

 */

@Resource

private PaymentFeignService paymentFeignService;

 

/**

 * 测试超时

 * @return

 */

@GetMapping("/payment/feign/timeout")

public String paymentFeignTimeOut()

{

    return paymentFeignService.paymentFeignTimeOut();

}

4、启动项目测试

  • 先自测访问提供者的业务是否正常:http://localhost:8001/payment/feign/timeout(等待三秒再响应结果)
  • 通过Feign-Order80消费者的接口测试调用提供者的访问是否正常:http://localhost/consumer/payment/feign/timeout

默认连接是1秒钟,程序设置了三秒导致连接超时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MhfmrywP-1664844187558)(image/43、Feign连接超时.png)]

后端超时报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4usrSfL-1664844187558)(image/44、后端超时.png)]

5、在YAML配置文件中开启超时连接

设置配置文件下面的ribbon连接时间后等待三秒访问正常不会再报错

1

2

3

4

5

6

7

8

9

10

11

12

13

14

server:

  port: 80

eureka:

  client:

    register-with-eureka: false

    service-url:

      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

 

#设置feign客户端超时时间(OpenFeign默认支持ribbon)

ribbon:

  #指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间

  ReadTimeout: 5000

  #指的是建立连接后从服务器读取到可用资源所用的时间

  ConnectTimeout: 5000

4、OpenFeign日志打印功能

Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。

就是对Feign接口的调用情况进行监控和输出

1、日记级别

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

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

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

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

2、配置日记级别配置类

注意不要导错包

返回的日记级别对应上面的4个

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

package com.zcl.springcloud.config;

 

import feign.Logger;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

 

/**

 * 描述:Feign日记级别配置

 *

 * @author zhong

 * @date 2022-09-19 15:27

 */

@Configuration

public class FeignConfig {

    @Bean

    Logger.Level feignLoggerLevel()

    {

        return Logger.Level.FULL;

    }

}

3、YAML配置文件开启日记信息打印

1

2

3

4

logging:

  level:

    # feign日志以什么级别监控哪个接口

    com.zcl.springcloud.service.PaymentFeignService: debug

启动羡慕测试输出内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2Fg4dyi-1664844187559)(image/45、Feign日记输出内容.png)]


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/baidu_39378193/article/details/127158944
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计