资讯专栏INFORMATION COLUMN

Spring Cloud实战(五)-Spring Cloud Netflix Hystrix

CrazyCodes / 1879人阅读

摘要:实战五概要什么是怎么用常见配置介绍什么是是分布式系统处理超时和错误的机制如下图所示分布式系统中某个用户请求依赖服务当此请求并发超过的时候服务处理速度变慢但是服务还是被调用大量请求会阻塞在服务器上影响其它整个服务在复杂的分布式架构的应用程序

Spring Cloud实战(五)-Spring Cloud Netflix Hystrix 概要

什么是Spring Cloud Netflix Hystrix?

怎么用 Spring Cloud Netflix Hystrix?

Hystrix常见配置介绍

什么是Spring Cloud Netflix Hystrix?

Spring Cloud Netflix Hystrix是分布式系统处理超时和错误的机制,如下图所示,分布式系统中某个用户请求依赖A,H,I,P服务.

当此请求并发超过50的时候,服务I处理速度变慢,但是服务I还是被调用.


大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.
Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性.

怎么用Spring Cloud Netflix Hystrix?

百说不如一run,构造一个例子来实现,例子要实现使用Hystrix的Fallback(失败后)逻辑来处理错误情景
1.Eureka Server,和Eureka Client跟之前一样,只需改造Eureka Sentence
2.Eureka Sentence 添加pom依赖

        
            org.springframework.cloud
            spring-cloud-starter-hystrix
        
        
            org.springframework.cloud
            spring-cloud-starter-hystrix-dashboard
        

3.Eureka Sentence的Application添加hystrix注解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableHystrixDashboard
public class ApplicationSentence {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationSentence.class, args);
    }
}

4.Eureka Sentence WordServiceImpl在subject,adjective,noun上添加HystrixCommand注解并实现相应的fallback逻辑.

@Service
public class WordServiceImpl implements WordService {

    @Autowired
    VerbClient verbClient;
    @Autowired
    SubjectClient subjectClient;
    @Autowired
    ArticleClient articleClient;
    @Autowired
    AdjectiveClient adjectiveClient;
    @Autowired
    NounClient nounClient;
   

    @Override
    @HystrixCommand(fallbackMethod="getFallbackSubject")
    public String getSubject() {
        return subjectClient.getWord();
    }



    @Override
    public String getVerb() {
        return verbClient.getWord();
    }

    @Override
    public String getArticle() {
        return articleClient.getWord();
    }

    @Override
    @HystrixCommand(fallbackMethod="getFallbackAdjective")
    public String getAdjective() {
        return adjectiveClient.getWord();
    }

 
    @HystrixCommand(fallbackMethod="getFallbackNoun")
    public String getNoun() {
        return nounClient.getWord();
    }

    public String getFallbackSubject() {
        return "某人";
    }

    public String getFallbackAdjective() {
        return "";
    }

    public String getFallbackNoun() {
        return "某物";
    }
}

5.依次启动Eureka Server,Eureka Client,Eureka Sentence,这个跟之前一样造句,停掉subject,noun服务,可以看到其可以走fallback逻辑.
6.使用异步和reactive形式的Hystrix,修改getSubject()为Future,修改getNoun()为Observable.SentenceServiceImpl也做相应的修改.

@Service
public class WordServiceImpl implements WordService {

    @Autowired
    VerbClient verbClient;
    @Autowired
    SubjectClient subjectClient;
    @Autowired
    ArticleClient articleClient;
    @Autowired
    AdjectiveClient adjectiveClient;
    @Autowired
    NounClient nounClient;
    @Override
    @HystrixCommand(fallbackMethod = "getFallbackSubject")
    public Future getSubject() {
        return new AsyncResult() {
            @Override
            public String invoke() {
                return subjectClient.getWord();
            }
        };
    }

//    @Override
//    @HystrixCommand(fallbackMethod="getFallbackSubject")
//    public String getSubject() {
//        return subjectClient.getWord();
//    }



    @Override
    public String getVerb() {
        return verbClient.getWord();
    }

    @Override
    public String getArticle() {
        return articleClient.getWord();
    }

    @Override
    @HystrixCommand(fallbackMethod="getFallbackAdjective")
    public String getAdjective() {
        return adjectiveClient.getWord();
    }

    @Override
    @HystrixCommand(fallbackMethod="getFallbackNoun")
    public Observable getNoun() {
        return Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber observer) {
                try {
                    if (!observer.isUnsubscribed()) {
                        observer.onNext(nounClient.getWord());
                        observer.onCompleted();
                    }
                } catch (Exception e) {
                    observer.onError(e);
                }
            }
        });
    }
//    @HystrixCommand(fallbackMethod="getFallbackNoun")
//    public String getNoun() {
//        return nounClient.getWord();
//    }

    public String getFallbackSubject() {
        return "某人";
    }

    public String getFallbackAdjective() {
        return "";
    }

    public String getFallbackNoun() {
        return "某物";
    }
}

SentenceServiceImpl修改成下面

@Service
public class SentenceServiceImpl implements SentenceService {

    @Autowired WordService wordService;


    /**
     * Assemble a sentence by gathering random words of each part of speech:
     */
    public String buildSentence() {

        final List nounList = Lists.newArrayList();
        wordService.getNoun().subscribe(new Subscriber() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                nounList.add(s);
            }
        });

        try {
            return String.format("%s %s %s %s %s.", wordService.getSubject().get(), wordService.getVerb(),
                    wordService.getArticle(), wordService.getAdjective(), nounList.get(0));
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return "error";
    }

}

7.查看Hystrix dashboard可以看到方法调用的统计信息
访问http://127.0.0.1:8020/hystrix并输入http://127.0.0.1:8020/hystrix...可以查看Hystrix接口调用信息

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65039.html

相关文章

  • Hystrix 停止开发。。。Spring Cloud 何去何从?

    摘要:栈长得到消息,停止开发了。。。是一个轻量级的容错组件,其灵感来自于,主要为和函数式编程设计的看到这里,栈长表示学不动了。。。上面说了,官方推荐替代的开源组件,这个栈长也没有用过,查了下,资料也比较稀少。 showImg(https://segmentfault.com/img/remote/1460000017201104?w=1600&h=1066); 栈长得到消息,Hystrix ...

    陆斌 评论0 收藏0
  • Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。

    摘要:正式版在这天正式发布了,下面我们来看下有哪些更新内容。生命周期终止提醒版本将于正式退役,具体可以参考官方宣布版本作为的主要版本,的生命周期也会由版本的终止而终止。进入维护模式最近,宣布进入维护模式停止开发。。。 Spring Cloud Greenwich 正式版在 01/23/2019 这天正式发布了,下面我们来看下有哪些更新内容。 生命周期终止提醒 Spring Cloud Edg...

    Magicer 评论0 收藏0
  • Spring Cloud 参考文档(Hystrix超时和Ribbon客户端)

    摘要:要运行仪表板,请使用注解主类,然后访问并将仪表板指向客户端应用程序中的单个实例的端点。连接到使用的端点时,必须信任服务器使用的证书,如果证书不受信任,则必须将证书导入,以便仪表板成功连接到流端点。 Hystrix超时和Ribbon客户端 使用包装Ribbon客户端的Hystrix命令时,要确保将Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何可能的重试,例如,如果...

    pf_miles 评论0 收藏0
  • 深入理解Spring Cloud与微服务构建【二】 - 2.2 Spring Cloud

    摘要:负载均衡组件是一个负载均衡组件,它通常和配合使用。和配合,很容易做到负载均衡,将请求根据负载均衡策略分配到不同的服务实例中。和配合,在消费服务时能够做到负载均衡。在默认的情况下,和相结合,能够做到负载均衡智能路由。 2.2.1 简介 Spring Cloud 是基于 Spring Boot 的。 Spring Boot 是由 Pivotal 团队提供的全新 Web 框架, 它主要的特点...

    Rocko 评论0 收藏0
  • 2021 年最新基于 Spring Cloud 的微服务架构分析

    摘要:是一个相对比较新的微服务框架,年才推出的版本虽然时间最短但是相比等框架提供的全套的分布式系统解决方案。提供线程池不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务器雪崩的问题。通过互相注册的方式来进行消息同步和保证高可用。 Spring Cloud 是一个相对比较新的微服务框架,...

    cikenerd 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<