浅谈 Feign、Ribbon、Hystrix(铁三角)

文章介绍了在微服务架构中,Springcloud的Feign、Hystrix和Ribbon的角色和使用方式。Feign简化了HTTP客户端的编写,Ribbon作为客户端负载均衡器,而Hystrix则提供了服务间的熔断和降级机制,以应对延迟和故障。文章还详细展示了如何配置和使用这三者,并提到了它们之间的关系和配置建议。
摘要由CSDN通过智能技术生成

高并发 Springcloud 解决方案

微服务架构的应用中, Feign、Hystrix,Ribbon三者都是必不可少的,可以说已经成为铁三角。

概念介绍

一、Feign 是什么?

Feign 使得用 Java 写 Http 客户端更加容易,这是 Feign 的核心能力!!!

Feign 将其抽象为一套通用逻辑,类似于写普通方法调用一样,Feign 做一层代理,封装这些冗余操作。

feign 大致提供了这些核心能力:

使用方式

引用方式

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--http连接池-->
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
</dependency>
<!-- openfeign的http请求工具类修改httpclient -->
<dependency>
   <groupId>io.github.openfeign</groupId>
   <artifactId>feign-httpclient</artifactId>
</dependency>

启动方式

启动类增加 注解

@EnableFeignClients

Feign内置了Ribbon

Feign的标准写法

目录结构要求:

AuthClient.java

package cn.iald.platform.auth.client;
import cn.iald.platform.base.vo.ResponseVO;
import cn.iald.platform.auth.client.factory.AuthClientFallbackFactory;
import cn.iald.platform.auth.dto.UserBusinessSaveDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * 基础数据客户端
 *
 * @author 浅小蓝
 * @date 2021/06/28 14:59:00
 */
@FeignClient(name = "auth", fallbackFactory = AuthClientFallbackFactory.class)
public interface AuthClient {
    /**
     * 新增经营主体用户
     *
     * @param userBusinessSaveDTO
     * @return 返回值data对应 用户id
     */
    @PostMapping("/v1/internal/businessUser")
    ResponseVO saveBusinessUser(@RequestBody UserBusinessSaveDTO userBusinessSaveDTO);
}

AuthClientFallbackFactory.java

package cn.iald.platform.auth.client.factory;
import cn.iald.platform.auth.client.AuthClient;
import cn.iald.platform.auth.client.fallback.AuthClientFallback;
import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * 权限管理客户端FallbackFactory
 *
 * @author 浅小蓝
 * @date 2021/06/29 09:56:39
 **/
@Slf4j
@Component
public class AuthClientFallbackFactory implements FallbackFactory<AuthClient> {
    @Resource
    private AuthClientFallback authClientFallback;
    @Override
    public AuthClient create(Throwable throwable) {
        log.error(throwable.getMessage(), throwable);
        authClientFallback.setThrowable(throwable);
        return authClientFallback;
    }
}

AuthClientFallback.java

package cn.iald.platform.auth.client.fallback;
import cn.iald.platform.base.vo.ResponseVO;
import cn.iald.platform.auth.client.AuthClient;
import cn.iald.platform.auth.dto.UserBusinessSaveDTO;
import cn.iald.platform.util.FeignUtil;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
 * 权限管理客户端Fallback
 *
 * @author 浅小蓝
 * @date 2021/06/29 09:55:14
 **/
@Slf4j
@Component
public class AuthClientFallback implements AuthClient {
    @Setter
    private Throwable throwable;
    @Override
    public ResponseVO saveBusinessUser(UserBusinessSaveDTO userBusinessSaveDTO) {
        return FeignUtil.error(throwable);
    }
}

代码调用方式

@Resource
public  OauthClient oauthClient;
ResponseVO responseVO = this.oauthClient.subUserInfo(JSONUtil.toJsonStr(userVO));

二、什么是Ribbon?

Ribbon 作为负载均衡,在客户端实现,服务段可以启动两个端口不同但servername一样的服务

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。简单地说,Ribbon是一个客户端负载均衡器。

Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询、随机、根据响应时间加权等。

使用方式

引用方式

(如果不使用ribbon的方式调用,直接使用feign即可;可不引用)

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

启动类增加 注解

@RibbonClient

调用方式

@Resource
private RestTemplate restTemplate;
ResponseVO<List<Object>> data = restTemplate.postForEntity("http://" + GURL.HOTELSERVICE + "/hotel/baseinfo/gethotelInfodByHidBatch", new HidsDTO().setSystemHotelId(sysIds), ResponseVO.class).getBody();

三、Hystrix 是什么?

hystrix 专注于解决分布式系统延迟和容错问题。换句话说,hystrix 主要解决服务通信间的网络延时、异常等,提供降级和熔断等能力。

还不够通俗?当你在服务 A 调用服务 B 的接口时,可能出现超时、异常的情况,很有可能是服务 B 压力过大,已不堪重负。这时,服务 A 该如何做?

我们可以考虑一些策略,比如,请求失败了,我们返回默认结果;失败率超过多少多少,直接短暂停用接口调用。

Hystrix 便是致力于解决这类问题,实现以上的各种处理策略,熔断、降级等。

遗憾的是,官方已经声明不在维护

Hystrix 在 Netflix 稳定运行多年,足够稳健,我们可以放心在生产环境使用。

使用方式

引用方式

  <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

启动类开启熔断

@EnableCircuitBreaker

调用方式

定义@HystrixCommand

@RestController
public class RemoteCallerController {


    @Autowired
    private IUserService iUserService;


    @GetMapping("/user/sayHi/{name}")
    @HystrixCommand(fallbackMethod="sayHiFallback")
    public CommonRsp<String> sayHi(@PathVariable("name") String name) throws Exception {
        return iUserService.sayHi(name);
    }


    public CommonRsp<String> sayHiFallback(@PathVariable("name") String name) throws Exception {
        return CommonRspUtils.buildSuccessRsp("接口失败");
    }


}

铁三角关系介绍

如果微服务项目加上了spring-cloud-starter-netflix-hystrix依赖,那么,feign会通过代理模式, 自动将所有的方法用 hystrix 进行包装。

建议使用配置

Fegin配置说明

feign:
  hystrix:
    enabled: true
# feign 的 http 客户端支持 3 种框架;
#HttpURLConnection、httpclient、okhttp;默认是HttpURLConnection(并不支持连接池)。
  httpclient:
    enabled: true # 开启 httpclient
  client:
    config:
      default:
       #默认日志记录NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
#BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
#HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
#FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
        loggerLevel: HEADERS
       #连接超时时间
        connectTimeout: 5000
       #读取超时时间
        readTimeout: 5000

Hystrix配置说明

hystrix:
  propagate:
    request-attribute:
      enabled: true
  command:
    #全局默认配置
    default:
      #线程隔离相关
      execution:
        timeout:
          #是否给方法执行设置超时时间,默认为true。一般我们不要改。
          enabled: true
        isolation:
          #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式 THREAD semaphore,使用比较少。
          strategy: THREAD
          thread:
            #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
            timeoutInMilliseconds: 10000
            #发生超时时是否中断方法的执行,默认值为true。不要改。
            interruptOnTimeout: true
            #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
            interruptOnCancel: false
  circuitBreaker:   #熔断器相关配置
    enabled: true   #是否启动熔断器,默认为true,false表示不要引入Hystrix。
    requestVolumeThreshold: 20     #启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
    sleepWindowInMilliseconds: 5000    #所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
    errorThresholdPercentage: 50   #窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉,默认配置为50

Ribbon配置说明

ribbon:
  eager-load:
    enabled: true
  #说明:同一台实例的最大自动重试次数,默认为1次,不包括首次
  MaxAutoRetries: 1
  #说明:要重试的下一个实例的最大数量,默认为1,不包括第一次被调用的实例
  MaxAutoRetriesNextServer: 1
  #说明:是否所有的操作都重试,默认为true
  OkToRetryOnAllOperations: true
  #说明:从注册中心刷新服务器列表信息的时间间隔,默认为2000毫秒,即2秒
  ServerListRefreshInterval: 2000
  #说明:使用Apache HttpClient连接超时时间,单位为毫秒
  ConnectTimeout: 3000
  #说明:使用Apache HttpClient读取的超时时间,单位为毫秒
  ReadTimeout: 3000

gzip压缩

为了提高宽带利用率和加速数据的传输速度

在项目配置文件 application.yml 中添加以下配置:

server:
  compression:
    enabled: true #开启gzip压缩 提高宽带利用率和加速数据的传输速度
    mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml

注意事项

如果服务消费端的 CPU 资源比较紧张的话,建议不要开启数据的压缩功能,因为数据压缩和解压都需要消耗 CPU 的资源,这样反而会给 CPU 增加了额外的负担,也会导致系统性能降低。

希望对未知的你们有所帮助

❤浅小蓝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅小蓝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值