`
Seven.Q
  • 浏览: 12011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hystrix之API使用

 
阅读更多

Hystrix使用了命令设计模式,提供了两个CommandHystrixCommand HystrixObservableCommand只需要编写命令即可

public class CommandThatFailsSilently extends HystrixCommand<List<String>> {
    private final boolean throwException;
    public CommandThatFailsSilently(boolean throwException) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.throwException = throwException;
    }
    @Override
    protected List<String> run() {
        if (throwException) {
            throw new RuntimeException("failure from hystrix.examples.basic.CommandThatFailsFast");
        } else {
            ArrayList<String> values = new ArrayList<String>();
            values.add("success");
            return values;
        }
    }
    @Override
    protected List<String> getFallback() {
        return Collections.emptyList();
    }
}

 

Hystrix提供了一个类库javanica,可以使用@HystrixCommand注解完成命令的编写。例如使用 @HystrixCommand 注解标记方法,Hystrix 将利用AOP自动将目标方法包装成HystrixCommand来执行

@GetMapping("/getHostMessage/{id}")
@HystrixCommand(fallbackMethod = "getHostMessageFallback")
public Map<String, Object> getHostMessage(@PathVariable String id){...}

 

源码中有几个关键的概念:groupKeycommandKeythreadPoolKey

 

每个请求系统会有自己的com.netflix.hystrix.HystrixCommand.Setter实例,groupKey要求非空是一切实例的基础,用于标识系统;commandKey对于请求,fallback的统计数据是通过commandKey来区分的,所以最好每个线程池也有自己的commandKey;每个threadPoolKey一个线程池,根据threadPoolKey来区分不同的线程池。

 

HystrixCommand实现线程隔离

要实现线程隔离的关键在于threadPoolKey,一个threadPoolKey映射一个线程池。这里探讨两种线程隔离的方式:类级别和实例级别,重点讲讲实例级别的线程隔离

 

类级别,是实现很多的HystrixCommand<T>,如上面代码里的HelloCommand,你还可以有ACommandBCommandCCommandDCommand……这样每个类都会有自己的线程池,从而实现线程隔离。每个类在实例化的时候,如果没有指定线程池(通过Setter指定),默认会使用组名作为一组线程池,组名必须设置,因为构造Setter实例的唯一方法是withGroupKey

 

实例级别线程隔离

但其实很多时候你并不希望有这么多的类,你可能希望在HelloCommand#run中根据不同的请求系统进行线程隔离,比如:HelloCommand#run根据不同的请求参数,会访问系统A、系统B、系统C、系统D……你不希望系统A出现问题影响到代码对其他系统的访问。

这个时候你的代码可能是这样的:

public class Bean {

    // 需要请求的系统

    private String requestSystem;

    // 省略其他属性和setter/getter方法

}

 

public class Serivce() {

    public String doService(Bean bean) {

        // 每个请求的外部系统一个setter实例

        Setter setter = getSetterFromRequestSystem(bean.getRequestSystem());

        HelloCommand command = new HelloCommand(setter);

        return command.execute();

    }

    public Setter getSetterFromRequestSystem(String requestSystem) {

        // requestSystem设置为组名,或者threadPoolKey

        return Setter.withGroupKey(requestSystem)...;

    }

}

分享到:
评论

相关推荐

    hystrix公司内部分享ppt

    Hystrix的历史可以追溯到2011年,当时Netflix的API团队开始着手提升系统的可用性和稳定性。到了2012年,Hystrix已经发展得相当成熟稳定,被Netflix的其他团队广泛采用。到现在,Netflix每天都有数十亿次的服务间调用...

    springcloud hystrix的使用

    3. **创建Hystrix命令**:通过实现`HystrixCommand`接口或使用注解`@HystrixCommand`,我们可以为每个服务调用创建一个Hystrix命令。命令中定义了执行业务逻辑的方法(`run()`)以及在失败时回退的方法(`fallBack()...

    hystrix-dashboard.zip

    综合这些信息,我们可以了解到这个示例项目展示了如何在Spring Cloud环境中构建微服务架构,使用Eureka进行服务注册和发现,使用Feign进行服务间的通信,并通过Hystrix实现容错和监控。Hystrix Dashboard的集成使得...

    spring-cloud-netflix-hystrix应用

    4. **使用HystrixCommand**:在服务调用处使用HystrixCommand,确保服务调用被正确地封装和隔离。 5. **实现降级逻辑**:编写降级方法,当服务不可用时自动执行。 6. **集成监控**:集成Hystrix Dashboard和Turbine...

    断路器hystrix实现.rar

    6. **Zuul与Hystrix集成**:Zuul作为Spring Cloud的边缘服务和API网关,可以通过HystrixCommand处理微服务的路由和过滤。在Zuul的过滤器中,我们可以使用Hystrix来保护对后端服务的调用。 综上所述,Hystrix通过...

    Spring Cloud(Hystrix)使用.zip

    本教程将通过分析`microservice-hystrix-dashboard`、`microservice-client`和`microservice-springcloud`这三个项目来深入理解Spring Cloud Hystrix的使用。 首先,`microservice-hystrix-dashboard`是Hystrix的...

    spring cloud gateway配置Hystrix 熔断、限流、后台调用注意点.pdf

    在上面的代码中,我们可以看到使用 `f.hystrix(config -&gt; config.setName("accept")` 配置了熔断器,名为 "accept"。并且设置了回退 URI 为 "forward:/gateway-fallback",这意味着当熔断器触发时,将会回退到该 URI...

    hystrix接入.docx

    - **服务隔离与控制**:通过将调用封装在一个独立的执行单元中(通常是线程池或信号量),Hystrix可以有效地管理每个服务调用的资源使用情况,避免因某个服务出现问题而导致整个系统性能下降。 - **服务熔断与降级**...

    ServiceOrder:Spring boot + Hystrix + 通用缓存 API + Docker

    ServiceOrder项目是一个基于Spring Boot框架构建的微服务应用,它集成了Hystrix断路器以提高系统的容错性,并且使用了通用缓存API来优化数据访问性能。此外,项目还利用Docker容器化技术,确保应用可以快速部署和...

    Feign对Hystrix的支持-代码部分.zip

    - 使用Spring Cloud Gateway或 Zuul作为API网关,进行路由和过滤器配置。 - 优化服务性能,如合理设计接口,减少响应时间。 6. **父级工程**:通常,大型项目会有一个父级工程,用来统一管理子项目的依赖版本、...

    spring cloud eureka zuul ribbon hystrix feign config 示例

    Zuul作为API网关,负责路由请求和过滤操作;Ribbon在客户端进行负载均衡;Hystrix提供容错保护,确保系统稳定性;Feign简化了服务之间的调用过程。 在提供的压缩包文件中,"cloud"可能包含了这些组件的示例代码。...

    springcloud2-hystrix-feign-zuul.zip

    这两个文件很可能是Hystrix的两个不同版本的示例,可能涵盖了Hystrix命令模式的使用、断路器的配置、降级策略的实现,以及Hystrix Dashboard和Turbine的集成,用于实时监控服务健康状态。 通过学习和实践这些示例...

    spring boot整合consul、fegin、HystrixCommand

    - **实现HystrixCommand**:在Feign接口的方法上,我们可以使用`@HystrixCommand`注解来封装命令执行逻辑,设置超时时间、线程池等属性。这样,当服务调用出现异常时,HystrixCommand的断路器会被触发,返回一个...

    Hystrix跨线程传递数据解决方案:HystrixRequestContext.docx

    通过 `HystrixRequestContext` 和相关的 API,Hystrix 能够有效地管理跨线程的数据传递,使得开发人员能够在使用线程池隔离模式时轻松地处理上下文数据。这种机制不仅提高了代码的可维护性和可读性,而且也增强了...

    microservice-spring-cloud1:包含spring cloud 中各种组件的使用案例 例如 Eureka、hystrix、API gateway、feign、Ribbon、Config、bus等等

    本项目"microservice-spring-cloud1"正是一个涵盖多种Spring Cloud组件的实战案例集合,包括Eureka、Hystrix、API Gateway、Feign、Ribbon、Config和Bus等。接下来,我们将详细探讨这些组件及其应用。 首先,Eureka...

    spring cloud 组件整合 eureka gateway feign hystrix,各个模的整合,供大家一起学习

    2. **Gateway**:Spring Cloud Gateway作为Spring Cloud生态的新一代API网关,取代了Zuul。它提供路由转发、过滤器等功能,可以处理所有进入系统的HTTP请求。Gateway通过动态路由策略,可以根据不同的条件将请求转发...

    分布式系统的延迟和容错库 Hystrix.zip

    Hystrix 供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。 Netflix称,在分布式环境中,不可避免会...

    SpringCloud Eureka+config+zuul+feign+hystrix

    3. **Zuul**:作为SpringCloud的边缘服务和API网关,Zuul处理所有来自客户端的请求,并进行路由转发。它可以进行权限控制、监控、动态路由等功能,将非业务逻辑的处理前置,减轻后端服务的压力。Zuul还支持过滤器,...

    Hystrix dashboard

    Spring Cloud 结合了众多优秀的开源项目,如Eureka(服务发现)、Zuul(API网关)、Hystrix(断路器)等。 **2. Hystrix 断路器** 断路器模式是微服务架构中的一种设计模式,用于防止因某个服务不可用或响应时间过...

    Feign屏蔽单个服务的Hystrix示例

    在这个"Feign屏蔽单个服务的Hystrix示例"中,我们将探讨如何在使用Feign进行服务调用时,为特定的服务添加Hystrix保护,以便在目标服务不可用或性能下降时,能够优雅地处理错误,避免整个系统崩溃。 首先,我们需要...

Global site tag (gtag.js) - Google Analytics