如非授权,禁止用于商业用途,转载请注明出处
作者:mynewworldyyl

 

1. 使用服务熔断降级特性,必须先启动Pubsub服务,服务监听服务,熔断器服务3个服务

先启动Pubsub及服务监听两个服务,先不用管其细节,启动的方式都是一样的,先构建(如果还没有构建),然后启动

1.1 启动Pubsub

新打开一个新的CMD窗口,CD进入/jmicro.pubsub,运行

mvn clean install -Pbuild-main  (只需构建一次,以后可以重复运行)

运行pubsub服务

java -jar target/jmicro.pubsub-0.0.1-SNAPSHOT-jar-with-dependencies.jar

1.2 启动服务监听服务

新打开一个新的CMD窗口,CD进入/jmicro.main.monitor.exception,运行

mvn clean install -Pbuild-main  (只需构建一次,以后可以重复运行)

运行pubsub服务

java -jar target/jmicro.main.monitor.exception-0.0.1-SNAPSHOT-jar-with-dependencies.jar

1.3 启动熔断器服务

新打开一个新的CMD窗口,CD进入/jmicro.breaker,运行

mvn clean install -Pbuild-main  (只需构建一次,以后可以重复运行)

运行breaker服务

java -jar target/jmicro.breaker-0.0.1-SNAPSHOT-jar-with-dependencies.jar

2. 开发支持可熔断服务

同样基于org.jmicro.example.rpc.impl.SimpleRpcImpl开发,hello方法的SMethod增加属性实现。

@Service(maxSpeed=-1,baseTimeUnit=Constants.TIME_SECONDS)
@Component
public class SimpleRpcImpl implements ISimpleRpc {

    @Override
    @SMethod(
        //1秒钟内异常超50%,熔断服务,熔断后每80毫秒做一次测试
        breakingRule = @SBreakingRule(enable=true,breakTimeInterval=1000,percent=50,checkInterval=80),
        testingArgs="gv/9gwAQamF2YS5sYW5nLk9iamVjdAABgf/8AApBcmUgeW91IE9L",//测试参数
        monitorEnable=1,//启动监听
        timeWindow=30*1000,//统计时间窗口30S
        checkInterval=2000,//采样周期2S
        baseTimeUnit=Constants.TIME_MILLISECONDS
    )
    public String hello(String name) {
        if(SF.isLoggable(true,MonitorConstant.LOG_DEBUG)) {
            SF.doBussinessLog(MonitorConstant.LOG_DEBUG,SimpleRpcImpl.class,null, name);
        }

        System.out.println("Server hello: " +name);
        return "Server say hello to: "+name;
    }

}

相关属性解析

monitorEnable:启用服务监听,这样系统会将hello方法的实时运行数据上报到监听服务器,监听服务器统计出相关指标数据(如请求失败率),最后监听服务器通过pubsub服务器将数据发布出去,Breaker服务收到服务的指标数据后根据服务的配置信息判断是否需要熔断服务。1表示启用,0表示禁用,-1表示由Service配置确定。

baseTimeUnit:基本时间单位,Constants.TIME_MILLISECONDS表示毫秒,其他值参考Constants.TIME_打头的值。

timeWindow:服务数据统计时间段长度,单位由baseTimeUnit确定,如30000,表示30000毫秒,表示监听服务器保持hello服务最近30秒的统计数据,超过30秒的数据自动丢弃,qps=当前保持的数据总和/timeWindow(30000转换为秒)。

checkInterval:表示监听服务器上报统计数据到pubsub服务时间间隔,2000表示每两秒上报一次,意味着熔断器每两秒收到一次数据并对服务做熔断判断。

testingArgs:测试参数,服务熔断后,正常的前端RPC请求将在客户端被直接拒绝(快速失败),不会请求到服务端(也就是没有网络数据传输)。但是熔断器服务要对hello服务做恢复判断,同样需要监听服务统计数据并通过pubsub服务通知熔断器实现。实现方式是服务熔断后,熔断器会每间隔一个时间以testingArgs为参数调用hello服务,这样服务监听器就有hello服务统计数据并上报到熔断器,熔断器判断成功率是否达到指定值,如果达到,就关闭服务熔断,客户端又可以正常使用服务。

testingArgs参数生成方式:

public static void main(String[] args) {
        ISimpleRpc sayHelloSrv = JMicro.getRpcServiceTestingArgs(ISimpleRpc.class);
        sayHelloSrv.hello("Are you OK");
    }

运行这段代码后,控制台会输出一个字符串,这个字符串就是testingArgs的值,如下图,这个字符串所代表的基实就是“How are you”编码后的值。也许你会问为什么不直接给testingArgs直接赋值“How are you”?因为RPC方法支持各种类型的参数,并且参数的数量也可以多个,直接赋值给testingArgs基本不可能。

 特别注意:支持熔断的方法必须确保服务方法接收到这个参数的请求不影响正常的业务逻辑,这是一个测试。

breakingRule:是一个内嵌注解,表示熔断规则,其内部分为如下属性

enable:是否启用规则,true表示启用,false表示禁用。只有启用服务才支持熔断。

percent:熔断与不熔断时的临界值,RPC服务失败率大于或等于此值时,服务熔断,否则不熔断。

checkInterval:服务熔断后,每间隔多长时间做一次测试,以testingArgs为参数。

3. 做以上配置后,构建provider

打开命令行窗口

进入provider目录

cd ${SRC_ROOT}\jmicro.example\jmicro.example.provider

构建运行包

mvn clean install -Pbuild-main

运行服务

java -jar target/jmicro.example.provider-0.0.1-SNAPSHOT-jar-with-dependencies.jar

4. 修改运行消费方,对熔断服务进行测试

pom.xml将压测试Main类打开

<manifest>
                            <!-- <mainClass>org.jmicro.example.comsumer.ServiceComsumer</mainClass> -->
                            <mainClass>org.jmicro.example.comsumer.PressureTest</mainClass>
                        </manifest>

打开一个新命令行窗口

进入comsumer目录

cd ${SRC_ROOT}\jmicro.example\jmicro.example.comsumer

构建运行包

mvn clean install

运行:

java -jar target/jmicro.example.comsumer-0.0.1-SNAPSHOT-jar-with-dependencies.jar

此时分别观察消费方,服务方,服务监听方,Pubsub,Breaker窗口的输出?

可以服务方法hello内抛出异常,Sleep指定时长(让服务超时),来测试服务熔断,自行修改测试

【5】JMicro微服务-熔断降级的更多相关文章

  1. 聊聊微服务熔断降级Hystrix

    在现在的微服务使用的过程中,经常会遇到依赖的服务不可用,那么如果依赖的服务不可用的话,会导致把自己的服务也会拖死,那么就产生了熔断,熔断顾名思义就是当服务处于不可用的时候采取半开关的状态,达到一定数量 ...

  2. 【13】JMicro微服务-ID生成与Redis

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...

  3. 【12】JMicro微服务-Zookeeper

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...

  4. 【11】JMicro微服务-配置管理

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...

  5. JMicro微服务之超时&重试

    JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库.项目源码github:https://github.com/mynewworldyyl/j ...

  6. 【3】JMicro微服务-服务超时,重试,重试间隔

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  7. 【10】JMicro微服务-API网关

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...

  8. 【8】JMicro微服务-JMicro ZKUI

    ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...

  9. 【2】JMicro微服务-Hello World

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...

随机推荐

  1. Web 开发

    Django(发音:[`dʒæŋɡəʊ]) 是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,模型(Model).模板(Template)和视图(Views).

  2. IPython:一种交互式计算和开发环境

    IPython基础 可以通过命令行启动IPython,执行任何Python语句,只需将其输入然后回车. Tab键自动完成 在Shell中输入表达式时,只要按下Tab键,当前命名空间中任何与已输入的字符 ...

  3. 创建Java程序并设置快捷提示

    1.new Java project 创建项目 2.new package 创建包,cn.com.test 3.创建Java文件 4.Java智能提示的设置 window/preference 在Au ...

  4. hibernate执行createSQLQuery时字段重名的问题

    hibernate执行createSQLQuery时字段重名的问题 不同表关联 ,表字段重名 =>之前若 as 别名 会自动区分 但有一次签移到新服务器  mysql 5.5上: 若字段重名:重 ...

  5. maven的传递性依赖

    一.概念: 假如有maven项目A,项目A依赖项目B,项目B依赖项目C,我们说A对B是第一直接依赖,B对C是第二直接依赖,那么他们的依赖关系:A---->B----->C,那么我们执行项目 ...

  6. CCommandLineInfo类

    ## CCommandLineInfo cmdInfo;//定义命令行 ParseCommandLine(cmdInfo);//解析命令行 // 调度在命令行中指定的命令.如果 // 用 /RegSe ...

  7. AIX 批量更改密码

    使用 chpasswd 可以使用 chpasswd 方便地更改单个或多个账户密码.这意味着不需要像平时一样在命令行上重复输入密码.尽管可以以交互方式使用 chpasswd,但是我建议以非交互方式使用它 ...

  8. picker

    滚动选择器,现支持三种选择器,通过mode来区分,分别是普通选择器,时间选择器,日期选择器,默认是普通选择器. 普通选择器:mode = selector 属性名 类型 默认值 说明 range Ar ...

  9. POJ3020 Antenna Placement

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9586   Accepted: 4736 ...

  10. OpenGL中的常用绘图的命令与效果(经验设置)

    1. 剔除多边形表面 在三维空间中,一个多边形虽然有两个面,但我们无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡.如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们 ...