OpenFeign开发模式 精细化控制远程调用
OpenFeign高级特性
OpenFeign开发模式 基本应用 Feign到OpenFeign
OpenFeign开发模式
消费者根据服务提供者暴露的API自定义FeignClient
服务提供者提供Feign SDK
@EnableFeignClients注解 告诉系统扫描所有使用@FeignClient定义的Feign客户端 问题:配置到configuration类不生效?
1 2 3 4 5 6 7 @SpringBootApplication(scanBasePackages = "org.geekbang.projects.cs.frontend.business.*") @EnableFeignClients public class Application { public static void main(String[] args){ SpringApplication.run(Application.class,args); } }
@FeignClient注解 通过服务的名称或地址发起远程调用
1 2 3 4 5 6 @Component @FeignClient(name ="ticket-service") public interface Ticketclient { @RequestMapping(value ="/customerTickets/try",method = RequestMethod.Post) Result<Boolean> ticketTry(@RequestBody TccRequest<AddTicketRegVO> addTicketRegVO); }
依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
OpenFeign高级特性
自动降级 1 2 3 4 5 6 7 8 9 10 @FeignClient(name = ApiConstants,SERVICE NAME, path = Apiconstants.PREFIX +"/decryptionAuditRecords", fallbackFactory = DecryptionAuditRecordApiFallback.class) public interface DecryptionAuditRecordApi { @RequestMapping(value="/",method = RequestMethod.POST) void addDecryptionAuditRecord(@RequestBody @Validated AddDecryptionAuditRecordRegaddDecryptionAuditRecordReg); } public class DecryptionAuditRecordApiFallback implements DecryptionAuditRecordApi { @Override public void addDecryptionAuditRecord(AddDecryptionAuditRecordReg addDecryptionAuditRecordReq) {} }
超时配置 1 2 3 4 5 6 7 8 9 feign: client: config: default:# 全局超时配置 connectTimeout:1000 # 网络连接阶段1秒超时 readTimeout:5000 # 服务请求响应阶段5秒超时 provider-service:# 针对特定服务"provider-service"的超时配置,优先级高于全局配置 connectTimeout:1000 readTimeout:2000
日志控制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @Configuration @EnableFeignclients() public class FeignConfiguration { @Bean Logger.Level feignLoggerlevel(){ return Logger.Level.FULL; } } 配置文件配置: loggin: level: org: geekbang: projects: cs:DEBUG
日志级别
NONE:不记录任何信息,这是OpenFeign默认的日志级别;
BASIC:只记录服务请求的URL、HTTP Method、响应状态码(如 200、404等)和服务调用的执行时间:
HEADERS:在BASIC的基础上,还记录了请求和响应中的HTTPHeaders;
FULL:在HEADERS级别的基础上,还记录了服务请求和服务响应中的Body和metadata FULL级别记录了最完整的调用信息。
1 2 3 4 5 6 7 8 @Configuration @EnableFeignclients() public class FeignConfiguration { @Bean Logger.Level feignLoggerlevel(){ return Logger.Level.FULL; } }
错误解码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @Confiquration @EnableFeianclients() public class FeignConfiguration { @Bean FeignErrorDecoder errorDecoder() return new FeignErrorDecoder(); } public class FeignErrorDecoder extends ErrorDecoder Default { private static final Logger logger = LoggerFactory.getLogger(FeignErrorDecoder.class); @Override public Exception decode(String methodKey, Response response){ Exception exception =super.decode(methodKey, response); logger.error(exception.getMessage(),exception); return exception; } }
思考题
微服务为什么不用dobbu? dubbo重在哪里? spring cloud提供开箱即用解决方案 Dubbo额外集成网管,配置中心等。
OpenFeign在使用上与传统RestTemplate有什么区别?