一、概念
微服务框架的一站式解决方案,集成多个Netflix公司开发组件,如Hystrix,Eureka、Zuul等。
二、作用(优点)
1.服务内部关联性强。各服务松耦合,可独立开发、部署
2.业务逻辑简化易于理解,开发难度降低
3.每个服务可用不同语言开发
4.每个服务可有自己的数据库,也可整个微服务使用同一个数据库
三、缺点
1.运维成本增加
四、核心组件
1、网关
常见组件:
Netflix Zuul
Spring Cloud Gateway(Spring官方基于Spring5.0,Springboot2.0开发的高性能网关,逐渐取代了Zuul)
作用:
①鉴权校验
②路由转发
③限流熔断
④API监控
2、注册中心
1.常见组件:
Zookeeper
Netflix Eureka
Alibaba Nacos
2.作用:
3.其他:
1.CAP理论
3、负载均衡
常见组件:
Netflix Ribbon
Nignx
作用:
4、远程调用
常见组件:
Netflix Fegin
Alibaba Dubbo的Rpc
作用:
5、熔断器
1.常见组件
Netflix Hystrix
2.概念:在微服务、分布式等多服务模式的系统中,用于容错、故障处理。通过资源隔离、熔断、降级回退、限流、实时监控等方式预防因依赖服务故障而招致的级联故障(也称,雪崩效应)。
3.作用:防止级联故障。
4.使用实现:
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.启动类加@EnableCircuitBreaker或@EnableHystrix(此注解包含@EnableCircuitBreaker,都是用于启动Hystrix断路器的作用,区别在于@EnableCircuitBreaker还可以启动其他的断路器,例如Resilience4j)
3.在Controller层的方法上,使用@HystrixCommand注解进行配置功能(具体看下面5.3.1-4降级策略)。或者直接在配置文件进行配置(具体看下面5.3.5配置文件)
5.服务降级
1.概念:当访问依赖系统发生请求失败、超时、拒绝等情况,会根据会进入定义的回退方法中,返回相对友好的错误提示或者备用应答逻辑。
2.作用:防止级联故障,返回友好提示。
3.降级策略:
参考链接:https://blog.csdn.net/qq_34561892/article/details/128022263
注:@HystrixCommand的注解配置优先级高于配置文件
1.熔断降级
/**
* circuitBreaker.enabled:是否开启断路器,默认true
*
* circuitBreaker.requestVolumeThreshold:请求数量的阈值,默认20
*
* circuitBreaker.errorThresholdPercentage:失败的比例阈值,默认50
*
* circuitBreaker.sleepWindowInMilliseconds:熔断的时长,默认5000
*
* metrics.rollingStats.timeInMilliseconds:统计请求数量的时间段长短,默认10000
*
* @return
* /
@HystrixCommand(
fallbackMethod = "circuitBreakerFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED, value = "true"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD, value = "20"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE, value = "50"),
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS, value = "20000"),
@HystrixProperty(name = HystrixPropertiesManager.METRICS_ROLLING_STATS_TIME_IN_MILLISECONDS, value = "5000")
}
)
2.超时降级
/**
* execution.timeout.enabled:是否开启请求超时,默认true
*
* execution.isolation.thread.timeoutInMilliseconds:请求的超时时间,默认10000
*
* execution.isolation.thread.interruptOnTimeout:当请求超时时,是否中断线程,默认true
*
* @return
*/
@HystrixCommand(
fallbackMethod = "timeoutFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_TIMEOUT_ENABLED, value = "true"),
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "5000"),
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_INTERRUPT_ON_TIMEOUT, value = "true"),
}
)
3.线程池隔离
/**
* execution.isolation.strategy:资源隔离策略,支持THREAD、SEMAPHORE。默认THREAD
*
* coreSize:线程池的核心线程数,默认10
*
* maximumSize:线程池的最大线程数,默认10(实际在操作中无法识别该属性,待后期版本验证)
*
* allowMaximumSizeToDivergeFromCoreSize:是否使maximumSize参数生效,默认false(实际在操作中无法识别该属性,待后期版本验证)
*
* maxQueueSize:默认-1(如果是-1,则线程池的内部的队列使用SynchronousQueue,否则使用LinkedBlockingQueue)
*
* keepAliveTimeMinutes:线程池中的线程的生存时间(单位:分钟),默认1
*
* queueSizeRejectionThreshold:线程池中的队列长度达到多少就可以拒绝添加任务,即使队列长度没有达到 maxQueueSize。因为阻塞队列的maxQueueSize不能动态调整,所以引用这个参数来动态调整拒绝任务时的队列长度。默认5。
*
* @return
*/
@HystrixCommand(
fallbackMethod = "isolationThreadPoolFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "THREAD")
},
threadPoolProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CORE_SIZE, value = "1"),
@HystrixProperty(name = HystrixPropertiesManager.MAX_QUEUE_SIZE, value = "-1"),
@HystrixProperty(name = HystrixPropertiesManager.QUEUE_SIZE_REJECTION_THRESHOLD, value = "1"),
@HystrixProperty(name = HystrixPropertiesManager.KEEP_ALIVE_TIME_MINUTES, value = "1")
}
)
4.信号量隔离(3、4统称,资源隔离)
/**
* execution.isolation.strategy:资源隔离策略,支持THREAD、SEMAPHORE。默认THREAD
*
* execution.isolation.semaphore.maxConcurrentRequests:信号量隔离中的最大并发请求数,默认10
*
* @return
*/
@HystrixCommand(
fallbackMethod = "isolationSemaphoreFallback",
commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS, value = "2")
}
)
5.配置文件
hystrix:
command:
default:
circuitBreaker:
enabled: true
requestVolumeThreshold: 20
errorThresholdPercentage: 50
sleepWindowInMilliseconds: 5000
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 2000
interruptOnTimeout: true
semaphore:
maxConcurrentRequests: 10
strategy: THREAD
metrics:
rollingStats:
timeInMilliseconds: 10000
threadpool:
default:
coreSize: 10
maximumSize: 19
allowMaximumSizeToDivergeFromCoreSize: false
keepAliveTimeMinutes: 1
maxQueueSize: -1
queueSizeRejectionThreshold: 5
6.监控服务
参考链接:https://blog.csdn.net/qq_39826207/article/details/130116691
1.Actuator服务监控
1.背景:是Spring Boot提供的一个专门用于监控应用程序的starter启动器
2.使用实现
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.配置文件
management:
endpoints:
web:
exposure:
include: hystrix.stream # 开放Hystrix监控访问的端口
endpoint:
hystrix:
stream:
enable: true # 再次声明,开放Hystrix监控端口
2.DashBoard 单一仪表盘
1.使用实现
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.启动类加@EnableHystrixDashboard注解
3.配置文件
hystrix:
dashboard:
proxy-stream-allow-list: localhost
management:
endpoints:
web:
exposure:
include: hystrix.stream # 开放Hystrix监控访问的端口
endpoint:
hystrix:
stream:
enable: true # 再次声明,开放Hystrix监控端口
3.Turbine 聚合仪表盘(多个服务一起查看)
1.添加依赖
2.启动类添加
3.配置文件
7.其他
1.级联故障
概念:分布式系统中,某服务发生故障Down掉,导致其他依赖此服务的其他服务一起Down掉,久而久之会导致整个系统一起瘫痪。
原因:分布式或微服务间的相互调用采用的是HTTP、RPC,一般都会设置请求超时、失败重试等机制,为了保证调用成功。再未设置熔断机制时,就会导致调用故障服务的其他服务发生请求堆积,不断消耗内存、CPU,慢慢Down掉,以此类推。