如非授权,禁止用于商业用途,转载请注明出处
作者: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. 使用thymeleaf一旦没有闭合标签就会报错怎么解决

    问题:input标签未关闭报bug,代码稍有不慎就出小问题 使用springboot的thymeleaf模板时默认会对HTML进行严格的检查,导致当你的标签没有闭合时就会通不过,例如: //要想通过, ...

  2. 2018.12.30 bzoj3027: [Ceoi2004]Sweet(生成函数+搜索)

    传送门 生成函数好题. 题意简述:给出n个盒子,第iii个盒子里有mim_imi​颗相同的糖(但不同盒子中的糖不相同),问有多少种选法可以从各盒子中选出数量在[a,b][a,b][a,b]之间的糖果. ...

  3. 清理docker大日志文件

    1.进入容器文件的存放目录 ,并查看某一个容器的文件大小 [root@auto ~]# [root@auto ~]# cd /var/lib/docker/containers [root@auto ...

  4. openstack路由管理命令

    1.命令一览 [root@cc07 ~]# neutron help | grep route bgp-speaker-advertiseroute-list List routes advertis ...

  5. JDBC连接SQL Server数据库

    测试环境 数据库:SQL Server 2008 R2,创建数据库名:TestDemo,表:User,字段如下:   字段 字段 id UName UPass sqljdbc.jar下载地址:依赖的J ...

  6. 1.7.6方法stop()与java.lang.threadDeath异常

    调用stop方法时会抛出java.lang.ThreadDeath异常,但一般情况下这个异常不需要显示的捕捉 package com.cky.thread; /** * Created by edis ...

  7. AIX nfs简单说明

    AIX 系统 NFS设置 一.NFS守护进程:NFS是通过使用许多用户级的守护进程及远程过程调用等网络应用程序来实现的.而NFS服务器及客户端的守护进程并不完全一致. 1. 作为NFS服务器所需的守护 ...

  8. springboot工程读取配置文件application.yml的写法18045

    现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...

  9. CMUSphinx Learn - Before you start

    Before you start 开始之前 Before you start the development of the speech application, you need to consid ...

  10. day05_雷神_函数进阶

    #day05 1.迭代器 1.1可迭代对象 str,list,tuple,dict,set,range,文件句柄 等都是可迭代对象 第一种方法:在该对象中,含有__iter__方法的就是可迭代对象,遵 ...