如非授权,禁止用于商业用途,转载请注明出处
作者: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指定时长(让服务超时),来测试服务熔断,自行修改测试