JMicro微服务之超时&重试
JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库。项目源码github:
https://github.com/mynewworldyyl/jmicro,Demo源码:
https://github.com/mynewworldyyl/jmicro_demos/tree/0.0.3-release
Maven地址:
https://mvnrepository.com/search?q=cn.jmicro
Demo:http://jmicro.cn 账号:test00 密码:1
超时&重试
客户端调用服务时,由于网络抖动,服务故障等原因,不能及时响应给客户端,往往需要重试一两次才能成功,而不应该在发生超时时就直接给调用者失败结果,这样不友好,往往让用户怀疑我们服务的稳定性和可用性。
比如平时访问某个网站,页面出现长时间读条加载的情况,我们往往按一下刷新按钮就能很快成功打开页面。在微服务调用中,往往由服务调用者在收到失败响应后,根据业务场景发起合理的重试请求。JMicro在框架级别提供这种配置并且由平台自动做重试操作,提高服务调用的成功率。
JMicro超时重试配置
在前面JMicro微服务Helloworld基基础上,通过配置SMethod注解属性达到超时重试的目的。代码如下:
@Component
@Service(version="0.0.1")
public class TxShopServiceImpl implements ITxShopService { private final static Logger logger = LoggerFactory.getLogger(TxShopServiceImpl.class); private Random ran = new Random(System.currentTimeMillis()); @Override
@SMethod(timeout=1000,retryCnt=3,retryInterval=100)
public Resp<Boolean> buy(int goodId,int num) {
Resp<Boolean> r = new Resp<>(Resp.CODE_SUCCESS,true);
int st = ran.nextInt(6);
if(st > 0) {
logger.info("Sleep time: " + st+" Seconds idx: " +num);
try {
TimeUnit.SECONDS.sleep(30);//睡30秒,让客户端超时并重试,只要为了验证超时重试逻辑
TimeUnit.SECONDS.sleep(ran.nextInt(5));//睡30秒,随机睡0到5秒,测试并发表求时部份请求超时
} catch (InterruptedException e) {
logger.error("",e);
}
}
logger.info("Success return idx:" +num);
return r;
} }
在buy服务方法配置SMethod注解,并设置timeout,retryInterval,retryCnt三个属性即可。
timeout:表示超时时间,单位毫秒,小于或等于0表示不启用超时,大于0表示启用超时;
retryInterval:表示超时后,重试间隔,单位毫秒,如果服务超时后,立即发起重试请求,很可能还是失败,所以要稍微等一会,让服务方缓存一下,再发起重试,往往成功率会更高。
retryCnt:表示重试次数,不包括第一次,如设置为3,如果第一次超时,第2次成功,则总共请求了2次,同理,全部超时时,总共请求了4次,4次超时后,RPC失败,抛出TimeoutException异常。
配置启动参数及入口类
除了可以按照上一节用的命令方式运行测试 ,还可以将项目导入Eclipse或Idea中运行Debug测试。
比如Eclipse下,将源码以Maven项目导入Eclipse中,在运行测试配置如下图所示:
Eclipse入口类
参数:
参数及Agent配置
VM参数为Maven仓库下的Agent类,需要改为你自己机器的路径,此Jar包用于在我们启动java虚拟机时,对我们的实体类(SO注解的类)做序列化增强,这样我们RPC请求就可以飞起来。
-DsysLogLevel=4 日志级别,用于日志监控,需要日志服务支持,后面专门章节说明;
-DclientId=25500 以什么账号启动我们的服务实例,涉及账号权限及多租户隔离;
-DadminClientId=0 超级账号,用于申请超级账号权限
-Dlog4j.configuration=../../log4j.xml Log4j日志配置文件
-Dpwd=1 clientId账号对应的密码
以上参数除了log4j.configuration外,其他都可以先不用管,后面用专门章节说明
通过以上配置后,就可以像平时启动Java程序那样启动服务了。
配置并启动客户端
同样方式配置并启动客户端,客户端以固定频率调用服务端buy方法,代码如下:
public void afterInit(IObjectFactory of) {
AtomicInteger ai = new AtomicInteger(0);
//为了不Block主线程,我们在此启动一个线程每间隔3秒调用一次商店提供的购买方法
new Thread(()->{
for(;true;) {
try {
//调用商店服务
int cnt = ai.getAndIncrement();
Resp<Boolean> rst = shop.buy(1, cnt);
if(rst == null || rst.getCode() != Resp.CODE_SUCCESS) {
if(rst != null) {
//系统组错误
logger.info(rst.getMsg()+"," + rst.getCode()+",idx:"+cnt);
} else {
logger.info("Timeout:" + cnt);
}
}else if(rst.getData()) {
//业务购买失败
logger.info("Success idx: " + cnt);
}else {
//成功
logger.info("Fulure"+rst.getMsg()+"," + rst.getCode()+",idx:"+cnt);
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
logger.error("",e);
}
}catch(Throwable e) {
logger.error(e.getMessage());
}
}
}).start();
}
查看客户端输出日志,重试3次后,最终报超时失败,因为服务端buy方法睡了30秒,所以每个请求都肯定会超时!试着调整服务端的超时时间,让一部份请求成功或重试成功。
重试3次,最终超时失败
除了可以在终端看日志外,还可以通过日志文件看,日志文件的位置配置在log4j配置文件中,默认为当前工作目录下的logs/work.log文件。如下图:
日志文件 位置
超时重试存问题
必须要说明的是并非全部服务都需要重试或都能接受重试,只有幂等服务才能接受重试。所谓幂等是:以同一参数调用多次得到的效果相同,则称服务是幂等服务。比如x++这个操作,每次调用的结果都不相同,则不是幂等,x=y+1则是幂等操作。结合业务场景,在技术实现中,往往通过去重的方式让服务达到幂等的要求,这样就可以让服务接受重试,提高服务的可用性和一致性要求。
另一方面,在超时重试失败率达到一定量后,比如30%的重试都失败,则说明我们的服务很有可能出现了问题,此时如再做正常的重试,很有可能会压垮整个服务系统(雪崩),这个又需要服务熔断和降级来避免,下回分享JMicro熔断和降级等内容。
如果你觉得JMicro对你有帮助,麻烦移步到Github上给个星!
JMicro微服务之超时&重试的更多相关文章
- 【3】JMicro微服务-服务超时,重试,重试间隔
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...
- 【13】JMicro微服务-ID生成与Redis
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...
- 【12】JMicro微服务-Zookeeper
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...
- 【11】JMicro微服务-配置管理
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...
- Zuul超时问题,微服务响应超时,zuul进行熔断
天碰到了微服务响应超时问题,而且超时时间特别短,2秒就超时,zuul就走熔断了. 我采用zuul作为网关,根据不同的访问路径进行微服务的路由,譬如有个服务是user,我访问user服务的某个接口时,该 ...
- 【10】JMicro微服务-API网关
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...
- 【8】JMicro微服务-JMicro ZKUI
ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...
- 【2】JMicro微服务-Hello World
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...
- JMicro微服务Hello World
概述 JMicro是本人开发的基于Java实现的微服务框架,前两天发布0.0.3正式版本,并已发布到maven中央仓库. 项目源码github:https://github.com/mynewworl ...
随机推荐
- JAVAEE_Servlet_13_HttpServlet
HttpServlet 因为每次执行前端请求,都需要获取前端的请求方式,都需判断前端的请求方式和后端是否一致,随意这段代码就可以封装起来. 写一个HttpServlet类去继承GenericServl ...
- Ubuntu 20.04 简述环境配置&美化
不敢说是最好的,基本上是最全面的了~ 修改系统软件源 一开始是国外的源比较慢,建议换成国内的源,常用的有清华源.阿里源等. 清华源地址 Ubuntu 的软件源配置文件是 /etc/apt/source ...
- 概A第二章测试
以下判断题全是(√) 问题 1 得 10 分,满分 10 分 问题 2 得 10 分,满分 10 分 0-1分布相当于一个特殊的二项分布b(1,p) ...
- 模拟退火算法(1)Python 实现
1.模拟退火算法 模拟退火算法借鉴了统计物理学的思想,是一种简单.通用的启发式优化算法,并在理论上具有概率性全局优化性能,因而在科研和工程中得到了广泛的应用. 退火是金属从熔融状态缓慢冷却.最终达到能 ...
- 1. APP移动端性能测试基础知识入门
本博客要点 生命周期 堆和栈 垃圾回收 adb命令 Activity的生命周期
- POJ2226 不错的最小顶点覆盖
题意: 给你一个n * m 的矩阵,上面有" * " 和 " . " ,让你用少的木板吧所有" * "覆盖,木板宽度是1,长度 ...
- poj1509最小表示法
题意: 给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 思路: 最小表示法的建档应用,最小表示法很好理解,就点贪心的意思,一开始我们枚举两个起点i,j ...
- UVA11100旅行(大包装小包,问最少多少个包)
题意: 有n个包裹,每个包裹的大小都给出了,然后小的包裹可以装到大的包裹里,问最少装成多少个包裹,装成最小的包裹后还有一个限制就是让包裹数最多的那个包裹最少,就是说尽量都平均分,比如有6 ...
- Android学习之TTS踩坑笔记
•前言 最近在做一款英文词典的 APP,做到语音模块的时候,我裂开,从网上搜索了各种博客,各种瞎捣鼓,模拟器就是不发音: 辗转反侧数日,终于让我找到解决之法,接下来就本次测试列出一些需要(必须)解决的 ...
- 剖析XAML语言
这节剖析一下XAML(读作:zaml)--这一WPF中的UI设计语言. XAML 在wpf中,UI部分使用xaml语言来编写,xaml语言是由xml语言派生而来的语言,所以在xaml中我们可以看到很多 ...