SpringCloud——OpenFeign详解

目录

 

一、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 

 

 

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Cloud是一个为开发者提供了快速构建分布式系统的工具集,其中非常重要的一部分就是OpenFeignOpenFeign是一个声明式、模板化的HTTP客户端,它可以让开发者更加方便的调用HTTP接口。下面我们来详细了解一下Spring Cloud整合OpenFeign的使用方式。 首先,我们需要在pom.xml文件中添加依赖,如下所示: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>{版本号}</version> </dependency> ``` 然后,我们需要在启动类上添加@EnableFeignClients注解,表示开启Feign客户端自动配置。同时,我们还需要通过@FeignClient注解来定义接口。例如: ``` @FeignClient(name = "user-service") public interface UserFeignClient { @GetMapping("/user/findById") User findById(@RequestParam("id") Long id); } ``` 在上面的代码中,@FeignClient注解中的name属性表示调用的服务名,而接口中的findById方法就是定义的远程调用的接口。其中,@RequestParam注解表示使用@RequestParam方式传参。 最后,我们在业务代码中使用定义的接口即可。例如: ``` @RestController public class UserController { @Autowired private UserFeignClient userFeignClient; @GetMapping("/findUser") public User findUser(Long id) { return userFeignClient.findById(id); } } ``` 通过以上步骤,我们就可以方便地使用OpenFeign来调用HTTP接口,实现微服务之间的远程调用。整合OpenFeign有很多细节需要注意,例如如何处理调用异常、如何配置重试等等。但总体来说,Spring Cloud整合OpenFeign使用起来非常简单,是我们构建分布式系统的重要利器之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

swttws.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值