专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

网关和中心统一异常

  背景
  后端提供的服务,都是需要统一格式的,比如都需要返回错误码,错误信息,全局流水等等。那么在后端系统中,如果抛了异常不处理的话,这些格式就没法控制,今天讲讲springCloudGateway和springboot服务怎么在抛异常的时候,统一格式。springCloudGateway网关
  网关分为限流异常和业务异常限流异常
  网关有限流的功能,那么在限流的时候,需要对返回做处理(这里用的sentinel做的限流)
  首先我们有个配置类ConfigurationpublicclassSentinelException{privatefinalListViewResolverviewResolvers;privatefinalServerCodecConfigurerserverCodecConfigurer;publicSentinelException(ObjectProviderListViewResolverviewResolversProvider,ServerCodecConfigurerserverCodecConfigurer){this。viewResolversviewResolversProvider。getIfAvailable(Collections::emptyList);this。serverCodecConfigurerserverCodecConfigurer;}BeanOrder(Ordered。HIGHESTPRECEDENCE)publicSentinelGatewayBlockExceptionHandlersentinelGatewayBlockExceptionHandler(){returnnewSentinelGatewayExceptionHandler(viewResolvers,serverCodecConfigurer);}BeanOrder(Ordered。HIGHESTPRECEDENCE)publicGlobalFiltersentinelGatewayFilter(){returnnewSentinelGatewayFilter();}}
  然后新建一个SentinelGatewayExceptionHandler类继承SentinelGatewayBlockExceptionHandler,重写handle方法Slf4jpublicclassSentinelGatewayExceptionHandlerextendsSentinelGatewayBlockExceptionHandler{privateListViewResolverviewResolvers;privateListHttpMessageWriterlt;?messageWriters;publicSentinelGatewayExceptionHandler(ListViewResolverviewResolvers,ServerCodecConfigurerserverCodecConfigurer){super(viewResolvers,serverCodecConfigurer);this。viewResolversviewResolvers;this。messageWritersserverCodecConfigurer。getWriters();}OverridepublicMonoVoidhandle(ServerWebExchangeserverWebExchange,Throwablethrowable){if(serverWebExchange。getResponse()。isCommitted()){returnMono。error(throwable);}if(!BlockException。isBlockException(throwable)){returnMono。error(throwable);}returnhandleBlockedRequest(serverWebExchange,throwable)。flatMap(responsewriteResponse(response,serverWebExchange));}privateMonoServerResponsehandleBlockedRequest(ServerWebExchangeexchange,Throwablethrowable){returnGatewayCallbackManager。getBlockHandler()。handleRequest(exchange,throwable);}privatefinalSupplierServerResponse。ContextcontextSupplier()newServerResponse。Context(){OverridepublicListHttpMessageWriterlt;?messageWriters(){returnSentinelGatewayExceptionHandler。this。messageWriters;}OverridepublicListViewResolverviewResolvers(){returnSentinelGatewayExceptionHandler。this。viewResolvers;}};privateMonoVoidwriteResponse(ServerResponseresponse,ServerWebExchangeexchange){MDC。clear();log。error(交易【{}】在【{}】时间被限制,请检查是否有大流量进入,exchange。getRequest()。getPath(),DateUtil。format(newDate(),CakeConstants。FORMATTIME));ServerHttpResponserespexchange。getResponse();resp。getHeaders()。add(ContentType,applicationjson;charsetUTF8);MapmapnewHashMap();StringjsonJSON。toJSONString(map,CakeConstants。FORMATTIME);DataBufferbufferresp。bufferFactory()。wrap(json。getBytes(StandardCharsets。UTF8));returnresp。writeWith(Mono。just(buffer));}
  MapmapnewHashMap();这里的map就是定义的返回格式,随便自己定义,返回的json数据。业务异常
  网关可能发生业务异常,那么我们也要做处理。新建一个GlobalErrorWebExceptionHandler类,实现ErrorWebExceptionHandler接口,重写handle方法,这里我就不贴所有代码了。Slf4jOrder(1)ConfigurationRequiredArgsConstructor(onConstructor(Autowired))publicclassGlobalErrorWebExceptionHandlerimplementsErrorWebExceptionHandler{SneakyThrowsOverridepublicMonoVoidhandle(ServerWebExchangeexchange,Throwableex){ServerHttpResponseresponseexchange。getResponse();response。getHeaders()。setContentType(MediaType。APPLICATIONJSON);returnresponse。writeWith(Mono。fromSupplier((){DataBufferFactorybufferFactoryresponse。bufferFactory();try{returnbufferFactory。wrap(mapper。writeValueAsBytes(返回数据,自定义));}catch(Exceptione){log。info(返回失败);returnbufferFactory。wrap(JSON。toJSONBytes(返回数据,自定义));}}));}springboot服务
  springboot分为流控异常,业务异常,还有404这些。流控异常
  新建一个SentinelBootException类,实现BlockExceptionHandler,重写handle方法Slf4jComponentpublicclassSentinelBootExceptionimplementsBlockExceptionHandler{Overridepublicvoidhandle(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,BlockExceptione)throwsException{MDC。clear();CenterQueryResponseresponseDatanewCenterQueryResponse();httpServletResponse。setStatus(200);httpServletResponse。setContentType(applicationjson;charsetutf8);PrintWriterouthttpServletResponse。getWriter();out。print(JSON。toJSONString(responseData,CakeConstants。FORMATTIME));out。flush();out。close();}}
  responseData对象就是自定义返回的数据,大家按照自己项目的定义就行。404等处理
  新建TransferNotFindController类,实现ErrorController接口,对error路径进行处理。RestControllerpublicclassTransferNotFindControllerimplementsErrorController{privatestaticfinalLoggerlogLoggerFactory。getLogger(TransferNotFindController。class);默认错误privatestaticfinalStringpathdefaulterror;RequestMapping(valuepathdefault,produces{MediaType。APPLICATIONJSONVALUE})publicCenterQueryResponsehandleError(HttpServletRequestrequest){CenterQueryResponseresponseDatanewCenterQueryResponse();log。info(交易不存在〔{}〕,JSON。toJSONString(responseData,CakeConstants。FORMATTIME));returnresponseData;}}
  CenterQueryResponse对象就是返回的数据。大家根据项目自行定义。业务异常
  这部分比较麻烦,我是有对controller成做AOP切面处理的,我用了trycatch做了一些异常处理,这部分就不写了,大家可以自己去处理,在catch里面对异常处理。还有一部分是全局异常处理,利用的是ControllerAdvice注解和ExceptionHandler注解。先定义一个异常类PgException继承RuntimeException。DataNoArgsConstructorAllArgsConstructorpublicclassPgExceptionextendsRuntimeException{privateStringcode;privateStringmsg;publicPgException(Stringcode,Stringmsg){this。codecode;this。msgmsg;}OverridepublicStringgetMessage(){returnthis。msg;}OverridepublicStringtoString(){returnException(codethis。getCode(),messagethis。getMsg());}}
  这里面有个地方注意一下,重写了getMessage,为什么要重写,因为在日志里你不重写的话,那么异常信息打印出来都是null,重写了,你打印的异常信息就是你的错误信息。
  然后新建PgExceptionHandler类,这里的代码没完整贴出来。Slf4jControllerAdvicepublicclassPgExceptionHandler{ExceptionHandler(PgException。class)ResponseBodypublicCenterCommandResponsehandlePgException(PgExceptionex){CenterCommandResponsecenterCommandResponsenewCenterCommandResponse();RequestContext。remove();returncenterCommandResponse;}ExceptionHandler(Exception。class)ResponseBodypublicCenterCommandResponsehandleException(Exceptionex){CenterCommandResponsecenterCommandResponsenewCenterCommandResponse();returncenterCommandResponse;}}
  CenterCommandResponse就是要返回的数据,大家可以根据项目自行定义。
  网关和服务应用的异常处理就到这了,基本包含了当前所有的异常场景了,后续还有别的再加吧。再贴个我的异常返回图。
  异常返回信息

数字化供应链时代,为什么我们还要用Excel分析供应链数据?在数字化时代,供应链专业人员需要具备许多技能,其中一项是数据分析。有些公司使用了复杂的软件包来建立数学模型,还有些使用PowerBI管理大量的数据。尽管有这些高大上的系统,但仍有许每日书摘微风1。但是我不愿再这样什么都不做什么都不变地结束来自风平浪静的明天微风2。回忆若可远久,淡念亦能存温,我辜负三千岁月,只为留你半阙芳痕。微风3。我相信那个人,一定会做着宇宙飞船来吴越遗风话乡音由广丰腔me字读音引发的思考01hr世上独一无二又最亲切字的声音meme,我回来了。me,我饿了,什么时候吃饭呀?me,我这次出门,你可要照顾好爹和您自己。这一声声me,我们从小喊到大,喊到老,总是喊不够,喊人间晚秋,唯茶解忧草木被腐蚀成了一圈枯黄风中也多了几分清寒然而枫叶,银杏,橙黄橘绿也在此时秋意斑斓是大自然入冬前最后的热烈人间晚秋,在一杯秋茶中静静感知秋天的美好与珍贵吧人间晚秋,有茶便好秋天,有了山人心苑杂谈(五)心苑杂谈(五)生命笔者山人你的第一声啼哭,便烙印在生命扉页上,生命之帆开始张扬。旅途中,天灾人祸饥寒疾患接踵而来,死神如影随形,于是,有了生命的抗争。支持我们活下去的理由是什么?平百度发布自动驾驶数据闭环合规方案赋能车企自动驾驶中证网讯(记者金一丹)11月2日,百度Apollo自动驾驶云2。0预发布沟通会披露,百度将为车企提供自动驾驶研发全栈的数据闭环合规解决方案,满足智能汽车自动驾驶数据采集安全合规要求工匠汇第二批中国纺织大工匠孔祥光研究中国丝绸三十五年工匠绝活潜心研制,成功推出杭州G20峰会国礼元首夫人礼6款纪念礼2款和宣传礼2款领衔设计开发北京奥运会丝绸特许商品和2010年上海世博会丝绸特许商品领衔完成浙江省丝绸版浙江省文化地蒙牛订制产品登陆卡塔尔营养世界的每一份要强大河报豫视频记者韩聪聪日前,作为2022年FIFA世界杯全球官方赞助商,蒙牛集团在主办国卡塔尔推出蒙牛首款世界杯订制产品,为来自世界各国的球迷带来更多营养与快乐的同时,将营养世界的痛别!又有两位巨星陨落11月2日中国科学院院士著名物理学家解思深因病医治无效在北京逝世享年80岁11月4日中国科学院院士我国机械工程专家原华中理工大学(现华中科技大学)校长杨叔子因病医治无效在武汉逝世享拜登宣布解放伊朗激怒伊政府,莱希回击别妄想我们变成奶牛据悉,美国总统拜登最近又因为一段激进言论登上了热搜。两天前在一场中期大选的拉票活动中,拜登在加利福尼亚为一名民主党籍议员候选人演讲表示支持此时台下有观众举着写有解放伊朗的手机屏幕对诺坎普92605人见证!35岁巴萨传奇后卫挥泪退役生涯769场夺37冠11月4日凌晨,世界足坛又一位现役传奇球员将离开赛场,35岁的皮克突然宣布自己将会退役,西甲第13轮巴塞罗那主场对阵阿尔梅里亚就是告别战。尽管已提前预告,但当这场足球生涯的最后一战
七一文学记中央苏区妇女工作的模范黄长娇中央苏区时期,是中国共产党进行人民民主政权建设的开创时期,苏区妇女群众作为一支重要力量,强有力地推动了革命事业的发展。1933年11月,毛泽东在长冈乡调查中指出妇女在革命战争中的伟光刻胶概念爆发,多家上市公司提示风险3月9日,光刻胶概念表现抢眼,截至收盘,整个板块涨幅超4,容大感光二连板,同益股份彤程新材张江高科等涨停,强力新材上海新阳等涨超10。多家上市公司提示风险值得注意的是,在今日的大涨打8折,绿地5。6亿卖掉外滩中心两层办公楼,会展公司接手界面新闻记者王婷婷界面新闻编辑近年来陆续在整售写字楼的绿地外滩中心,近日又迎来新买家,但这次不再是券商了。3月6日,兰生股份(600826。SH)发布公告称,公司拟向中民外滩房地产公司一年狂亏38亿贾跃亭百万豪车FF91终极发布定档3月9日消息,法拉第未来(FaradayFutureFF)公布了截至截至2022年12月31日的2022年第四季度和全年财报。结果显示,四季度公司净亏损1。54亿美元,全年净亏损5深学争优敢为争先实干争效3月8日,在宁化县泉上镇泉永村,百亩油菜花竞相绽放,不少游客慕名而来,在这里或打卡拍照,记录美好时光或惬意写生,享受春日静好。山水田园间,人在花中走花与人相随,构成了一幅景美人欢的弘扬雷锋精神,怀柔区司法局公职律师队伍在行动雷锋日虽然已经过去但是雷锋的精神永远值得我们学习怀柔区司法局说事讲法服务惠民公职律师志愿服务队自2018年成立以来坚持以党建引领志愿服务始终活跃在服务百姓的第一线努力打造一支竭诚为沅陵明溪口镇争做巾帼雷锋,共建和美家园红网时刻怀化3月9日讯(通讯员欧鑫)3月8日,为庆祝第113个国际劳动妇女节,沅陵明溪口镇开展争做巾帼雷锋,共建和美家园活动。明溪口镇是全国文明镇旅游乡镇,生态文化资源丰富,202人民大会堂内外响起学雷锋之声60年前的春天,向雷锋同志学习的号召从北京传遍中国大地。60年后的春天,全国两会在人民大会堂召开,雷锋的名字在代表委员的口中依然响亮。江苏省连云港汽车运输有限公司新浦汽车总站站务员雷锋这样说青年问雷锋是否该跳出舒适圈?辽宁,是雷锋精神发祥地,也是全国学雷锋活动策源地。纪念雷锋不只是为了留住回忆,而是为了更好地传承。在当下,学习和发扬雷锋精神对青年一代依旧有着重要意义,雷锋精神永不过时。2023年外资鲶鱼加速布局!外商独资公募增至8家,还有首发产品已定档自2020年8月贝莱德基金获准设立成为国内首家外商独资公募后,近年来,外商加速布局国内公募市场。3月3日,证监会发布公告称,核准联博香港有限公司(AllianceBernstein锦江区春季宜居展今日开幕3月9日12日相约春熙路宜居宜业宜游,美丽的锦江区,早已成为成都品位生活的代言词,吸引了无数人向往。今天,想要感受锦江魅力,留住锦江生活,就来春熙路逛逛2023年锦江区春季宜居展吧。这里有最新最全的锦江区
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网