day04-OpenFeign

1 OpenFeign的区别

  • OpenFeign
    • 声明性web服务客户端
    • 使用只需要定义一个接口然后注解@FeignClient
    • 基本是当前服务之间调用的标准
  • OpenFeign集成了LoadBalancer、集成阿里巴巴Sentinal提供熔断、降级等功能

2 OpenFeign使用

  1. 消费端/服务使用者引入依赖

    <!--openfeign-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    
  2. 添加yaml配置consul注册服务

    server:
      port: 80
    
    spring:
      application:
        name: cloud-consumer-openfeign-order
      ####Spring Cloud Consul for Service Discovery
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            prefer-ip-address: true #优先使用服务ip进行注册
            service-name: ${spring.application.name}
    
  3. 主启动类添加注解@EnableFeignClients表示开启Open Feign

  4. 新建服务接口 -- 如果考虑多个模块都需要掉用就建在common模块中

    package com.atguigu.cloud.apis;
    
    import com.atguigu.cloud.entities.Pay;
    import com.atguigu.cloud.entities.PayDTO;
    import com.atguigu.cloud.resp.ResultData;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.*;
    
    @FeignClient(value = "cloud-payment-service")
    public interface PayFeignApi {
    
        @PostMapping("/pay/add") // 对应服务的接口路径
        public ResultData<String> addPay(@RequestBody Pay pay);
    
        @DeleteMapping("/pay/del/{id}")
        public ResultData<Integer> delete(@PathVariable("id") Integer id);
    
        @GetMapping("/pay/get/{id}")
        public ResultData<PayDTO> getById(@PathVariable("id") Integer id);// 此处的PathVariable一定要加上值‘id’ 否则会报错
    
        @GetMapping("/pay/get/info")
        public String getInfoFromConsul();
    }
    
    
  5. 建立使用者的Controller类,在其中注入api实例,通过调用接口中暴露的方法调用相应的微服务

    package com.atguigu.cloud.controller;
    
    import com.atguigu.cloud.apis.PayFeignApi;
    import com.atguigu.cloud.entities.Pay;
    import com.atguigu.cloud.resp.ResultData;
    import jakarta.annotation.Resource;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @Slf4j
    @RequestMapping("/feign")
    public class OrderController {
    
        @Resource
        private PayFeignApi payFeignApi;
    
        @PostMapping("/add")
        public ResultData addPay(@RequestBody Pay pay){
            return payFeignApi.addPay(pay);
        }
    
        @GetMapping("/del/{id}")
        public ResultData deletePay(@PathVariable Integer id){
            return payFeignApi.delete(id);
        }
    
        @GetMapping("/get/{id}")
        public ResultData getById(@PathVariable Integer id){
            return payFeignApi.getById(id);
        }
    
        @GetMapping("/get/info")
        public String getInfo(){
            return payFeignApi.getInfoFromConsul();
        }
    }
    
    

3 高级特性

  1. 超时控制

    • 默认超时时间 1 minute,超出后报异常

    • yml中开启配置

      • 全局控制
      spring:
      	cloud:
      		openfeign:
      			client:
      				config:
      					default:
      						connectTimeout: 3000
      						readTimeout: 3000
      
      • 指定配置
      spring:
      	cloud:
      		openfeign:
      			client:
      				config:
      					service-name:
      						connectTimeout: 3000
      						readTimeout: 3000
      

      优先配置为具体的超时时间

  2. 重试机制

    • 默认重试是关闭的

    • 开启重试机制

      • 新增配置类FeignConfig

        package com.atguigu.cloud.config;
        
        import feign.Retryer;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        
        @Configuration
        public class FeignConfig {
            @Bean
            public Retryer myRetriever(){
        //        return Retryer.NEVER_RETRY; // 默认的不重试
                return new Retryer.Default(100,1,3); // 初始间隔100ms 重试间最大间隔时间1s 最大请求次数3此
            }
        }
        
        
  3. 默认HTTPClient修改

    • 默认使用的是HttpURLConnection,修改为Apache HttpClient5--性能更好

      • 添加pom

        		<dependency>
                    <groupId>org.apache.httpcomponents.client5</groupId>
                    <artifactId>httpclient5</artifactId>
                    <version>5.2.3</version>
                </dependency>
                <dependency>
                    <groupId>io.github.openfeign</groupId>
                    <artifactId>feign-hc5</artifactId>
                    <version>13.1</version>
                </dependency>
        
      • Apache HttpClient5配置开启

        spring:
        	cloud:
        		openfeign:
        			httpclient:
        				hc5:
        				enabled: true
        
  4. 请求/响应压缩 -- 支持对请求和响应进行gzip压缩 减少通信过程中的性能损耗

    • 开启配置

      spring.cloud.openfeign.compression.request.enabled=true
      spring.cloud.openfeign.compression.response.enabled=true
      
    • 细粒度化配置

      spring.cloud.openfeign.compression.request.enabled=true
      spring.cloud.openfeign.compression.request.mime-types=text/xml,application/xml,application/json #触发压缩数据类型
      spring.cloud.openfeign.compression.request.min-request-size=2048 #最小触发压缩的大小
      
  5. 日志打印功能

    • 调整日志打印的级别,对feign调用的细节进行监控

    • 级别:

      • NONE 默认 不显示任何日志
      • BASIC 仅记录请求方法、URL、响应状态码及执行时间;
      • HEADERS 除了 BASIC 中定义的信息之外,还有请求和响应的头信息;
      • FULL 除了 HEADERS 中定义的信息之外,还有请求和响应的正文及元数据。
    • 配置日志:

      package com.atguigu.cloud.config;
      
      import feign.Logger;
      import feign.Retryer;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      /**
       * @auther zzyy
       * @create 2023-04-12 17:24
       */
      @Configuration
      public class FeignConfig
      {
          @Bean
          public Retryer myRetryer()
          {
              return Retryer.NEVER_RETRY; //默认
          }
      
          @Bean
          Logger.Level feignLoggerLevel() {
              return Logger.Level.FULL;
          }
      }
      
    • 配置监控的客户端

      # feign日志以什么级别监控哪个接口
      logging:
        level:
          com: # 监控类的完整包路径
            atguigu:
              cloud:
                apis:
                  PayFeignApi: debug # 只能是debug监控
      
posted @ 2024-07-16 00:05  yuqiu2004  阅读(7)  评论(0编辑  收藏  举报