springcloud五大神兽之Feign

① 什么是Feign?
Feign 的英文表意为“假装,伪装,变形”, 是一个http请求调用的轻量级框架。
② Feign可以做什么?
Feign可以把HTTP 的请求进行隐藏,伪装成类似 SpringMVC 的 Controller一样。你不用再自己拼接 url,拼接参数等等操作,一切都交给 Feign 去做。
Feign 是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。
不再使用拼接URL的方式实现远程调用,以接口调用的方式实现远程调用,简化了远程调用的实现方式,增强了远程调用的功能,例如:增加了负载均衡、熔断、压缩、日志启用等。
③ Feign的特性?
集成Ribbon的负载均衡功能
集成了Hystrix的熔断器功能
支持请求压缩
大大简化了远程调用的代码,同时功能还增强啦
Feign以更加优雅的方式编写远程调用代码,并简化重复代码
2.8 Feign~Ribbon案例演示
需求一:使用Feign替代RestTemplate发送HTTP请求,并使用负载均衡
① 消费方导入Feign依赖

<!--配置feign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

② 编写Feign客户端接口
消费方创建UserClient接口,并添加@FeignClient注解指定服务方服务名称,接口内编写服务方被调用方法

@FeignClient(value = "user-producer")
public interface UserClient {
    @RequestMapping(value = "/user/find/{id}")
    public User findById(@PathVariable(value = "id") Integer id);
}

③ 开启Feign功能注解

@SpringBootApplication
@EnableDiscoveryClient  //开启客户端
@EnableCircuitBreaker   //开启熔断
@EnableFeignClients(basePackages = {"com.swk.feign"})   //开启feign
public class UserConsumerSpringBootApplication {
    public static void main(String[] args) {
       SpringApplication.run(UserConsumerSpringBootApplication.class,args);
    }
    @Bean
    @LoadBalanced   //开启ribbon负载均衡,默认是轮询
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

④ 访问接口测试
启动EurekaServer注册中心、服务提供方、服务消费方
(1)设置读取超时时间为5s,程序休眠时间为4s,可以正常访问
在这里插入图片描述
(2)设置读取超时时间为5s,程序休眠时间为6s,读取超时

#配置ribbon负载均衡策略  默认是轮询,还有随机,权重,重试
user-producer:
  ribbon:
   #轮询(默认)
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
   #随机算法
   #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
   #重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务
   #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
   #加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果同统计信息不足,则使用轮询的策略,等统计信息足够会切换到自身规则。
   #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
   ConnectTimeout: 1000 # 连接超时时间 没有连接上
   ReadTimeout: 5000 # 数据读取超时时间 连接上了,连上之后开始计时,但读取数据需要花费很长时间
   MaxAutoRetries: 1 # 最大重试次数(第一个服务)在第一次连接超时之后,在重新连接一次
   MaxAutoRetriesNextServer: 0 # 最大重试下一个服务次数(集群的情况才会用到)
   OkToRetryOnAllOperations: false # 是否所有操作都进行重试

(3)测试
在这里插入图片描述
⑤ 测试ConnectTimeout连接超时
随便改一个不存在的ip地址去访问;

#配置eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
    #每隔30s获取服务中心列表一次(只读备份)
    #registry-fetch-interval-seconds: 30
  instance:
    #指定ip地址访问
    ip-address: 127.0.0.10
    #访问服务时,推荐使用ip
    prefer-ip-address: true
    #租约到期,服务有效时间,默认值90s
    #lease-expiration-duration-in-seconds: 90
    #租约续约间隔时间,默认30s
    #lease-renewal-interval-in-seconds: 30

在这里插入图片描述
⑥ 测试MaxAutoRetries 重试机制
当第一次发送请求连接不到服务时,自动在发送一次请求;
可以设置ReadTimeout: 5000s,默认发送一次请求,5s后获取不到服务,自动在发送一次请求
在这里插入图片描述
2.9 Feign~Hystrix案例演示
① 在application.yml中开启feign熔断器支持
在服务消费方的yml文件中,开启feign熔断功能

#开启feign熔断功能
feign:
  hystrix:
    enabled: true

② 编写FallBack处理类
编写feign的熔断器服务降级处理类,注意:Hystrix是编写服务降级方法

@Component  //当前类作为spring容器的组件
public class UserClientFallback implements UserClient{
    @Override
    public User findById(Integer id) {
        User user = new User();
        user.setName("feign 熔断降级,返回默认值");
        return user;
    }
}

③ 指定FallBack处理类
在定义的接口中,指定feign的熔断处理类

//fallback = UserClientFallback.class 指定使用feign的熔断器,实现服务降级
@FeignClient(value = "user-producer",fallback = UserClientFallback.class)
public interface UserClient {
    @RequestMapping(value = "/user/find/{id}")
    public User findById(@PathVariable(value = "id") Integer id);
}

④ 测试
启动注册中心、服务提供者、服务消费者
在这里插入图片描述
⑤ Feign请求压缩
SpringCloudFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。

#开启feign熔断功能
feign:
  hystrix:
    enabled: true
  compression:
    request:
      enabled: true #开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限
    response:
      enabled: true # 开启响应压缩

⑥ Feign日志级别设置
(1)配置日志级别

#开启feign熔断功能
feign:
  hystrix:
    enabled: true
  compression:
    request:
      enabled: true #开启请求压缩
      mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
      min-request-size: 2048 # 设置触发压缩的大小下限
    response:
      enabled: true # 开启响应压缩
#配置Feign日志级别
logging:
  level:
    com.swk: debug #com.swk 包下的日志级别都为Debug

(2)编写配置类,定义日志级别Bean

   /**
     * 配置Feign日志级别
     * Feign支持4中级别:
     *     NONE:不记录任何日志,默认值
     *     BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
     *     HEADERS:在BASIC基础上,额外记录了请求和响应的头信息
     *     FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据
     * @return
     */
    @Bean
    public Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

(3)发送请求,查看控制台日志
在这里插入图片描述
⑦ Feign工作原理小结
(1)在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients 配置的扫描包路径。如果没配置,默认为启动类的包路径。
(2)当程序启动时,会进行包扫描,扫描所有 @FeignClient 的注解的类,并将这些信息注入 Spring IOC 容器中。
(3)校验 @FeignClient 修饰的类,包括类必须是 interface ,以及@FeignClient的fallback及fallbackFactory配置的必须是接口的实现类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值