hystrix 的相关代码学习1

master
q 3 weeks ago
parent 6d01440d3f
commit 70b0eb3cbe

@ -1,29 +0,0 @@
## SpringCloud Netflix Hystrix
### SpringCloud Netflix Hystrix 概览
### 使用注解方式实现服务的容错、降级
### 使用编程方式实现服务的容错、降级
### 编程方式开启 Hystrix 请求缓存
### 注解方式开启 Hystrix 请求缓存
### 编程方式应用 Hystrix 请求合并
### 注解方式应用 Hystrix 请求合并
### OpenFeign 集成 Hystrix 开启后备模式
### 使用 Hystrix 监控面板监测客户端容错
### SpringCloud Netflix Hystrix 容错组件总结

@ -23,13 +23,15 @@
## 通用工程模块
- 通用服务 - [身份拦截]
-
- [dev-protocol-springcloud-project-mvc-config](dev-protocol-springcloud-project-mvc-config)
- [dev-protocol-springcloud-project-service-config](dev-protocol-springcloud-project-service-config)
- [dev-protocol-springcloud-project-service-sdk](dev-protocol-springcloud-project-service-sdk)
- 授权、鉴权中心微服务
- [dev-protocol-springcloud-project-authority-center](dev-protocol-springcloud-project-authority-center)
- 用户账户微服务
- [dev-protocol-springcloud-project-account-service](dev-protocol-springcloud-project-account-service)
- 商品微服务
- [dev-protocol-springcloud-project-goods-service](dev-protocol-springcloud-project-goods-service)
- 订单微服务
-
- 物流微服务

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

@ -0,0 +1,45 @@
## SpringCloud Netflix Hystrix
### SpringCloud Netflix Hystrix 概览
- Hystrix 是什么、设计目标是什么
- Hystrix 是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互
- Hystrix 通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现服务之间的容错
- Hystrix 有四大设计目标
- 对客户端访问的延迟和故障进行保护和控制
- 在复杂的分布式系统中阻止级联故障
- 快速失败,快速恢复
- 兜底回退,尽可能优雅的降级
---
- Hystrix 解决了什么问题
- 复杂分布式系统中服务之间存在许多依赖项,依赖项可能会存在故障,如果不做故障隔离整个服务可能会被拖垮
---
- Hystrix 是如何实现它的目标的
- 对依赖项(服务)进行包装代理,不直接与依赖项交互
- 调用超时时间允许自行设定,超时之后立刻熔断报错
- 每一个依赖项都在自己的空间内(线程池或信号量隔离),依赖项之间不存在干扰
- 请求依赖项失败后,可以选择出错或者是兜底回退
### 使用注解方式实现服务的容错、降级
### 使用编程方式实现服务的容错、降级
### 编程方式开启 Hystrix 请求缓存
### 注解方式开启 Hystrix 请求缓存
### 编程方式应用 Hystrix 请求合并
### 注解方式应用 Hystrix 请求合并
### OpenFeign 集成 Hystrix 开启后备模式
### 使用 Hystrix 监控面板监测客户端容错
### SpringCloud Netflix Hystrix 容错组件总结

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>dev-protocol</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>dev-protocol-springcloud-hystrix</artifactId>
<!-- 模块名及描述信息 -->
<name>dev-protocol-springcloud-hystrix</name>
<description>Hystrix 模块</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- spring cloud alibaba nacos discovery 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<!--
SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持可以将
SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用
-->
<build>
<finalName>${artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,17 @@
package org.example;
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.context.config.annotation.RefreshScope;
@SpringBootApplication
@EnableDiscoveryClient
@RefreshScope // 刷新配置
@EnableCircuitBreaker // 启动 Hystrix
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class, args);
}
}

@ -0,0 +1,38 @@
package org.example.controller;
import lombok.extern.slf4j.Slf4j;
import org.example.hystrix.UseHystrixCommandAnnotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* <h1>Hystrix Controller</h1>
* */
@Slf4j
@RestController
@RequestMapping("/hystrix")
public class HystrixController {
private final UseHystrixCommandAnnotation hystrixCommandAnnotation;
public HystrixController(UseHystrixCommandAnnotation useHystrixCommandAnnotation) {
this.hystrixCommandAnnotation = useHystrixCommandAnnotation;
}
/**
* 使, 1500ms -> http
*/
@GetMapping("/hystrix-command-annotation")
public List<ServiceInstance> getNacosClientInfoUseAnnotation(
@RequestParam String serviceId) {
log.info("request nacos client info use annotation: [{}], [{}]",
serviceId, Thread.currentThread().getName());
return hystrixCommandAnnotation.getNacosClientInfo(serviceId);
}
}

@ -0,0 +1,72 @@
package org.example.hystrix;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import lombok.extern.slf4j.Slf4j;
import org.example.service.NacosClientService4HystrixDemo;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
/**
* <h1>使 HystrixCommand </h1>
* */
@Slf4j
@Service
public class UseHystrixCommandAnnotation {
private final NacosClientService4HystrixDemo nacosClientService4HystrixDemo;
public UseHystrixCommandAnnotation(NacosClientService4HystrixDemo nacosClientService4HystrixDemo) {
this.nacosClientService4HystrixDemo = nacosClientService4HystrixDemo;
}
@HystrixCommand(
// 用于对 Hystrix 命令进行分组, 分组之后便于统计展示于仪表盘、上传报告和预警等等
// 内部进行度量统计时候的分组标识, 数据上报和统计的最小维度就是 groupKey
groupKey = "NacosClientService",
// HystrixCommand 的名字, 默认是当前类的名字, 主要方便 Hystrix 进行监控、报警等
commandKey = "NacosClientService",
// 舱壁模式
threadPoolKey = "NacosClientService",
// 后备模式 - 一定要写在当前类中, 要不不生效
fallbackMethod = "getNacosClientInfoFallback",
// 断路器模式
commandProperties = {
// 超时时间, 单位毫秒, 超时进 fallback
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500"),
// 判断熔断的最少请求数, 默认是10; 只有在一定时间内请求数量达到该值, 才会进行成功率的计算
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
// 熔断的阈值默认值 50, 表示在一定时间内有50%的请求处理失败, 会触发熔断
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "10"),
},
// 舱壁模式
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "101"),
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
// 在时间窗口中, 收集统计信息的次数; 在 1440ms 的窗口中一共统计 12 次
@HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"),
// 时间窗口, 从监听到第一次失败开始计时
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440")
}
)
public List<ServiceInstance> getNacosClientInfo(String serviceId) {
log.info("use hystrix command annotation to get nacos client info: [{}], [{}]",
serviceId, Thread.currentThread().getName());
return nacosClientService4HystrixDemo.getNacosClientInfo(serviceId);
}
/**
* <h2>getNacosClientInfo - Hystrix </h2>
* */
public List<ServiceInstance> getNacosClientInfoFallback(String serviceId) {
log.warn("can not get nacos client, trigger hystrix fallback: [{}], [{}]",
serviceId, Thread.currentThread().getName());
return Collections.emptyList();
}
}

@ -0,0 +1,38 @@
package org.example.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class NacosClientService4HystrixDemo {
private final DiscoveryClient discoveryClient;
public NacosClientService4HystrixDemo(DiscoveryClient discoveryClient) {
this.discoveryClient = discoveryClient;
}
/**
* <h2> Nacos Client </h2>
* */
public List<ServiceInstance> getNacosClientInfo(String serviceId) {
// 测试 UseHystrixCommandAnnotation 的超时
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
}
// 测试 NacosClientHystrixCommand 熔断
// throw new RuntimeException("has some error");
log.info("request nacos client to get service instance info: [{}]", serviceId);
return discoveryClient.getInstances(serviceId);
}
}

@ -0,0 +1,72 @@
server:
port: 8111
servlet:
context-path: /dev-protocol-springcloud-hystrix
spring:
application:
name: dev-protocol-springcloud-hystrix # 应用名称也是构成 Nacos 配置管理 dataId 字段的一部分 (当 config.prefix 为空时)
cloud:
nacos:
# 服务注册发现
discovery:
enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可
server-addr: 127.0.0.1:8848
# server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址
namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c
metadata:
management:
context-path: ${server.servlet.context-path}/actuator
# 配置管理
# config:
# prefix: imooc-e-commerce
# file-extension: yaml # 配置内容的数据格式, 默认为 properties
# enabled: true # 如果不想使用 Nacos 进行配置管理, 设置为 false 即可
# group: DEFAULT_GROUP # 组, 默认为 DEFAULT_GROUP
# namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c
# server-addr: 127.0.0.1:8848
kafka:
bootstrap-servers: 127.0.0.1:9092
producer:
retries: 3
consumer:
auto-offset-reset: latest
sleuth:
sampler:
# ProbabilityBasedSampler 抽样策略
probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1
# RateLimitingSampler 抽样策略, 设置了限速采集, spring.sleuth.sampler.probability 属性值无效
rate: 100 # 每秒间隔接受的 trace 量
zipkin:
sender:
type: kafka # 默认是 web
base-url: http://localhost:9411/
# Feign 的相关配置
feign:
# feign 开启 gzip 压缩
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json
min-request-size: 1024
response:
enabled: true
# 禁用默认的 http, 启用 okhttp
httpclient:
enabled: false
okhttp:
enabled: true
# OpenFeign 集成 Hystrix
hystrix:
enabled: true
# 暴露端点
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always

@ -0,0 +1,58 @@
### 获取 Token
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/rest-template
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}
### 获取 Token, 带有负载均衡
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/rest-template-load-balancer
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}
### 通过 Ribbon 去获取 Token
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/ribbon
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}
### 通过原生 Ribbon Api 去获取 Token
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/thinking-in-ribbon
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}
### 通过 OpenFeign 获取 Token
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/token-by-feign
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}
### 通过原生 Feign Api 获取 Token
POST http://127.0.0.1:8000/ecommerce-nacos-client/communication/thinking-in-feign
Content-Type: application/json
{
"username": "Qinyi@imooc.com",
"password": "25d55ad283aa400af464c76d713c07ad"
}

@ -0,0 +1,35 @@
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/hystrix-command-annotation?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/simple-hystrix-command?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/hystrix-observable-command?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/cache-hystrix-command?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/cache-annotation-01?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/cache-annotation-02?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/cache-annotation-03?serviceId=e-commerce-nacos-client
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/request-merge
Content-Type: application/json
### 根据提供的 serviceId 获取实例信息
GET http://127.0.0.1:8000/dev-protocol-springcloud-hystrix/hystrix/request-merge-annotation
Content-Type: application/json

@ -0,0 +1,13 @@
### 查询服务实例信息
GET http://127.0.0.1:8000/ecommerce-nacos-client/nacos-client/service-instance
Accept: application/json
### 动态从 Nacos Server 中获取配置信息
GET http://127.0.0.1:8000/ecommerce-nacos-client/nacos-client/project-config
Accept: application/json
### 查看 Sleuth 跟踪信息
GET http://127.0.0.1:9001/imooc/ecommerce-nacos-client/sleuth/trace-info
Accept: application/json
e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjE3LFwidXNlcm5hbWVcIjpcIkltb29jUWlueWlAaW1vb2MuY29tXCJ9IiwianRpIjoiMGIxNzQyYWItMWU3OC00OTZjLWIyNTAtMjNkZGQ1ZGEyZTU1IiwiZXhwIjoxNjI0MjA0ODAwfQ.QKGHzohSHdYDHzUVHpe9gNPUgzfkPwrSbB-WiMWYjLlt2tr9BufzZM8bSt-whb_bd0hKoC6rkYYO0WUVR67uSML-2yaTL1xMIn8GH9Flyig3rpO4vefL3Hp2TXIpwHHa7WlKsLzcUpNk9lxWs2B5k0ICdYCH_jD5Tx6N7CzfSUG9u4fOnVeM9UFE2nX_DURupUh_DKCc2oOoMeyCSR7Ma8-Ab4WQU3r-U0YivR8G1A0kmKOIoTeRhM3LcPuxUPh3rCbrjzMg--fexRGw0O38Qsby6pz-ku2IlTyFXY6_jNOG1BZR34-jBOnaIciP1TExw9bFumeuC2GcowTHJVH1Nw
token: imooc

@ -0,0 +1,97 @@
## SpringCloud 计划
- 工程模块开发
- https://coding.imooc.com/class/chapter/522.html#Anchor
- SpringCloud Netflix Hystrix 实现微服务容错
- 基于 SpringCloud Stream 构建消息驱动微服务
- Seata分布式事务解决方案
- 订单微服务
- 物流微服务
- 基于 SpringCloud Alibaba Sentinel 实现网关动态限流
- 微服务工程部署与整体可用性验证
- https://coding.imooc.com/class/chapter/508.html#Anchor
- 实践补充
- Nacos
- https://coding.imooc.com/class/chapter/611.html#Anchor
- Nacos基础核心特性揭秘
- 搭建Nacos源码环境
- Nacos核心特性实现原理深度剖析
- 窥探Nacos内核
- 构造热插拔的Nacos插件
- 探秘Nacos云原生体系
## 高并发处理
- 高并发
- https://coding.imooc.com/class/chapter/604.html#Anchor
- 秒杀购物商城基础服务组件
- MINIO实现OSS服务
- 实现RateLimter限流组件的服务
- Redission+Disruptor实现延时队列组件
- 通过 Redis + RedLock实现分布式锁的实现组件
- 通过XXLJOB分布式任务调度的服务组件
- 基于Guava+SpringListener实现异步组件事件总线EventBus机制
- 百度开源的分布式高性能的唯一ID生成器UidGenerator
- 秒杀购物商城业务服务--秒杀活动服务
- 秒杀购物商城业务服务--商品中心
- 秒杀购物商城业务服务--订单中心
- 中间件
- Redis 使用
- MQ 使用
- Kafka 使用
- 一轮复习
- https://coding.imooc.com/class/856.html
- 基础
- 框架 Spring, SpringBoot, SpringCloud
- Mysql, Redis, Kafka, MQ
- 项目
- 广告监测项目
- 存储
- 分布式消息队列治理
- 电商项目
- 秒杀模块
- 业务模块架构
- 二轮复习
- https://coding.imooc.com/class/chapter/500.html#Anchor
- 分析 Java 线程堆栈
- JVM 性能调优
## 大数据
- 综合项目:三度关系推荐系统+数据中台
- 电商实时数据仓库(湖仓一体)设计与实战
## 其他
- JS 逆向
- 安卓逆向
- 渗透
## AI - (不建议学, 了解即可)
- https://class.imooc.com/llmappdev#Anchor
-
- 业务模块架构编写
- 高并发场景处理

@ -61,6 +61,7 @@
<module>dev-protocol-springcloud/dev-protocol-springcloud-project-service-config</module>
<module>dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk</module>
<module>dev-protocol-springcloud/dev-protocol-springcloud-project-goods-service</module>
<module>dev-protocol-springcloud/dev-protocol-springcloud-hystrix</module>
</modules>
<properties>

Loading…
Cancel
Save