点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
Never be dependent anyone in this world . Because even your shadow leaves you when you’re in the dark.
在这个世上不要过分依赖任何人,因为即使是你的影子都会在某些时候离开你。
每日掏心话
学会坚强,因为这样才热衷于生命的意义。学会快乐,因为只有开心度过每一天,活得才精彩。
来自:XuePeng77 | 责编:乐乐
链接:my.oschina.net/u/2450666/blog/1499040
程序员小乐(ID:study_tech)第 923 次推文 图源:百度往日回顾:MySQL常用函数,你真得看看!
正文
手把手教你SpringBoot+SpringCloud系列共8篇:
1、(一)手把手教你 SpringBoot + SpringCloud 开发环境搭建
2、(二)手把手教你 SpringBoot + SpringCloud —— 使用Eureka实现服务注册与发现!
3、(三)手把手教你 SpringBoot+SpringCloud —— 高可用的Eureka注册中心
4、(四)手把手教你 SpringBoot+SpringCloud--Eureka注册中心的机制与配置
5、(五)手把手教你 SpringBoot+SpringCloud —— Ribbon负载均衡与配置
6、(六)手把手教你 SpringBoot+SpringCloud --集成 MyBatis
在一个项目中,系统可能被拆分成多个服务,例如用户、订单和库存等。
这里存在这服务调用服务的情况,例如,客户端调用订单服务,订单服务又调用库存服务。
此时若库存服务响应缓慢,会直接导致订单服务的线程被挂起,以等待库存申请服务的响应,在漫长的等待之后用户会因为请求库存失败而得到创建订单失败的结果。
如果在高并发下,因这些挂起的线程在等待库存服务的响应而未能获得释放,会似的后续到来的请求被阻塞,最终导致订单服务也不可用。
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,而不是漫长的等待。
首先,添加断路器hystrix的依赖。
org.springframework.cloud
spring-cloud-starter-hystrix
接着在工程的主类,添加注解@EnableCircuitBreaker:
package cn.net.bysoft.owl.bookstore.web.console;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class OwlBookstoreWebConsoleApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OwlBookstoreWebConsoleApplication.class, args);
}
}
接着,就可以使用断路器了,可以添加@HystrixCommand注解,对调用服务的方法进行修饰:
@HystrixCommand(fallbackMethod = "findByIdFallback")
public User findById(Long id) {
UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://SERVICE-USER/users/{id}").build()
.expand(id).encode();
URI uri = uriComponents.toUri();
return restTemplate.getForObject(uri, User.class);
}
public User findByIdFallback(Long id) {
return null;
}
fallbackMethod是服务发生异常时,回调的降级处理函数,该函数的参数和返回值要与调用函数一致。
断路器的默认超时时间为2000毫秒。当被断路器修饰的函数执行超过这个值,将触发断路器的服务降级,该参数是可以设置的。
全局配置属性:hystrix.[attr].default.
实例配置属性:hystrix.[attr].[key].
Command Properties
requestCache.enabled(是否启用缓存)
requestLog.enabled(执行的时间是否打印到日志)
metrics.rollingStats.timeInMilliseconds(滚动时间窗长度,毫秒级)
metrics.rollingStats.numBuckets(滚动时间窗统计指标信息时划分“桶”的数量)
metrics.rollingPercentile.enabled(对命令执行的延迟是否使用百分位数来跟踪和计算)
metrics.rollingPercentile.timeInMilliseconds(设置百分位统计的滚动窗口的持续时间)
metrics.rollingPercentile.numBuckets(设置百分位统计滚动窗口中使用“桶”的数量)
metrics.rollingPercentile.bucketSize(设置在执行过程中每个“桶”中保留的最大执行次数)
metrics.healthSnapshot.intervalInMilliseconds(采集健康快照的间隔等待时间)
circuitBreaker.enabled (断路器开关)
circuitBreaker.requestVolumeThreshold (断路器请求阈值)
circuitBreaker.sleepWindowInMilliseconds(断路器休眠时间)
circuitBreaker.errorThresholdPercentage(断路器错误请求百分比)
circuitBreaker.forceOpen(断路器强制开启)
circuitBreaker.forceClosed(断路器强制关闭)
fallback.isolation.semaphore.maxConcurrentRequests(fallback方法执行的最大并发请求数,当达到最大,后续的请求将会被拒绝并抛出异常)
fallback.enabled(服务降级策略是否启用)
execution.isolation.strategy (执行的隔离策略)
execution.isolation.thread.timeoutInMilliseconds(执行的超时时间)
execution.timeout.enabled(是否启用超时时间)
execution.isolation.thread.interruptOnTimeout(超时发生后是否要中断该服务)
execution.isolation.thread.interruptOnCancel(执行被取消后是否要中断该服务)
execution.isolation.semaphore.maxConcurrentRequests(当最大并发达到该值,后续的请求会被拒绝)
Execution
Fallback
Circuit Breaker
Metrics
Request Context
Collapser Properties
maxRequestsInBatch(请求合并批处理中允许的最大请求数)
timerDelayInMilliseconds(批处理过程中每个命令延迟的时间,毫秒级)
requestCache.enabled(是否开启请求缓存)
Thread Pool Properties
coreSize(线程池大小)
maxQueueSize(最大队列数量)
queueSizeRejectionThreshold (队列大小拒绝阈值)
metrics.rollingStats.timeInMilliseconds(滚动时间窗的长度,毫秒级)
metrics.rollingStats.numBuckets(滚动时间窗被划分的数量)
获取项目源码:在公众号后台回复“STS”即可获得。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。欢迎加入程序员小乐技术交流群,在后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
还在用笨重的ELK?日志系统新贵Loki 了解一下
Lombok经常用,却不知道它的原理是什么
如何编写最佳的Dockerfile?这篇给你整的明明白白的!
关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?