SpringCloud——OpenFeign详解

本文详细介绍了如何使用OpenFeign在Spring Cloud Eureka架构下进行服务调用,包括Eureka服务注册、Provider服务提供者搭建、Consumer服务消费者实例,以及超时控制的配置和测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

一、OpenFeign介绍

1、概念

2、作用

3、架构图

二、OpenFeign案例

         1、案例说明

2、搭建Eureka服务端

(1)创建maven工程

(2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)启动Eureka注册中心

 3、搭建服务提供者Provider80

(1)创建maven工程

(2)导入依赖

(3)配置application.yml

(4)创建启动类

(5)创建controller

  4、搭建服务提供者Provider81(复制80端口)

(1)点击下方service

(2)复制端口

 (3)测试服务Provider81

​  5、搭建服务消费者Consumer83(重点)

(1)创建maven工程

 (2)导入依赖

(3)配置application.yml

(4)创建主启动类

(5)创建远程调用服务接口

(6)创建controller

6、测试案例

三、OpenFeign超时控制

1、超时控制概念

2、模拟超时报错

(1)服务提供方Provider80写超时方法(controller)

(2)服务消费者Consumer83添加远程调用方法(Service)

(4)测试

3、Feign通过配置文件可以控制超时时间

(1)配置服务消费者Consumner83的application.yml

(2)测试


 

一、OpenFeign介绍

1、概念

Feign是一个声明式web服务客户端,只需要创建一个接口并添加注解,即可实现远程调用服务。

2、作用

 ①服务消费者在远程调用时,只需通过编写一个接口,并表上注解进行配置,即可实现对服务提供方接口的绑定。

②Feign集成Ribbon,Feign利用Ribbon维护服务提供方列表,实现轮询调用服务提供者。

3、架构图

a5e0b9fc72c648c5ba3cb4264342b20d.png 

二、OpenFeign案例

1、案例说明

一个Eureka注册中心,两个服务提供者Provider80、Provider81,实现同一功能,一个服务消费者Consumer82,如下图:

6099e07e4bd54cfbaeea2bf0351e9113.png 

2、搭建Eureka服务端

(1)创建maven工程

ef9d8d6fd35e463fa53276c1eaff3587.png

 (2)导入依赖

导入Eureka服务端、web模块依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <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>
    </dependencies>

(3)配置application.yml

①服务端口为7001;

②Eureka服务端主机名;

③Eureka客户端:

register-with-eureka:是否在服务中心注册

fetchRegistry:是否可以在注册中心被发现

service-url:服务中心url地址

server:
  port: 7001

eureka:
  instance:
    hostname: localhost

  client:
    register-with-eureka: false
    fetchRegistry: false
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建主启动类

@EnableEurekaServer:Eureka服务端注解

@SpringBootApplication
@EnableEurekaServer
public class Eureka7001 {
    public static void main(String[] args) {
        SpringApplication.run(Eureka7001.class,args);
    }
}

(5)启动Eureka注册中心

访问http://localhost:7001

78ca559626be4fbfbcb6b62d630f5d70.png

 3、搭建服务提供者Provider80

(1)创建maven工程

73dae138417a427f9a7d28d39fa30ca0.png

 

(2)导入依赖

导入Eureka客户端、web模块、监控依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <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>
 </dependencies>

 (3)配置application.yml

①配置服务端口号为80;

②配置服务应用名称;

③配置Eureka注册中心,开启注册,指明注册中心地址。

server:
  port: 80

spring:
  application:
    name: provider

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建启动类

@EnableEurekaClient:指明该服务为Eureka客户端

@SpringBootApplication
@EnableEurekaClient
public class Provider80 {
    public static void main(String[] args) {
        SpringApplication.run(Provider80.class,args);
    }
}

(5)创建controller

@RestController
public class FeignController {
    @Value("${server.port}")
    private String port;

    @GetMapping("/provider")
    public String hello(){
        return "访问端口号为:"+port;
    }
}

  4、搭建服务提供者Provider81(复制80端口)

由于Provider81服务和Provider8005服务内容一样,我们可以直接通过复制端口启动80服务,这就是上方controller为什么返回端口号原因,具体步骤如下:

(1)点击下方service

7ab17b216f434cce9b5b37299690116e.png

 

若下方没有service,可以到View打开,如下图:

071d523b980a461f89e3385fc5afb084.png

ac4d4eae979d4bf58fe5ae1f99e9a4df.png cdeee1cce85b43df9cbf3ba5c143363c.png

(2)复制端口

-Dserver.port指明复制后的端口号

 cda2414b58694627bf8e2d9f21a8db17.png

 f42419a56f594af89524852aa5c60a5e.png

 (3)测试服务Provider81

访问http://localhost:81/provider

c0ef4be668404e2c8bc21324b7e635ba.png  5、搭建服务消费者Consumer83(重点)

(1)创建maven工程

da181a0a7f1c44899969df9c97d90959.png

 (2)导入依赖

引入OpenFeign、Eureka、web,服务监控依赖

<dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <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>
</dependencies>

(3)配置application.yml

①配置服务·端口号为83;

②配置服务名称为:Consumer83;

③配置Eureka客户端,开启注册。配置注册中心地址。

server:
  port: 83
spring:
  application:
    name: consumer83
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建主启动类

开启Eureka客户端,远程条用Feign客户端

@EnableEurekaClient
@SpringBootApplication
@@EnableFeignClients
public class Consumer83 {
    public static void main(String[] args) {
        SpringApplication.run(Consumer83.class,args);
    }
}

(5)创建远程调用服务接口

①@FeignClient注解,指定远程调用的服务名称,服务提供者Provider80、Provider81对应名称为:provider。

②接口中方法为:调用服务的controller方法。

@Component
@FeignClient(value = "PROVIDER")
public interface FeignService {
    //调用远程接口
    @GetMapping("/provider")
    public String hello();
}

(6)创建controller

通过远程接口调用服务。

@RestController
public class FeignController {
    //调用远程服务接口
    @Autowired
    private FeignService feignService;

    @GetMapping("consumer")
    public String hello(){
        //调用接口
        return feignService.hello();
    }
}

6、测试案例

①启动Eureka7001;

②启动服务提供者Provider80,Provider81

③启动服务消费者Consumer83

访问http://localhost:83/consumer,默认轮询策略

第一次请求 

6c28b5a8bb134aec83818da09bb62e8c.png

第二次请求 

3886239ae0234c81b689b957ab599407.png 

三、OpenFeign超时控制

1、超时控制概念

默认情况下,Feign客户端只等待一秒钟,一秒后服务提供者未作出响应,服务消费者则会报错。

2、模拟超时报错

(1)服务提供方Provider80写超时方法(controller)

调用TimeUnit让进程睡眠3秒,模拟超时

 @GetMapping("timeout")
    public String timeout(){
        try {
            //睡眠3秒
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello";
    }

(2)服务消费者Consumer83添加远程调用方法(Service)

@GetMapping("timeout")
public String timeout();

(3)服务消费者Consumer83添加远程调用方法(Controller)

 @GetMapping("time")
    public String time(){
        return feignService.timeout();
    }

(4)测试

依次启动Eureka7001、Provider80、Consumer83;

访问http://localhost:83/time;

发现超时报错 

2caaf605b52247d2b956518f3eb22a42.png 

3、Feign通过配置文件可以控制超时时间

(1)配置服务消费者Consumner83的application.yml

设置客户端超时时间为4秒

ribbon:

  ReadTimeout:  4000

  ConnectTimeout: 4000

  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用

  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用

  OkToRetryOnAllOperations: false  #是否所有操作都重试

 (2)测试

访问:http:localhost:83/time

等待3秒后访问成功 

f97d06ffc0b84d2e8714e5514a8b4f55.png 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值