文章目录
说在前边:这里pom文件中统一没有添加版本号,是因为在父项目中规定了对应的版本号。
父项目中规定的版本:
<!--定义版本号-->
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
</properties>
<!--只负责jar的管理不负责加载的下载 如何子模块需要使用某个jar
需要在子模块中自己引用下载 只是在子模块中无需再引用本版号-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Hystrix 简介
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失 败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。
- 跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix可以自动或手动跳闸,停止请求该服务一段时间。
- 资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满, 发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。
- 监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
- 回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。
- 自我修复:断路器打开一段时间后,会自动进入“半开”状态。
2. 实现服务熔断
1. Rest实现服务熔断
4步:
1. 在pom中添加依赖
2. 修改主启动类
3. 修改业务使用
1. pom文件
在pom中添加hystrix相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2. 修改主启动类
在主启动类上添加注解 @EnableCircuitBreaker
@SpringBootApplication
// 使用 eureka 作为注册中心
@EnableEurekaClient
// 开启熔断器
@EnableCircuitBreaker
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class, args);
}
}
3. 修改业务
在可能需要熔断的方法上加上注解 @HystrixCommand
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("buy/{id}")
@HystrixCommand(fallbackMethod = "orderFallBack") //SentinelResources
public Product buy(@PathVariable("id") Long id){
return restTemplate.getForObject("http://SHOP-PRODUCT-SERVICE/product/"+id,Product.class);
}
//降级方法
public Product orderFallBack(Long id){
Product product = new Product();
product.setProductDesc("由于网络原因,请稍后在访问!");
return product;
}
}
注意:
为 findById方法编写一个回退方法orderFallBack,回退方法 与 容错方法具有相同的参数与返回值类型,该方法返回一个默认的错误信息。
4. 默认Fallback
为一个类指定一个默认的 fallback 方法进行兜底
@RestController
@RequestMapping("order")
// 指定默认的 fallback 进行托底
@DefaultProperties(defaultFallback = "orderFallbackMethod")
public class OrderController {
@GetMapping("addOrder/{pid}")
public String addOrder(@PathVariable("pid") Integer pid) {
return res;
}
// 默认的兜底方法
public String orderFallbackMethod(){
return "fallbackMethod 返回的~~~~~~~~~~~";
}
}
注意:
默认的兜底方法不能有参数,必须是一个无参的方法。
5. 超时时长设置
Hystix的默认超时时长为1,我们可以通过配置修改这个值:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
2. Feign 方式实现熔断
SpringCloud Fegin默认已为Feign整合了hystrix,所以添加Feign依赖后就不用在添加hystrix,那么怎么才能让Feign的熔断机制生效呢,只要按以下步骤开发:
注: 我还是添加了 hystrix 的依赖,去掉之后我的项目会类找不到的错误
4步:
- 修改pom文件
- 修改yml文件
- 修改主启动类
- 修改业务类
1. pom文件
在pom文件中添加 openfeign 的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. yml文件
在yml文件中配置 feign 使用 hystrix 熔断
feign:
hystrix:
enabled: true
3. 主启动类
在主启动类配置 @FeignClient
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class, args);
}
}
4. 写业务
1. 编写 Feign 接口
该接口代理调用的其他服务的方法
@FeignClient(name = "shop-product", fallback = IProductFeignImpl.class)
public interface IProductFeign {
// 要访问的服务的方法的路径
@GetMapping("/product/getProduct/{pid}")
String getProduct(@PathVariable("pid") Integer pid);
}
@FeignClient(name = "shop-product", fallback = IProductFeignImpl.class)
该注解 name 属性是远程服务的名称, fallback 是实现了该接口的一个类,对应接口的实现方法就是对应的兜底方法(降级方法)
2. 写实现类
Feign接口的实现类的具体业务,就是兜底方法的业务。
@Component // 这个注解不能少
public class IProductFeignImpl implements IProductFeign {
@Override
public String getProduct(Integer pid) {
// 降级的业务逻辑
}
}
@Component
这个注解不能少
修改 feign 的超时时间
默认feign的超时时间是 1s
可以通过 yml 配置 feign 的超时时间,由于 feign 内部使用了 Ribbon,所以只需要设置 Ribbon的超时间就可以修改 feign 的超时时间了。
ribbon:
ReadTimeout: 3000 # 设置为3s
3.搭建 Hystrix 的DashBoard控制台
Hystrix官方还提供了基于图形化的DashBoard(仪表板)监控平 台。Hystrix仪表板可以显示每个断路器(被@HystrixCommand注解的方法)的状态。
三步:
- 修改pom文件
- 修改yml文件
- 修改主启动类
1. pom文件
在pom文件中添加 actuator、hystrix、hystrix-dashboard的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>
2. yml 文件
在yml中配置可以监控哪些资源
hystrix:
dashboard:
proxy-stream-allow-list: "*"
management:
endpoints:
web:
exposure:
include: "*"
3. 修改启动类
在启动类上使用 @EnableHystrixDashBoard
的注解
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker
@EnableHystrixDashboard
public class OrderApp {
public static void main(String[] args) {
SpringApplication.run(OrderApp.class, args);
}
}
4. 测试访问
在浏览器上输入 : http://localhost:服务端口号/hystrix/
进入查看详细数据
这个服务端口号,就是配置有hystrix熔断控制台的服务的端口号
在框住的位置中输入对应的地址,只需要修改为自己的端口即可
http://localhost:端口号/actuator/hystrix.stream
然后点击 下方的 Monitor Stream 按钮,就可以进入监控页面了
这时再访问这个服务中的任意方法,这里都可以监控到。