西充县住房和城乡规划建设局网站,承德市网站建设公司,wordpress 文章属性,郑州上街区网站建设公司目录一、概述1.OpenFeign是什么2.能干嘛二、OpenFeign使用步骤1.接口注解2.新建Module3.POM4.YML5.主启动类6.业务类7.测试8.小总结三、OpenFeign超时控制1.超时设置#xff0c;故意设置超时演示出错情况2.是什么3.YML中需要开启OpenFeign客户端超时控制四、OpenFeign日志打印…
目录一、概述1.OpenFeign是什么2.能干嘛二、OpenFeign使用步骤1.接口注解2.新建Module3.POM4.YML5.主启动类6.业务类7.测试8.小总结三、OpenFeign超时控制1.超时设置故意设置超时演示出错情况2.是什么3.YML中需要开启OpenFeign客户端超时控制四、OpenFeign日志打印功能1.是什么2.日志级别3.配置日志bean4.YML文件里需要开启日志的Feign客户端5.后台日志查看代码链接 https://github.com/lidonglin-bit/cloud
一、概述
1.OpenFeign是什么
Feign是一个声明式的web服务客户端让编写web服务客户端变得非常容易只需创建一个接口并在接口上添加注解即可SpringCloud对Feign进行了封装使其支持了SpringMVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。 https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign https://github.com/spring-cloud/spring-cloud-openfeign
2.能干嘛
Feign能干什么
Feign旨在使用编写Java Http客户端变得更容易。
前面在使用RibbonRestTemplate时利用RestTemplate对Http请求的封装处理形成了一套模板化的调用方法。
但是在实际开发中由于对服务依赖的调用可能不止一处往往一个接口会被多处调用所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务端额调用。所以Feign在此基础上做了进一步封装由他来帮助我们定义和实现依赖服务接口的定义。
在Feign的实现下我们只需创建一个接口并使用注解的方式来配置它以前是DAO接口上面标注Mapper注解现在是一个微服务接口上面标注一个Feign注解即可即可完成对服务提供方的接口绑定简化了使用Spring Cloud Ribbon时自动封装服务调用客户端的开发量。
Feign集成了 Ribbon
利用Ribbon维护了Payment的服务列表信息并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是通过Feign只需要定义服务绑定接口且以声明式的方法优雅而简单的实现了服务调用。
Feign和OpenFeign两者区别
二、OpenFeign使用步骤 1.接口注解
微服务调用接口FeignClient
2.新建Module
cloud-consumer-feign-order80
3.POM
注意openFeign也是自带bibbon
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud/artifactIdgroupIdcom.donglin/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloud-consumer-feign-order80/artifactIdpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependencies!--openfeign--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependencydependencygroupIdcom.donglin.springcloud/groupIdartifactIdcloud-api-commons/artifactIdversion${project.version}/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependencies/project4.YML
server:port: 80
spring:application:name: cloud-consumer-feign-order80
eureka:client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://localhost:7001/eureka5.主启动类
package com.donglin.springcloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;SpringBootApplication
EnableEurekaClient
EnableFeignClients
public class OrderFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderFeignMain80.class,args);}
}6.业务类
1.业务逻辑接口FeignClient配置调用provider服务 2.新建PaymentFeignService接口并新增注解FeignClient
package com.donglin.springcloud.service;import com.donglin.springcloud.entities.CommonResult;
import com.donglin.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;Component
FeignClient(value CLOUD-PAYMENT-SERVICE)
public interface PaymentFeignService {GetMapping(value /payment/get/{id})public CommonResultPayment getPaymentById(PathVariable(id) Long id);
}3.控制层Controller
package com.donglin.springcloud.controller;import com.donglin.springcloud.entities.CommonResult;
import com.donglin.springcloud.entities.Payment;
import com.donglin.springcloud.service.PaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;RestController
public class OrderFeignController {Autowiredprivate PaymentFeignService paymentFeignService; //调用远程的微服接口GetMapping(value /consumer/payment/get/{id})public CommonResultPayment getPaymentById(PathVariable(id) Long id){return paymentFeignService.getPaymentById(id);}
}7.测试
1.先启动Eureka7001 2.再启动2个微服务8001/8002 3.启动OpenFeign微服务cloud-consumer-feign-order80 4.http://localhost/consumer/payment/get/31 5.Feign自带负载均衡配置项
8.小总结 三、OpenFeign超时控制
1.超时设置故意设置超时演示出错情况
1.服务提供方8001故意写暂停程序 GetMapping(value /payment/feign/timeout)public String paymentFeignTimeout(){try { TimeUnit.SECONDS.sleep(3); }catch (Exception e) {e.printStackTrace();} //单位秒return port;}2.服务消费方80添加超时方法PaymentFeignService GetMapping(value /payment/feign/timeout)public String paymentFeignTimeout();3.服务消费方80添加超时方法OrderFeignController GetMapping(value /consumer/payment/feign/timeout)public String paymentFeignTimeout(){return paymentFeignService.paymentFeignTimeout();}4.测试 http://localhost/consumer/payment/feign/timeout 错误页面OpenFeign默认等待一秒钟超过后报错
2.是什么
默认Feign客户端只等待一秒钟但是服务端处理需要超过1秒钟导致Feign客户端不想等待了直接报错。 为了避免这样的情况有时候我们需要设置Feign客户端的超时控制也即Ribbon的超时时间因为Feign集成了Ribbon进行负载均衡。
3.YML中需要开启OpenFeign客户端超时控制
Feign设置超时时间 使用Feign调用接口分两层ribbon的调用和hystrix的调用所以ribbon的超时时间和Hystrix的超时时间的结合就是Feign的超时时间
#设置Feign客户端超时时间openfeign默认支持ribbon
ribbon:ReadTimeout: 6000ConnectTimeout: 6000MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用OkToRetryOnAllOperations: false #是否所有操作都重试
#hystrix的超时时间
hystrix:command:default:execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 9000一般情况下 都是 ribbon 的超时时间hystrix的超时时间因为涉及到ribbon的重试机制 因为ribbon的重试机制和Feign的重试机制有冲突所以源码中默认关闭Feign的重试机制源码如下 要开启Feign的重试机制如下Feign默认重试五次 源码中有
Bean
Retryer feignRetryer() {return new Retryer.Default();
}根据上面的参数计算重试的次数MaxAutoRetriesMaxAutoRetriesNextServer(MaxAutoRetries *MaxAutoRetriesNextServer) 即重试3次 则一共产生4次调用 如果在重试期间时间超过了hystrix的超时时间便会立即执行熔断fallback。所以要根据上面配置的参数计算hystrix的超时时间使得在重试期间不能达到hystrix的超时时间不然重试机制就会没有意义 hystrix超时时间的计算 (1 MaxAutoRetries MaxAutoRetriesNextServer) * ReadTimeout 即按照以上的配置 hystrix的超时时间应该配置为 111*39秒 当ribbon超时后且hystrix没有超时便会采取重试机制。当OkToRetryOnAllOperations设置为false时只会对get请求进行重试。如果设置为true便会对所有的请求进行重试如果是put或post等写操作如果服务器接口没做幂等性会产生不好的结果所以OkToRetryOnAllOperations慎用。 如果不配置ribbon的重试次数默认会重试一次 注意 默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试 非GET方式请求,只有连接异常时,才会进行重试
四、OpenFeign日志打印功能
1.是什么
Feign提供了日志打印功能我们可以通过配置来调整日志级别从而了解Feign中Http请求的细节。说白了就是对Feign接口的调用情况进行监控和输出。
2.日志级别 NONE默认的不显示任何日志 BASIC仅记录请求方法、RUL、响应状态码及执行时间 HEADERS除了BASIC中定义的信息之外还有请求和响应的头信息 FULL除了HEADERS中定义的信息之外还有请求和响应的正文及元数据 3.配置日志bean
package com.donglin.springcloud.config;import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;Configuration
public class FeignConfig {Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}
}4.YML文件里需要开启日志的Feign客户端
logging:level:com.donglin.springcloud.service.PaymentFeignService: debug5.后台日志查看
http://localhost/consumer/payment/get/31