电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 實現分布式服務的調用鏈跟蹤

瀏覽:87日期:2022-08-11 10:03:53
目錄為什么要實現調用鏈跟蹤?如何實現?第一步,看圖、看場景,用戶瀏覽器的一次請求行為所走的路徑是什么樣的第二步,實現。不想看代碼可直接拉最后看結果和原理測試一下結果:為什么要實現調用鏈跟蹤?

隨著業務的發展,所有的系統最終都會走向服務化體系,微服務的目的一是提高系統的穩定性,二是提高持續交付的效率,為什么能提高這兩項不是今天討論的內容。

當然這也不是絕對的,如果業務還在MVP驗證,團隊規模小個人覺得完全沒必要微服務化、單體應用是比較好的選擇。作者是有經歷過從單體應用到1000+應用的增長經歷,也是見證了公司從初創到上市的過程,對于系統階段和業務階段的匹配還是有比較深的感受的。

服務拆分后帶來的問題是什么呢?服務的依賴關系復雜后,對于問題的排查也增加了復雜度,當然站在更高的角度來看拆分帶來的不只是排錯復雜性的提升,工程效率、組織協作也都會帶來新的挑戰。

回到主題,如何快速查詢整個請求鏈路上的日志并呈現出來是解決排查問題復雜度的根本方法,這就是今天我們要講的內容,如何自己來實現一個全鏈路跟蹤。

如何實現?第一步,看圖、看場景,用戶瀏覽器的一次請求行為所走的路徑是什么樣的

Java 實現分布式服務的調用鏈跟蹤

如上圖、省略了4層和7層的LB,請求直接到gateway->A->B 那如何把個request關聯起來呢?從時序上來看我們只要在gateway生成一個traceId然后層層透傳,那么每一次的request的我們就能通過traceid關聯查詢出來了。如何透傳、如何記錄呢?或者說如何透傳、如何記錄讓各應用的開發人員無需關注呢?

第二步,實現。不想看代碼可直接拉最后看結果和原理

如何傳遞,這里我們使用定義統一的Request類,所有的api層需要使用這個規范,代碼如下:

public class Request<T> implements Serializable { //header:攜帶需要傳遞的信息 private RequestHeader header; //業務參數 private T bizModel; //...省略get set}public class RequestHeader implements Serializable { //調用鏈唯一ID private String traceId; //當前用戶Id private String userId; //上游調用方appId private String callAppId; //...省略get set}

有了這個Request之后,我們在網關層每次都生成traceId, 然后在各服務之間傳遞就能做到調用鏈的關聯了。我們繼續看個各應用應該如何定義服務和使用

@ApiMethod @PostMapping('/test') @ApiOperation(value = 'test', notes = '', response = String.class) public Response<ExampleRespDTO> test(@RequestBody Request<ExampleReqDTO> req) {ExampleRespDTO exampleRespDTO = new ExampleRespDTO();exampleRespDTO.setName(req.getBizModel().getName());//輸出當前應用的header信息 System.out.println('上游的traceId:'+RequestContext.getHeader().getTraceId());System.out.println('上游的callAppId:'+RequestContext.getHeader().getCallAppId());System.out.println('上游的userId:'+RequestContext.getHeader().getUserId());/*** * 模擬調用其他應用服務 * 通過RPCRequest 來構建request對象 */Request<OtherAppServiceReqDTO> otherAppServiceReqDTORequest =RPCRequest.createRequest(new OtherAppServiceReqDTO());//輸出下游應用的header信息System.out.println('調用下游的traceId:'+otherAppServiceReqDTORequest.getHeader().getTraceId());System.out.println('調用下游的callAppId:'+otherAppServiceReqDTORequest.getHeader().getCallAppId());System.out.println('調用下游的userId:'+otherAppServiceReqDTORequest.getHeader().getUserId());return Response.successResponse(exampleRespDTO); }

看完上面代碼的同學,應該看到了有一個模擬調用其他服務的地方,這里主要解決的是服務和服務之間的調用header傳遞的問題,這里封裝了一個createRequest的方法,其主要內容還是把當前應用的requestHeader 賦值給請求其他服務的request上。這也是一個測試接口,最后面有測試的結果

public class RPCRequest { public static <T> Request<T> createRequest(T requestData){Request<T> request = new Request();RequestHeader requestHeader=new RequestHeader();requestHeader.setTraceId(RequestContext.getHeader().getTraceId());requestHeader.setUserId(RequestContext.getHeader().getUserId());requestHeader.setCallAppId(AppConfig.CURRENT_APP_ID);request.setHeader(requestHeader);request.setBizModel(requestData);return request; }}

當前request中的header存在什么地方呢,我們看一下RequestContext的代碼

public class RequestContext { private static ThreadLocal<RequestHeader> threadLocal=new ThreadLocal<>(); public static void setHeader(RequestHeader header){ threadLocal.set(header); } public static RequestHeader getHeader(){ return threadLocal.get(); } public static void clear(){ threadLocal.remove(); }}

header是什么時候放進去的呢?這里就是AOP該發揮作用的時候了,直接看代碼

public class ApiHandler { public ApiHandler() { } public Response handleApiMethod(ProceedingJoinPoint pjp, ApiMethod apiMethod) {//獲取上游調用方的request headerObject[] args = pjp.getArgs();Request request = (Request) args[0];RequestHeader header = request.getHeader();//將header加入到當前request 到ThreadLocal保存RequestContext.setHeader(header);Response response = null;try { //構建response header ResponseHeader responseHeader = new ResponseHeader(); responseHeader.setTraceId(RequestContext.getHeader().getTraceId()); //執行service方法 response = (Response) pjp.proceed(args); response.setHeader(responseHeader);} catch (Throwable throwable) { throwable.printStackTrace();}finally { //清除ThreadLocal中當前請求的header 對象 RequestContext.clear();}return response; }}

不想看代碼的,直接看下圖,原理比較簡單,淺黃色為AOP作用,接口執行前和執行后,其中reqeuest和header的定義在第1段代碼

Java 實現分布式服務的調用鏈跟蹤

這里沒有介紹如何收集數據和查詢展示,比較簡單的辦法是使用logback打本地日志,然后通過agent抽到集中式日志進行查詢展示,例如ELK。

測試一下結果:

1、接口文檔

Java 實現分布式服務的調用鏈跟蹤

2、執行結果

Java 實現分布式服務的調用鏈跟蹤

Java 實現分布式服務的調用鏈跟蹤

以上就是Java 實現分布式服務的調用鏈跟蹤的詳細內容,更多關于Java 分布式服務的調用鏈跟蹤的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 鑫铭东办公家具一站式定制采购-深圳办公家具厂家直销 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 铁素体测量仪/检测仪/铁素体含量测试仪-苏州圣光仪器有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 桑茶-七彩贝壳桑叶茶 长寿茶| 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 大倾角皮带机-皮带输送机-螺旋输送机-矿用皮带输送机价格厂家-河南坤威机械 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | Trimos测长机_测高仪_TESA_mahr,WYLER水平仪,PWB对刀仪-德瑞华测量技术(苏州)有限公司 | 电缆桥架生产厂家_槽式/梯式_热镀锌线槽_广东东莞雷正电气 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 西安标准厂房_陕西工业厂房_西咸新区独栋厂房_长信科技产业园官方网站 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 济南拼接屏_山东液晶拼接屏_济南LED显示屏—维康国际官网 | 岩石钻裂机-液压凿岩机-劈裂机-挖改钻_湖南烈岩科技有限公司 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 3A别墅漆/3A环保漆_广东美涂士建材股份有限公司【官网】 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 |