SpringCloud-04-Hystrix熔断机制(1)

mybatis配置

mybatis:

springcloud-api 模块下的pojo包

type-aliases-package: com.haust.springcloud.pojo

本模块下的mybatis-config.xml核心配置文件类路径

config-location: classpath:mybatis/mybatis-config.xml

本模块下的mapper配置文件类路径

mapper-locations: classpath:mybatis/mapper/*.xml

spring配置

spring:

application:

#项目名

name: springcloud-provider-dept

datasource:

德鲁伊数据源

type: com.alibaba.druid.pool.DruidDataSource

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf-8

username: root

password: root

Eureka配置:配置服务注册中心地址

eureka:

client:

service-url:

注册中心地址7001-7003

defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

instance:

instance-id: springcloud-provider-dept-hystrix-8001 #修改Eureka上的默认描述信息

prefer-ip-address: true #改为true后默认显示的是ip地址而不再是localhost

#info配置

info:

app.name: haust-springcloud #项目的名称

company.name: com.haust #公司的名称

  1. 修改controller

/**

  • @Auther: csp1999

  • @Date: 2020/05/17/22:06

  • @Description: 提供Restful服务

*/

@RestController

public class DeptController {

@Autowired

private DeptService deptService;

/**

  • 根据id查询部门信息

  • 如果根据id查询出现异常,则走hystrixGet这段备选代码

  • @param id

  • @return

*/

@HystrixCommand(fallbackMethod = “hystrixGet”)

@RequestMapping(“/dept/get/{id}”)//根据id查询

public Dept get(@PathVariable(“id”) Long id){

Dept dept = deptService.queryById(id);

if (dept==null){

throw new RuntimeException(“这个id=>”+id+“,不存在该用户,或信息无法找到~”);

}

return dept;

}

/**

  • 根据id查询备选方案(熔断)

  • @param id

  • @return

*/

public Dept hystrixGet(@PathVariable(“id”) Long id){

return new Dept().setDeptno(id)

.setDname(“这个id=>”+id+“,没有对应的信息,null—@Hystrix~”)

.setDb_source(“在MySQL中没有这个数据库”);

}

}

  1. 为主启动类添加对熔断的支持注解@EnableCircuitBreaker

/**

  • @Auther: csp1999

  • @Date: 2020/05/17/22:09

  • @Description: 启动类

*/

@SpringBootApplication

@EnableEurekaClient // EnableEurekaClient 客户端的启动类,在服务启动后自动向注册中心注册服务

@EnableDiscoveryClient // 服务发现~

@EnableCircuitBreaker // 添加对熔断的支持注解

public class HystrixDeptProvider_8001 {

public static void main(String[] args) {

SpringApplication.run(HystrixDeptProvider_8001.class,args);

}

}

总结思路

也就是假设我们调用一个服务中的方法的时候,我们为这个方法编写一个备用方法,如果说这个方法出现问题或者抛出异常的话,我们不是采用try catch而是为会通过 在原方法上添加注解@HystrixCommand(fallbackMethod = “备用方法名”),抛出异常直接执行备用方法,果断抛弃原有方法,从而返回的是一个与期望值类似的结果,而非404页面。所以称为 弃车保帅!

  • 因此,为了避免因某个微服务后台出现异常或错误而导致整个应用或网页报错,使用熔断是必要的

5.服务降级


接下来我们来说一下服务降级

5.1什么是服务降级

服务降级是指 当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运作或高效运作。说白了,就是尽可能的把系统资源让给优先级高的服务。

资源有限,而请求是无限的。如果在并发高峰期,不做服务降级处理,一方面肯定会影响整体服务的性能,严重的话可能会导致宕机某些重要的服务不可用。所以,一般在高峰期,为了保证核心功能服务的可用性,都要对某些服务降级处理。比如当双11活动时,把交易无关的服务统统降级,如查看蚂蚁深林,查看历史订单等等。

服务降级主要用于什么场景呢?当整个微服务架构整体的负载超出了预设的上限阈值或即将到来的流量预计将会超过预设的阈值时,为了保证重要或基本的服务能正常运行,可以将一些 不重要 或 不紧急 的服务或任务进行服务的 延迟使用 或 暂停使用。

在这里插入图片描述由上图可得,当某一时间内服务A的访问量暴增,而B和C的访问量较少,为了缓解A服务的压力,这时候需要B和C暂时关闭一些服务功能,去承担A的部分服务,从而为A分担压力,叫做服务降级。

举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就占用了JVM的不少内存与CPU资源,为了能把钱都收下来(钱才是目标),我设计了一个动态开关,把这些不重要的服务直接在最外层拒掉,这样处理后的后端处理收钱的服务就有更多的资源来收钱了(收钱速度更快了),这就是一个简单的服务降级的使用场景。

5.2 服务降级需要考虑的问题

  • 1)那些服务是核心服务,哪些服务是非核心服务

  • 2)那些服务可以支持降级,那些服务不能支持降级,降级策略是什么

  • 3)除服务降级之外是否存在更复杂的业务放通场景,策略是什么? 自动降级分类

自动降级分类(了解)

  • 1)超时降级:主要配置好超时时间和超时重试次数和机制,并使用异步机制探测回复情况

  • 2)失败次数降级:主要是一些不稳定的api,当失败调用次数达到一定阀值自动降级,同样要使用异步机制探测回复情况

  • 3)故障降级:比如要调用的远程服务挂掉了(网络故障、DNS故障、http服务返回错误的状态码、rpc服务抛出异常),则可以直接降级。降级后的处理方案有:默认值(比如库存服务挂了,返回默认现货)、兜底数据(比如广告挂了,返回提前准备好的一些静态页面)、缓存(之前暂存的一些缓存数据)

  • 4)限流降级:秒杀或者抢购一些限购商品时,此时可能会因为访问量太大而导致系统崩溃,此时会使用限流来进行限制访问量,当达到限流阀值,后续请求会被降级;降级后的处理方案可以是:排队页面(将用户导流到排队页面等一会重试)、无货(直接告知用户没货了)、错误页(如活动太火爆了,稍后重试)。

5.3 服务降级的使用(通过小Demo介绍)

思路:比如我们用Feign去调用一个公共的接口,然后通过url拼接去调用其他服务,如果我们想要实现服务降级,就是把即将要调用的那个服务停掉,此时我们在肯定会调用失败,返回一个404或者error界面,那么我们现在要做的就是避免这种情况,如何避免呢?我们采取的就是编写一个备用的公共的接口(重写多个方法),如果调用不到服务的话我们就调用这个备用的接口,然后就可以返回一个字符串,去提醒用户,服务不可用!

具体步骤:

  1. 编写备用公共的接口实现类,重写原接口中的方法!如图

原公共接口:在这里插入图片描述 备用接口实现类:在这里插入图片描述

  1. 如上图在原公共接口上添加注解@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)添加一个回调属性,

3.在yaml配置中开启服务降级

#开启降级feign.hystrix

feign:

hystrix:

enabled: true

完成!

6.服务熔断和降级的区别


了解完服务熔断和服务降级,我们来说一下它们之间的区别!

  • 服务熔断—>服务端:某个服务超时或异常,引起熔断~,类似于保险丝(自我熔断),类似于服务坏了去采取应对措施

  • 服务降级—>客户端:从整体网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时在客户端,我们可以准备一个 FallBackFactory ,返回一个默认的值(缺省值)。会导致整体的服务下降,但是好歹能用,比直接挂掉强。相当于我们主动的将原服务用一个备用方法去替代

  • 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)

  • 实现方式不太一样,服务降级具有代码侵入性(由控制器完成/或自动降级),熔断一般称为自我熔断。

7.实时监控Dashboard


这个监控面板监控的是,消费者去请求每个开启熔断并且被监控的服务,通过可视化去判断被监控服务受到多少次请求,抛出了多少次异常,发生了几次服务熔断!

7.1使用步骤:

1. 编写一个监控面板Dashboard

1.导入pom依赖

org.springframework.cloud

spring-cloud-starter-hystrix

1.4.6.RELEASE

org.springframework.cloud

spring-cloud-starter-hystrix-dashboard

1.4.6.RELEASE

2.简单的配置一下yaml文件(例如配置个端口号)

3.在主启动类当中添加注解 @EnableHystrixDashboard//开启了监控页面

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!

我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!
一共有20个知识点专题,分别是:

Dubbo面试专题

JVM面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Java并发面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Kafka面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MongDB面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MyBatis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

MySQL面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Netty面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

RabbitMQ面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Redis面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

Spring Cloud面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

SpringBoot面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

zookeeper面试专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

常见面试算法题汇总专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

计算机网络基础专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南

设计模式专题

这个GItHub上的Java项目开源了,2020最全的Java架构面试复习指南
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
中…(img-EhasPbeY-1713417283606)]

SpringBoot面试专题

[外链图片转存中…(img-e20Hxj1Q-1713417283606)]

zookeeper面试专题

[外链图片转存中…(img-k3nOT9Bi-1713417283606)]

常见面试算法题汇总专题

[外链图片转存中…(img-0NjVXw78-1713417283607)]

计算机网络基础专题

[外链图片转存中…(img-Gva1TdHE-1713417283607)]

设计模式专题

[外链图片转存中…(img-3WhHZCmY-1713417283607)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值