OpenFeign入门操作

740 阅读4分钟

OpenFeign

OpenFeifn也是服务调用与Ribbon相比简化了使用Spring cloud Ribbon时,自动封装服务调用客户端的开发量。Feign集成了Ribbon利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

使用方法

  • 接口+注解: 微服务调用接口+@FeignClient

  • 新建一个cloud-consumer-openFeign-order80消费端

  • pom

    <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>
            <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
                <groupId>com.cloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>1.0-SNAPSHOT</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>
    
  • 主启动类要加@EnableFeignClients

  • 新建业务层接口PaymentFeignService接口并新增注解@FeignClient

    这里抽象方法就对应服务接口@GetMapping("/payment/get/{id}")

    @Component
    @FeignClient(value = "CLOUD-PAYMENT-SERVICE")
    public interface OpenFeignService {
        @GetMapping("/payment/get/{id}")
        public Result<Payment> getPaymentById(@PathVariable("id") Long id);
    }
    
  • 写控制层Controller 这就正常写

    @RestController
    @Slf4j
    public class FeignController {
    
        @Resource
        private OpenFeignService openFeignService;
    
        @GetMapping(value = "/consumer/payment/get/{id}")
        public Result<Payment> getPaymentById(@PathVariable("id") Long id)
        {
            return openFeignService.getPaymentById(id);
        }
    }
    
    
  • 测试

    启动7001->8001/8002->80

    进行测试会发现OpenFeign自带负载均衡配置项,这是因为它也集成了ribbon包。

OpenFeign超时设置

  • 故意让8001端口睡一会

     @GetMapping(value = "/payment/feign/timeout")
        public String paymentFeignTimeOut()    {
            System.out.println("*****paymentFeignTimeOut from port: "+port);        //暂停几秒钟线程
            try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
               return port;
        }
    
  • 测试一下

feign.jpg

  • 发现并没有找到接口报404,这是因为feign默认请求为1秒,而我们让程序睡了3秒用户等不了只能给他说没有这个请求,如果真遇到复杂程序就要我们手动调整一下最大时间上限.

    这里我们调的ribbon的时间其实也都一样,因为feign已经集成了ribbon

    ribbon:
      ReadTimeout: 5000 # 毫秒时间, 同feign的
      ConnectTimeout: 5000 #, 同feign的
    
  • 再进行测试 会等待三秒才会得到数据

feign2.jpg

  • feign的配置

    feign:
    	client:
    		config:
    			default:	// 这个代表 服务,default为任意服务,可以指定服务名来指定调用该服务时的超时时间
    				connectTimeout: 毫秒时间,建立连接的超时时间,一般只在发现服务时用到
    				readTimeout: 毫秒时间 ,接口请求的超时时间
    
    

OpenFeign日志打印

  • Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节。说白了就是对Feign接口的调用情况进行监控和输出,现在接口少等以后接口多可以更好的维护。

  • 配置类

    @Configuration
    public class FeignConfig {
        @Bean
        Logger.Level feignLoggerLevel(){
            return Logger.Level.FULL;
        }
    }
    
  • yml配置

    logging:
       level:
         # feign日志以什么级别监控  哪个接口
         com.wzj.springcloud.service.OpenFeignService: debug
    
  • 启动测试

feignlog.jpg

openfeign 和 feign

Feign 是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-openfeign

FeignOpenFeign
是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。是Spring Cloud 在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。
Feign的使用方式是:使用Feign的注解定义接口,调用这个接口,就可以调用服务注册中心的服务。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
org.springframework.cloud spring-cloud-starter-feignorg.springframework.cloud spring-cloud-starter-openfeign

为什么有Ribbon又出现OpenFeig呢?

为了方便,让程序写起来更有逻辑。比如我们之前用Ribbon+RestTemplate方式去获得暴露的端口,我们是直接在Controller中进行的,而代码写起来也不是很顺畅的对吧。而我们之前写代码是怎么样的?是不是刚开始学时老师就强调dao-service-controller,但是你用了是不是就没办法调用service是不是违背了本来的意愿其实也没那么严重。这是OpenFeign就出现了,他封装了Ribbon只是在接口成用注解进行完成操作,是不是方便很多写起来更加方便了。这里理解为8001的controller接口为80端的serviceImpl或者dao层是不是更好理解点。