下一篇 :10. 服务降级 - Hystrix - 引出问题
文章目录
声明:原文作者:CSDN:yuan_404
1 . 概述
1.1 是什么
- GitHub :https://github.com/spring-cloud/spring-cloud-openfeign
Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。
Feign 也支持可插拔式的编码器和解码器。
Feign 和 Open Feign 本质差不多,只不过 Open Feign 是 SpringCloud 对 Feign 进行了封装,使其支持了 SpringMVC 标准注解和 HttpMessageConverters。
- 更多用于消费者端,做服务调用
1.2 能干嘛
Feign能于什么
-
Feign旨在使编写Java Http客户端变得更容易。
-
前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。
-
所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在Feign的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
Feign集成了Ribbon
1.3 Feign和OpenFeign两者区别
- Feign
- OpenFeign
2 . OpenFeign 基本使用
-
新建模块 : cloud-consumer-order-Feign-80
-
修改 POM
<dependencies> <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>com.demo.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </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> <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>
-
编写 YML
server: port: 80 eureka: client: register-with-eureka: false service-url: defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
-
编写主启动类
@SpringBootApplication // Feign 客户端的注解 @EnableFeignClients public class FeignMain80 { public static void main(String[] args) { SpringApplication.run(FeignMain80.class, args); } }
-
业务类
-
编写业务逻辑接口,调用 Provider 的服务 : PaymentFeignService
// 注册组件 @Component // 标注这是一个 Feign 接口, Value 值表示 微服务名称 @FeignClient(value = "CLOUD-PAYMENT-SERVICE") public interface PaymentFeignService { // 这个访问路径一定要和 Provider 的 Controller 的一模一样,不然报错 @GetMapping("/provider/getPaymentById/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id); }
-
编写 Controller : OrderFeignController
@Slf4j @RestController @RequestMapping("/consumer") public class OrderFeignController { @Autowired private PaymentFeignService feignService; @GetMapping("/getPaymentById/{id}") public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id){ return feignService.getPaymentById(id); } }
3 . 超时控制
3.1 是什么
3.2 演示超时
- 故意设置超时演示出错情况
-
修改 Provider - 8001 的 Controller
故意写一个暂停的语句
/** 用于测试超时设置 */ @GetMapping(value = "/payment/feign/timeout") public String timeOut(){ // 休眠 3 秒 try { TimeUnit.SECONDS.sleep(3); }catch (Exception e) { e.printstacktrace(); } return serverPort; }
-
修改 Consumer - Feign - 80 的 Service
@GetMapping(value = "/payment/feign/timeout") public String paymentFeignTimeout();
-
修改 Consumer - Feign - 80 的 Controller
@GetMapping(value = "/provider/payment/feign/timeout") public String paymentFeignTimeout(){ return feignService.paymentFeignTimeout(); }
-
启动项目测试
先访问一下 Provider
访问 Consumer
提示超时
3.3 配置超时控制
- OpenFeign 的超时控制其实是由 Ribbon 实现的
-
配置 YML
# 设置 Feign 客户端超时时间 ribbon: # 以下单位都是 ms 毫秒 # 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间 ReadTimeout: 5000 # 指的是建立连接后从服务器读取到可用资源所用的时间 ConnectTimeout: 5000
-
重启项目测试
4 . 日志打印功能
4.1 是什么
4.2 日志级别
-
BASIC : 仅记录请求方法、URL、响应状态码及执行时间;
-
HEADERS : 除了BASIC中定义的信息之外,还有请求和响应的头信息;
-
FULL : 除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
4.3 使用
- 修改 cloud-consumer-order-Feign-80
-
建立 Config 包,配置日志 Bean
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
-
配置 YML
在 YML 中开启日志的 Feign 客户端
logging: level: com.demo.springcloud.service.PaymentFeignService: debug
-
测试
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。