springboot 中使用 openfeign 进行接口调用

本文介绍了如何在Spring Cloud项目中使用OpenFeign进行服务调用,以及如何实现服务熔断以提高系统的容错性。首先,对比了Feign和OpenFeign的区别,指出OpenFeign支持Spring MVC注解,简化了接口调用。接着,通过创建服务提供方和服务调用方的实例,演示了OpenFeign的基本用法。在服务调用方,当服务提供方不可用时,通过配置Hystrix实现服务熔断,返回友好的错误信息。最后,讲解了如何配置日志以更好地监控调用过程。

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

在项目开发过程中,我们开发的项目或多或少都会与其他交互的系统进行对接集成,或者是微服务项目之间进行调用,双方相互调用接口来获取或者传递数据,以往我们使用的方式可能有 httpClient、okhttp、httpUrlConnection 等等,今天来学习一下如何使用 openfeign 来进行调用。

一、feign 和 openfeign ?

Feign 是 Springcloud 组件中的一个轻量级 Restful 的 HTTP 服务客户端,Feign 内置了 Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign 的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign 是 springcloud 在Feign的基础上支持了 SpringMVC 的注解,如 @RequestMapping 等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

二、为什么要使用 openfeign ?

1、Feign 本身不支持 Spring MVC 的注解,它有一套自己的注解
2、Fegin 是 Netflix 公司产品,停止更新了。
3、使用 OpenFeign 可以简化项目之间接口的调用,我们不需要关心 http 调用的代码

三、创建一个简单的服务提供方

创建一个基本的 springboot 项目

1、引入基础依赖

	<dependencies>
		<dependency>
			<groupId> org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

2、application.yml 配置文件

server:
  port: 8081

3、创建一个 controller

@RestController
@RequestMapping("/demo")
public class FeignDemoController {


    @GetMapping("/test")
    public String test(){
        return "hello openfegin";
    }

}

4、启动服务

四、服务调用方 openfeign 调用服务提供方

创建一个基本的 springboot 项目

1、引入相关依赖

这里要注意springboot 和 springCloud 版本
当前 springboot 版本 2.3.4.RELEASE
springcloud 版本 Hoxton.SR4

	<properties>
		<java.version>1.8</java.version>
		<spring.cloud-version>Hoxton.SR4</spring.cloud-version>
	</properties>

	<dependencies>

		<dependency>
			<groupId> org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

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


	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring.cloud-version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

2、启动类中增加注解

开启 feign 功能

@SpringBootApplication
@EnableFeignClients
public class OpenfeginApplication {

	public static void main(String[] args) {
		SpringApplication.run(OpenfeginApplication.class, args);
	}

}

3、编写客户端调用接口

@FeignClient 标注该类是一个feign接口
name:因为这里并未进行服务注册,所以就随便命名一个
url:被调用的服务提供方的接口地址

@FeignClient(name = "demo",url = "http://localhost:8081/demo")
public interface FeginDemo {


    @GetMapping("test") //被调用接口的请求类型
    String test();

}

4、测试调用服务端提供端接口

@RestController
@RequestMapping("/feginDemo")
public class FeginDemoController {

    @Autowired
    FeginDemo feginDemo;


    @GetMapping("/test")
    public String test(){
        String test = feginDemo.test();
        return test;
    }

}

5、测试

启动项目,访问 http://localhost:8080/feginDemo/test

在这里插入图片描述
接口调用成功!
那么这里呢,我们就实现了通过 openfeign 完成一次简单的接口调用,如果没有使用 openfeign 这里的调用我们就只能通过 httpclient、okhttp 等方式来调用了,使用了 openfeign 之后,你会发现,调用别人的接口竟是如此简单。

五、openfeign 服务熔断

在调用接口过程中,由于是调用别人接口,肯定会存在一些意外因素,比如被调用的服务提供方系统宕机了,访问不到了等情况,如下
比如我停止 被调用的服务提供方,再去进行调用

在这里插入图片描述

那么这个时候我们就需要用到服务熔断了,在对方服务异常的时候,返回这个信息肯定不太友好,我们来让它稍微友好一些

openfeign 中默认集成了 Hystrix

在这里插入图片描述

1、在 application.yml 配置文件中开启

feign:
  hystrix:
    enabled: true

2、配置 fallback 的处理类

创建一个类,实现我们的 FeginDemo ,然后实现接口中的方法,进行重写

@Component
public class ErrorMessage implements FeginDemo {

    @Override
    public String test() {
        return "服务器开小差了哦,请稍后再试";
    }
}

3、改造 feignClient

fallback:配置刚才的实现类 ErrorMessage

@FeignClient(name = "demo",url = "http://localhost:8081/demo",fallback = ErrorMessage.class)
public interface FeginDemo {


    @GetMapping("test")
    String test();

}

4、测试熔断效果

重新启动一下服务
再进行访问

在这里插入图片描述

对于用户来说,这样是不是更加友好一点了呢?总比你一连串的英文往人家脸上呼来的好吧

六、配置日志

1、配置项目日志级别

logging:
  level:
    com.wxw.openfeign: debug

2、配置 openfeign 日志级别

@Configuration
public class FeignLogConfiguration {
//    NONE:不记录任何日志信息,这是默认值。
//    BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
//    HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
//    FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

3、配置日志类

@FeignClient(name = "demo",url = "http://localhost:8081/demo",
fallback = ErrorMessage.class,configuration = FeignLogConfiguration.class)
public interface FeginDemo {


    @GetMapping("test")
    String test();

}

4、调用之后查看日志

在这里插入图片描述

### 配置 OpenFeign 和 Eureka 实现微服务间通信 #### 创建 Eureka Server 为了使微服务能够互相发现并调用,首先需要设置一个Eureka服务器作为服务中心。这可以通过创建一个新的Spring Boot应用程序来完成,并在其启动类上添加特定的注解。 ```java package cn.juwatech.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } ``` 这段代码定义了一个简单的Eureka服务器应用[^3]。 #### 启动类启用 Feign Clients 对于想要利用Feign客户端发起HTTP请求的服务提供者,在其主程序入口处应加入`@EnableFeignClients`注解以激活Feign功能。此操作使得Spring Boot能够在编译期间查找标记有`@FeignClient`的接口,并自动生成相应的代理实例用于后续的服务调用。 ```java // 假设这是另一个项目的启动类 @SpringBootApplication @EnableFeignClients(basePackages = "com.example.feignclients") // 指定Feign Client所在的包名 public class ServiceAApplication { public static void main(String[] args) { SpringApplication.run(ServiceAApplication.class, args); } } ``` 上述配置允许开发者仅需关注业务逻辑层面的方法签名设计,而不必关心底层网络细节[^4]。 #### 编写 Feign 接口 接着,在指定的基础包下声明具体的Feign客户端接口: ```java package com.example.feignclients; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name="service-b", url="${service.b.url}") // 或者不填url让Eureka自动解析名称对应的服务地址 public interface ServiceBClient { @GetMapping("/api/data") String getDataFromServiceB(); } ``` 这里定义了一个名为`service-b`的目标服务以及获取数据的具体API路径。当实际运行时,Feign会依据所给的名字去查询Eureka注册表中的记录从而定位目标服务的位置[^5]。 #### 应用属性文件配置 最后一步是在各个参与方的应用配置文件(application.properties或application.yml)里补充必要的参数设定,比如告知它们连接至哪个Eureka server等信息: ```yaml spring: application: name: service-a # 当前服务名字 server: port: 8081 eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka/ logging: level: ROOT: INFO ``` 以上就是整个流程的大致介绍,通过这种方式可以方便快捷地构建起基于Spring Cloud生态系统的分布式系统架构[^2]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值