一种java微服务场景下高可用的实现方式
一叶而不知秋
向管中窥豹寻知外,坐井观天又出来。
在分布式系统架构中,每个微服务在系统中同时充当着调用方和服务方,如何保障服务的高可用性呢?就目前而言除了基本功能,性能方面的保障,又增加关键环节的埋点监控、告警,在服务申请之初就设置了限流阈值,当然,这是服务管理平台为我们做好的,除此之外还能够主动做些什么来保障服务可用呢?当服务调用量即将达到阈值时,是否可以主动限流?当所依赖的服务不可用时,可以主动熔断和降级吗?在产生异常时,调用结果,在某些场景下,是否允许通过回放获取到结果,然后通过消息返回呢?这一系列的问题的答案当然是肯定的,保证服务基本可用,业务数据最终一致性,始终是我们研究的课题,对业务数据的采集,存储以及分析,对于业务开发人员来说,是至关重要的。
针对以上问题,提供了较为通用的解决方案,基本实现原理:
在服务端及调用端分别加入代理层,在服务端代理层主要完成异常捕获,异常埋点监控,主动限流,日志收集;在调用端主要完成下游服务代理,完成重试、熔断、降级等功能。主要解决问题如下:
在极端情况下的容灾处理,避免在服务未增加埋点情况下,出现异常引起的雪崩,最终导致服务不可用;
实时记录服务请求异常日志,通过ELK查询分析;
实时记录正常业务日志及服务性能数据,用于业务分析处理;
通过代理依赖服务,增加熔断及降级功能,记录失败日志;
下面介绍如何在实际应用中应用:
1、服务端代理应用
jar包引用:
接口jar包增加@TraceClass 及@TraceMethod 注解:
在服务启动项中加入 -javaagent 启动参数,增加logmark.properties 如下图所示:
logmark-agent-1.0.5.jar 完成日志采集等代码植入及数据采集等功能。
includePackages=com.bj58.fang ## 加载本地路径
logmark.sink.address=tjtx-99-105.58os.org:9092 ## kafka 地址
logmark.app.name=hbg_scf_unifyHouse ## 本地服务名称
logmark.config.fetch.interval=60 ## 收集间隔时间
2、调用方代理层
以信安接口服务为例,如下实现:
创建信安SCF服务adaptor 实现SCFAdaptor 接口,实现doAgent 方法,如下所示:
创建 adaptor agent 继承 SCFAdaptorAgent,如下图所示:
调用:如图所示
通过SCF_RETRY_TIMES设置重试次数,如返回对象为HystrixBadRequestException可采取降级策略。
3、业务数据收集
通过logAgentServer将日志收集到hive:
通过提交spark streaming 任务,实时统计分析数据:
利用云窗,输出统计报表:
在增加代理后,在服务耗时方面,相对于之前,有所牺牲,具体原理及详细配置,待后续分享。
你如果想 学技术 | 屯干货 | 聊职场
你如果想 学技术 | 屯干货 | 聊职场