目录
SpringCloud Feign 查看此博客:005SpringCloud--Feign:负载均衡(基于服务端)_gh_xiaohe的博客-CSDN博客
OpenFegin概述
OpenFeign是什么:
OpenFegin能干什么
Feign和OpenFeign两者区别
OpenFeign使用步骤
服务消费者
接口+注解 微服务调用接口+@FeignClient
1、06-cloud-consumer-order-feign-80
2、pom.xml
3、改yum
4、主启动 @EnableFeignClients //开启OpenFegin
5、业务类
业务逻辑接口+@FeignClient配置调用provider服务
新建PaymentFeignService接口并新增注解@FeignClient
controller
测试
总结:
OpenFeign超时控制
超时设置,故意设置超时演示出错情况
服务提供方8001故意写暂停程序
服务消费方80添加超时方法PaymentOpenFeignService
服务消费方80添加超时方法OrderOpenFeignController
测试:
解决方案
测试: 成功
OpenFeign日志打印功能
日志级别
配置日志bean
YML文件里需要开启日志的Feign客户端
后台日志查看
SpringCloud Feign 查看此博客:005SpringCloud--Feign:负载均衡(基于服务端)_gh_xiaohe的博客-CSDN博客
OpenFegin概述
OpenFeign是什么:
OpenFeign是一个声明式的Web服务客户端,让编写Web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可
GitHub:GitHub - spring-cloud/spring-cloud-openfeign: Support for using OpenFeign in Spring Cloud apps
官网:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-feign


OpenFegin能干什么
 OpenFegin指在使编写Java Http客户端变得更容易。
 前面在使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在OpenFegin的实现下,我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),即可完成对服务提供方的接口绑定,简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。
  
OpenFegin集成了Ribbon
 利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过Openfeign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

Feign和OpenFeign两者区别
| Feign | OpenFeign | 
| Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端 Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 | OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 | 
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> | <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> | 
OpenFeign使用步骤
服务消费者
接口+注解 微服务调用接口+@FeignClient
1、06-cloud-consumer-order-feign-80
2、pom.xml
<dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.gh</groupId>
            <artifactId>00-cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--web-->
        <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>3、改yum
server:
  port: 80
eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/4、主启动 @EnableFeignClients //开启OpenFegin
/**
 * @author gh  Email:@2495140780qq.com
 * @Description
 * @date 2022-03-29-下午 11:14
 */
@SpringBootApplication
@EnableFeignClients //开启OpenFegin
public class OrderOpenFeignMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderOpenFeignMain80.class, args);
    }
}
5、业务类
业务逻辑接口+@FeignClient配置调用provider服务
新建PaymentFeignService接口并新增注解@FeignClient
/**
 * @author gh  Email:@2495140780qq.com
 * @Description
 * @date 2022-03-29-下午 11:20
 */
@Component
@FeignClient(value = "02-CLOUD-PROVIDER-PAYMENT-EUREKA-8001")
public interface PaymentOpenFeignService {
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}
controller
/**
 * @author gh  Email:@2495140780qq.com
 * @Description
 * @date 2022-03-30-上午 9:13
 */
@RestController
public class OrderOpenFeignController {
    @Autowired
    private PaymentOpenFeignService  paymentOpenFeignService;
    @GetMapping(value = "consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return paymentOpenFeignService.getPaymentById(id);
    }
}测试

http://localhost/consumer/payment/get/35 成功
Feign自带负载均衡配置项
总结:

OpenFeign超时控制
超时设置,故意设置超时演示出错情况
服务提供方8001故意写暂停程序
//暂停三秒线程    
@GetMapping(value = "/payment/openfeign/timeout")
    public String paymentOpenfeignTimeout() {
        //暂停3秒钟线程
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return ServicePort;
    }服务消费方80添加超时方法PaymentOpenFeignService
@Component
@FeignClient(value = "02-CLOUD-PROVIDER-PAYMENT-EUREKA-8001")
public interface PaymentOpenFeignService {
    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
    
    //超时方法
    @GetMapping(value = "/payment/openfeign/timeout")
    public String paymentOpenfeignTimeout() ;
}服务消费方80添加超时方法OrderOpenFeignController
@RestController
public class OrderOpenFeignController {
    @Autowired
    private PaymentOpenFeignService  paymentOpenFeignService;
    @GetMapping(value = "consumer/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return paymentOpenFeignService.getPaymentById(id);
    }
    //超时方法  客户端只等待一秒  默认
    @GetMapping(value = "consumer/payment/openfeign/timeout")
    public String paymentOpenfeignTimeout() {
        return paymentOpenFeignService.paymentOpenfeignTimeout();
    }
}测试:
提供方自测成功: http://localhost:8001/payment/openfeign/timeout
 消费端    异常,报错
消费端    异常,报错
错误页面
原因:OpenFeign默认等待1秒钟,提供方需要3秒的时间,超过时报错
解决方案
OpenFeign默认支持Ribbon
yml.xml  :YML文件里需要开启OpenFeign客户端超时控制
 测试: 成功
 
OpenFeign日志打印功能
Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出
日志级别
| NONE:默认的,不显示任何日志; | 
| BASIC:仅记录请求方法、URL、响应状态码及执行时间; | 
| HEADERS:除了 BASIC 中定义的信息之外,还有请求和响应的头信息; | 
| FULL:除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。 | 
配置日志bean
/**
 * @author gh  Email:@2495140780qq.com
 * @Description
 * @date 2022-03-30-上午 10:10
 */
@Configuration
public class OpenFeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}YML文件里需要开启日志的Feign客户端
logging:
  level:
    # feign日志以什么级别监控哪个接口
    com.gh.springcloud.service.PaymentOpenFeignService: debug





















