什么是Spring Cloud Netflix Hystrix?react
怎么用 Spring Cloud Netflix Hystrix?spring
Hystrix常见配置介绍服务器
Spring Cloud Netflix Hystrix是分布式系统处理超时和错误的机制,以下图所示,分布式系统中某个用户请求依赖A,H,I,P服务.
当此请求并发超过50的时候,服务I处理速度变慢,可是服务I仍是被调用.
大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有不少的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时若是没有隔离措施,当前应用服务就有被拖垮的风险.
Spring Cloud Netflix Hystrix就是隔离措施的一种实现,能够设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提升分布式系统的稳定性.架构
百说不如一run,构造一个例子来实现,例子要实现使用Hystrix的Fallback(失败后)逻辑来处理错误情景
1.Eureka Server,和Eureka Client跟以前同样,只需改造Eureka Sentence
2.Eureka Sentence 添加pom依赖并发
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId> </dependency>
3.Eureka Sentence的Application添加hystrix注解dom
@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<String> getSubject() { return new AsyncResult<String>() { @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<String> getNoun() { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> 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修改为下面ide
@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<String> nounList = Lists.newArrayList(); wordService.getNoun().subscribe(new Subscriber<String>() { @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接口调用信息高并发