含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。这个设置也不影
从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用于 商业用途,否则侵权。
77. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下?
进入dbastudio,历程--〉数据库---〉归档查看。
这篇文章介绍一下阿里开源的流量防卫兵Sentinel,一款非常优秀的开源项目,经过近10年的双十一的考验,非常成熟的一款产品。
sentinel顾名思义:卫兵;在Redis中叫做哨兵,用于监控主从切换,但是在微服务中叫做流量防卫兵。
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
流控模式总共分为三种,对应元素strategy
,分别如下:
下面来详细介绍下以上三种流控模式。
顾名思义:默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
。上面的几个例子都是配置了直接拒绝这个模式,这里不再详细介绍。
典型的使用场景:一个是支付接口,一个是下单接口,此时一旦支付接口达到了阈值,那么订单接口就应该被限流,不然这边还在下单,消费者等待或者直接被拒绝支付将会极大的影响用户体验。
简而言之:A关联B,一旦B达到阈值,则A被限流
演示一下效果,创建以下两个接口:
此时的流控规则配置如下图:
注意:关联之后,这里设置的限流规则是对被关联资源,也就是/sentinel/pay
这个资源,但是真正被限流则是/sentinel/order
。
如何演示效果呢?很简单,只需要不断的请求/sentinel/pay
达到阈值,然后在请求/sentinel/order
。
流控分为两种统计类型,分别是QPS,并发线程数,很多人不太明白这两种统计类型有什么区别?
举个栗子:陈某带了一个亿去银行存钱,但是银行大门保安要查健康码,每秒最多只能同时进入4个人,并且银行中只有两个工作人员工作,如下图:
此时的QPS含义:从保安到银行这一段,即是保安放行进入银行的人数。
此时并发线程数的含义:银行只有两个工作人员在工作,那么最多只能同时处理两个任务,这里并发线程数的阈值就是2。
熔断降级在日常生活中也是比较常见的,场景如下:
在大型的分布式系统中,一个请求的依赖如下图:
如果这个时候,某个服务出现一些异常,比如:
那么将会导致整个服务不可用,用古话来讲就是:千里之堤毁于蚁穴。
所谓编程源于生活,架构师们根据生活的经验设计出了服务的熔断降级策略,很好的解决了这类问题。
熔断降级规则对应sentinel控制台的降级规则这一栏,如下图:
熔断降级涉及到的几个属性如下表:
在控台为这个接口设置平均响应时间为200毫秒,时间窗口为1秒,大致意思:平均的响应时间大于200毫秒之后,在接下来的1秒时间内将会直接熔断,如下图:
使用Jmeter开启10个线程循环跑,然后在浏览器中访问这个接口,返回结果如下图:
为什么呢?由于的接口中休眠了3秒,平均响应时间肯定大于200毫秒,因此直接被熔断了。
注意:这里熔断后直接返回默认的信息,后面会介绍如何定制熔断返回信息。
顾名思义:热点就是经常访问的数据,很多时候肯定是希望统计某个访问频次Top K
数据并对其进行限流。
比如秒杀系统中的商品ID,对于热点商品那一瞬间的并发量是非常可怕的,因此必须要对其进行限流。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。
注意:热点参数限流只针对QPS。
系统规则的配置比较简单,这里以入口QPS为例进行演示,为了演示真实情况,清掉所有的限流规则,添加系统规则,如下图:
可以看到已经被限流了,不仅是这个接口,所有接口都会生效。
注意:系统规则中的入口QPS这个规则不建议配置,一旦配置上了可能导致整个服务不可用。
很显然默认的异常信息并不能满足我们的业务需求,因此我们需要根据前后端规则制定自己的异常返回信息。
这里将会用到一个注解@SentinelResource
,这个在上文也是提到过,这个注解中有两个关于限流兜底方法的属性,如下:
BlockException
的函数名称。blockHandler 函数访问范围需要是 public
,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为
下面定义一个创建订单的接口,手动制造一个1/0
异常,代码如下:
上述接口并没有进行异常降级处理,因此调用该接口直接返回了异常信息,非常不友好,如下图:
我们可以使用fallback
指定异常降级的兜底方法,此时业务方法改造如下:
使用fallbackClass
属性指定单独一个类处理异常降级,降低了代码的耦合度,fallback
属性指定了降级兜底的方法,代码如下:
此时再次访问接口,虽然有异常,但是返回的确实降级兜底方法中的返回信息,如下图:
到了这里基本满足了异常降级的处理需求,但是仍然有个疑问:能否只用一个方法处理全部的异常?
答案是:能,必须能,此时就要用到defaultFallback
这个属性了,指定默认的降级兜底方法,此时的业务方法变成如下代码:
defaultFallback
属性指定了默认的降级兜底方法,这个方法代码如下:
好了,异常降级处理到这儿已经介绍完了,但是仍然有一个问题:若 blockHandler 和 fallback 都进行了配置,那么哪个会生效?
此时不配置任何规则,直接访问接口,可以看到这里直接进入了异常降级处理,如下图:
我们对createOrder
这个资源配置降级规则:60秒内如果出现2个以上的异常直接限流,如下图:
此时我们再次访问这个接口,可以看到前两次直接进入了fallback
指定的方法中(并未达到限流的异常数阈值),两次之后就被限流了,进入了blockHandler
方法中,效果如下图:
顾名思义,黑名单就是拉黑呗,拉黑就是不能访问了呗,sentinel能够针对请求来源进行是否放行,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
sentinel控制台对应得规则配置如下图:
这里有个问题:请求来源是什么,怎么获取?
Sentinel提供了一个接口RequestOriginParser
,我们可以实现这个接口根据自己业务的规则解析出请求来源名称。
下面我以IP作为区分请求来源,代码如下:
sentinel默认的持久化只能从nacos推送到sentinel控制台,但是实际生产中肯定是双向修改都能推送的,这个如何解决呢?
其实sentinel官方文档就有说到解决方法,不过需要自己修改sentinel控制台的源码来实现。
这个还是比较复杂的,sentinel只帮我们实现了流控规则的demo,其他的还是要自己修改,这点不太人性化....
这一块内容在后续介绍到网关的时候会详细讲,这里就不再细说了,有想要了解的可以看官方文档。
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)