😀前言
本篇博文是关于SpringCloud OpenFeign的基本介绍,希望你能够喜欢
🏠个人主页:晨犀主页
🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在此感谢啦😊
文章目录
- SpringCloud OpenFeign
- OpenFeign 介绍
- OpenFeign 是什么
- 官网
- Feign 和OpenFeign 区别
- Feign
- OpenFeign
- OpenFeign-应用实例
- 需求分析/图解
- 示意图
- 创建服务消费模块-通过OpenFeigen 实现远程调用
- 测试
- 注意事项和细节
- 日志配置
- 基本介绍
- 1.说明:
- 2.日志级别
- 配置日志-应用实例
- 测试
- 结果页面
- 别忘了,撤销测试日志配置
- OpenFeign 超时
- 先看一个问题
- 原因分析:
- 设置超时时间
- 测试
SpringCloud OpenFeign
OpenFeign 介绍
OpenFeign 是什么
- OpenFeign 是个声明式WebService 客户端,使用OpenFeign 让编写Web Service 客户端更简单
- 它的使用方法是定义一个服务接口然后在上面添加注解
- OpenFeign 也支持可拔插式的编码器和解码器。
- Spring Cloud 对OpenFeign 进行了封装使其支持了Spring MVC 标准注解和HttpMessageConverters
- OpenFeign 可以与Eureka 和Ribbon 组合使用以支持负载均衡
官网
官网地址:https://github.com/spring-cloud/spring-cloud-openfeign
Feign 和OpenFeign 区别
Feign
- Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端。
- Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。
- Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务。
- Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign。
- Feign本身不支持Spring MVC的注解,它有一套自己的注解。
- 引入依赖
OpenFeign
- OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
- OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口。
- OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
- 引入依赖
精简一句话:OpenFeign 就是在Feign 基础上做了加强, 有些程序员为了方便,说Feign 就是指的OpenFeign
OpenFeign-应用实例
需求分析/图解
示意图
创建服务消费模块-通过OpenFeigen 实现远程调用
- 参考member-service-consumer-80 创建member-service-consumer-openfeign-80(具体步骤参考以前)
- 修改pom.xml拷贝member-service-consumer-80 的pom.xml 内容,加入openfeign-starter
<!-- 引入openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
3.创建application.yml 内容如下:
server:
port: 80
spring:
application:
name: e-commerce-consumer-openfeign-80
#配置eureka-client
eureka:
client:
register-with-eureka: true #将自己注册到Eureka-Server
fetch-registry: true
service-url:
#表示将自己注册到哪个eureka-server
#这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka
- 创建主启动类com/my/springcloud/MemberConsumerOpenfeignApplication80.java
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberConsumerOpenfeignApplication80.class, args);
}
}
- 创建com/my/springcloud/service/MemberFeignService.java,注意:这里是OpenFeign 的核心
@Component
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {
//这里定义方法-就是远程调用的接口
/**
* 1. 远程调用的方式是get
* 2. 远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
* 3. MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
* 4. openfeign 会根据负载均衡来决定调用10000/10002-默认是轮询
* 5. 因为openfeign 好处是支持了springmvc注解 + 接口解耦
*/
@GetMapping("/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id);
}
- 创建com/my/springcloud/controller/MemberConsumerFeignController.java
@RestController
public class MemberConsumerFeignController {
//装配MemberFeignService
@Resource
private MemberFeignService memberFeignService;
@GetMapping(value = "/member/consumer/openfeign/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
return memberFeignService.getMemberById(id);
}
}
测试
- 浏览器输入: http://localhost/member/consumer/openfeign/get/1
- 观察访问的10000/10002 端口的服务是轮询的
注意事项和细节
- 配Openfeign的使用特点是微服务调用接口+@FeignClient , 使用接口进行解耦。
- @FeignClient(value = “MEMBER-SERVICE-PROVIDER”), 这里MEMBER-SERVICE-PROVIDER就是Eureka Server服务提供方注册的名称, 不要写
错了。 - 接口方法上: value是不能乱写, 远程调用的url 为http://MEMBER-SERVICE-PROVIDER/member/get/{id}
@GetMapping(value = "/member/get/{id}")
public Result<Member> getMembertById(@PathVariable("id") Long id);
日志配置
基本介绍
1.说明:
Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign 接口的调用情况进行监控和输出
2.日志级别
NONE∶默认的,不显示任何日志
BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
HEADERS∶除了BASIC中定义的信息之外,还有请求和响应的头信息;
FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
配置日志-应用实例
- 在member-service-consumer-openfeign-80 创建com/my/springcloud/config/OpenFeignConfig.java
@Configuration
public class OpenFeignConfig {
@Bean
public Logger.Level loggerLevel() {
return Logger.Level.FULL;
}
}
- 在member-service-consumer-openfeign-80 修改application.yml
常见的日志级别有5 种,分别是error、warn、info、debug、trace
error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
debug:用于开发DEBUG 的,关键逻辑里面的运行时数据;
trace:最详细的信息,一般这些信息只记录到日志文件中。
logging:
level:
#对MemberFeignService 接口调用过程打印信息-Debug
com.my.springcloud.service.MemberFeignService: debug
测试
浏览器: http://localhost/member/consumer/openfeign/get/1
结果页面
别忘了,撤销测试日志配置
OpenFeign 超时
先看一个问题
- 修改member-service-provider-10000/10002 的com/my/springcloud/controller/MemberController.java
@GetMapping("/member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
try {
TimeUnit.MILLISECONDS.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Member member = memberService.queryMemberById(id);
//使用Result把查询到的结果返回
if (member != null) {
//return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
return Result.success("查询会员成功 member-service-provider-10000", member);
} else {
return Result.error("402", "ID= " + id + "不存在");
}
}
2.浏览器访问http://localhost/member/consumer/openfeign/get/1
原因分析:
OpenFeign 默认超时时间1 秒钟,即等待返回结果1 秒
设置超时时间
说明: 在某些情况下,一个服务调用时间可能要超过1 秒,就需要重新设置超时时间
- 修改member-service-consumer-openfeign-80 的application.yml
ribbon:
#1. 设置feign客户端超时时间(openfeign默认支持ribbon)
#2. ReadTimeout: 8000: 建立连接从服务提供方获取可用资源的所用的全部时间
#3. 时间单位是毫秒
ReadTimeout: 8000
#两端连接所用时间
ConnectionTimeout: 8000
测试
- 浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问10000/10002
文章到这里就结束了,如果有什么疑问的地方请指出,诸大佬们一起来评论区一起讨论😁
希望能和诸大佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞