如非授权,禁止用于商业用途,转载请注明出处
作者: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. 1.The Necessity of a Broad Education 全面教育的必要性

    1.The Necessity of a Broad Education 全面教育的必要性 (1) According to a survey,which was based on the respo ...

  2. DocumentType类型

    并不常用 nodeType 10 nodeName doctype的名称 NodeValue 值为null parentNode Document 不支持子节点 DocumentType不能动态创建, ...

  3. laravel 5.1 简单配置例子

    这里演示5.1版本 一.数据库配置 .env文件(也可以直接修改config/database.php) DB_HOST=localhost DB_DATABASE=test  //数据库名称 DB_ ...

  4. char类型

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

  5. Python 之 filecmp

    Python 之 filecmp 2017年7月12日 参考书籍:<Python自动化运维 ——技术与最佳实践> 作者:李天斯 1.什么是filecmp filecmp作为python的标 ...

  6. java基础-day22

    第11天  多线程 今日内容介绍 u  多线程概述 u  线程实现 u  多线程安全问题产生 & 解决方案 第1章    多线程概述 学习多线程之前,我们先要了解几个关于多线程有关的概念. A ...

  7. limit

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table  LIMIT [offset ...

  8. Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装

    Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装 1.下载hive-0.10.0 网址是:http://archive.apache.org/dist/hive/hive-0.10 ...

  9. express package.json解析

    教程:http://www.tuicool.com/articles/vuiyIz

  10. 冲刺博客NO.5

    今天做了什么:布局UI和效果图,学会了监听事件并销毁监听接口 SMSSDK.unregisterAllEventHandler(); 今天做的东西不多,没有遇到什么苦难