精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

擼了一個 Feign 增強包 V2.0 升級版

開發(fā) 架構
巧合的時最近內(nèi)部有部分項目又計劃采用 SpringBoot + K8s 開發(fā),于是便著手繼續(xù)維護;現(xiàn)已經(jīng)內(nèi)部迭代了幾個版本比較穩(wěn)定了,也增加了一些實用功能,在此分享給大家。

前言

大概在兩年前我寫過一篇 擼了一個 Feign 增強包,當時準備是利用 SpringBoot + K8s 構建應用,這個庫可以類似于 SpringCloud 那樣結合 SpringBoot 使用聲明式接口來達到服務間通訊的目的。

但后期由于技術棧發(fā)生變化(改為 Go),導致該項目只實現(xiàn)了基本需求后就擱置了。

巧合的時最近內(nèi)部有部分項目又計劃采用 SpringBoot + K8s 開發(fā),于是便著手繼續(xù)維護;現(xiàn)已經(jīng)內(nèi)部迭代了幾個版本比較穩(wěn)定了,也增加了一些實用功能,在此分享給大家。

??https://github.com/crossoverJie/feign-plus。??

首先是新增了一些 features:

  • 更加統(tǒng)一的 API。
  • 統(tǒng)一的請求、響應、異常日志記錄。
  • 自定義攔截器。
  • Metric 支持。
  • 異常傳遞。

示例

結合上面提到的一些特性做一些簡單介紹,統(tǒng)一的 API 主要是在使用層面:

在上一個版本中聲明接口如下:

@FeignPlusClient(name = "github", url = "${github.url}")
public interface Github {
@RequestLine("GET /repos/{owner}/{repo}/contributors")
List<GitHubRes> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

其中的 @RequestLine 等注解都是使用 feign 包所提供的。

這次更新后改為如下方式:

@RequestMapping("/v1/demo")
@FeignPlusClient(name = "demo", url = "${feign.demo.url}", port = "${feign.demo.port}")
public interface DemoApi {
@GetMapping("/id")
String sayHello(@RequestParam(value = "id") Long id);

@GetMapping("/id/{id}")
String id(@PathVariable(value = "id") Long id);

@PostMapping("/create")
Order create(@RequestBody OrderCreateReq req);

@GetMapping("/query")
Order query(@SpringQueryMap OrderQueryDTO dto);
}

熟悉的味道,基本都是 Spring 自帶的注解,這樣在使用上學習成本更低,同時與項目中原本的接口寫法保持一致。

@SpringQueryMap(top.crossoverjie.feign.plus.contract.SpringQueryMap) 是由 feign-plus 提供,其實就是從 SpringCloud 中 copy 過來的。

我這里寫了兩個 demo 來模擬調用:

provider: 作為服務提供者提供了一系列接口供消費方調用,并對外提供了一個 api 模塊。

demo:作為服務消費者依賴 provider-api 模塊,根據(jù)其中聲明的接口進行遠程調用。

配置文件:

server:
port: 8181

feign:
demo:
url : http://127.0.0.1
port: 8080
logging:
level:
top:
crossoverjie: debug
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
metrics:
distribution:
percentiles:
all: 0.5,0.75,0.95,0.99
export:
prometheus:
enabled: true
step: 1m
spring:
application:
name: demo

當我們訪問 http://127.0.0.1:8181/hello/2 接口時從控制臺可以看到調用結果:

日志記錄

從上圖中可以看出 feign-plus 會用 debug 記錄請求/響應結果,如果需要打印出來時需要將該包下的日志級別調整為 debug:

logging:
level:
top:
crossoverjie: debug

由于內(nèi)置了攔截器,也可以自己繼承 top.crossoverjie.feign.plus.log.DefaultLogInterceptor 來實現(xiàn)自己的日志攔截記錄,或者其他業(yè)務邏輯。

@Component
@Slf4j
public class CustomFeignInterceptor extends DefaultLogInterceptor {
@Override
public void request(String target, String url, String body) {
super.request(target, url, body);
log.info("request");
}

@Override
public void exception(String target, String url, FeignException feignException) {
super.exception(target, url, feignException);
}
@Override
public void response(String target, String url, Object response) {
super.response(target, url, response);
log.info("response");
}
}

監(jiān)控 metric

feign-plus 會自行記錄每個接口之間的調用耗時、異常等情況。

訪問 http://127.0.0.1:8181/actuator/prometheus 會看到相關埋點信息,通過 feign_call* 的 key 可以自行在 Grafana 配置相關面板,類似于下圖:

異常傳遞

rpc(遠程調用)要使用起來真的類似于本地調用,異常傳遞必不可少。

// provider
public Order query(OrderQueryDTO dto) {
log.info("dto = {}", dto);
if (dto.getId().equals("1")) {
throw new DemoException("provider test exception");
}
return new Order(dto.getId());
}

// consumer
try {
demoApi.query(new OrderQueryDTO(id, "zhangsan"));
} catch (DemoException e) {
log.error("feignCall:{}, sourceApp:[{}], sourceStackTrace:{}", e.getMessage(), e.getAppName(), e.getDebugStackTrace(), e);
}

比如 provider 中拋出了一個自定義的異常,在 consumer 中可以通過 try/catch 捕獲到該異常。

為了在 feign-plus 中實現(xiàn)該功能需要幾個步驟:

  1. 自定義一個通用異常。
  2. 服務提供方需要實現(xiàn)一個全局攔截器,當發(fā)生異常時統(tǒng)一對外響應數(shù)據(jù)。
  3. 服務消費方需要自定義一個異常解碼器的 bean。

這里我在 provider 中自定義了一個 DemoException:

通常這個類應該定義在公司內(nèi)部的通用包中,這里為了演示方便。

接著定義了一個 HttpStatus 的類用于統(tǒng)一對外響應。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class HttpStatus {
private String appName;
private int code;
private String message;
private String debugStackTrace;
}

這個也應該放在通用包中。

然后在 provider 中定義全局異常處理:

當出現(xiàn)異常時便會返回一個 http_code=500 的數(shù)據(jù):

到這一步又會出現(xiàn)一個引戰(zhàn)話題:HTTP 接口返回到底是全部返回 200 然后通過 code 來來判斷,還是參考 http_code 進行返回?

這里不做過多討論,具體可以參考耗子叔的文章: “一把梭:REST API 全用 POST”

feign-plus 默認采用的 http_code !=200 才會認為發(fā)生了異常。

而這里的 http_status 也是參考了 Google 的 api 設計:

具體可以參考這個鏈接: https://cloud.google.com/apis/design/errors#propagating_errors。

然后定義一個異常解析器:

@Configuration
public class FeignExceptionConfig {
@Bean
public FeignErrorDecoder feignExceptionDecoder() {
return (methodName, response, e) -> {
HttpStatus status = JSONUtil.toBean(response, HttpStatus.class);
return new DemoException(status.getAppName(), status.getCode(), status.getMessage(), status.getDebugStackTrace());
};
}
}

通常這塊代碼也是放在基礎包中。

這樣當服務提供方拋出異常時,消費者便能成功拿到該異常:

實現(xiàn)原理

實現(xiàn)原理其實也比較簡單,了解 rpc 原理的話應該會知道,服務提供者返回的異常調用方是不可能接收到的,這和是否由一種語言實現(xiàn)也沒關系。

畢竟兩個進程之間的棧是完全不同的,不在一臺服務器上,甚至都不在一個地區(qū)。

所以 provider 拋出異常后,消費者只能拿到一串報文,我們只能根據(jù)這段報文解析出其中的異常信息,然后再重新創(chuàng)建一個內(nèi)部自定義的異常(比如這里的 DemoException),也就是我們自定義異常解析器所干的事情。

下圖就是這個異常傳遞的大致流程:

code message 模式

由于 feign-plus 默認是采用 http_code != 200 的方式來拋出異常的,所以采用 http_code=200, code message 的方式響應數(shù)據(jù)將不會傳遞異常,依然會任務是一次正常調用。

不過基于該模式傳遞異常也是可以實現(xiàn)的,但沒法做到統(tǒng)一,比如有些團隊習慣 code !=0 表示異常,甚至字段都不是 code;再或者異常信息有些是放在 message 或 msg 字段中。

每個團隊、個人習慣都不相同,所以沒法抽象出一個標準,因此也就沒做相關適配。

這也印證了使用國際標準所帶來的好處。

限于篇幅,如果有相關需求的朋友也可以在評論區(qū)溝通,實現(xiàn)上會比現(xiàn)在稍微復雜一點點。

總結

項目源碼: https://github.com/crossoverJie/feign-plus。

基于2022年云原生這個背景,當然更推薦大家使用 gRPC 來做服務間通信,這樣也不需要維護類似于這樣的庫了。

不過在一些調用第三方接口而對方也沒有提供 SDK 時,這個庫也有一定用武之地,雖然使用原生 feign 也能達到相同目的,但使用該庫可以使得與 Spring 開發(fā)體驗一致,同時內(nèi)置了日志、metric 等功能,避免了重復開發(fā)。

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-09-11 11:38:53

漏斗工具模型

2020-11-04 07:56:19

工具Linux 翻譯

2014-08-18 09:58:48

一銘龍鑫操作系統(tǒng)

2021-04-19 15:37:43

鴻蒙HarmonyOS應用

2011-10-27 09:45:40

諾基亞增強現(xiàn)實Live View

2009-01-16 18:17:35

服務器虛擬化VMware

2013-03-25 16:07:13

和信創(chuàng)天云存儲

2014-10-29 15:11:35

Cocos Studi

2021-02-03 07:56:08

版本游戲邏輯

2021-04-27 07:52:19

StarterSpring Boot配置

2011-02-22 14:32:24

2011-12-12 17:31:02

虛擬設備isyVmon v2.VMware

2022-10-08 08:15:55

GScriptGo 語言

2021-11-04 17:23:03

Java對象 immutable

2022-01-21 07:35:06

LRU緩存java

2021-11-29 07:47:57

gRPCGUI客戶端

2013-04-26 10:10:52

2009-11-24 18:20:16

曙光Gridview管理

2011-08-31 13:35:50

PhotovinePiictu照片分享
點贊
收藏

51CTO技術棧公眾號

国产精品久久一卡二卡| 亚州av乱码久久精品蜜桃| 色综合久久中文综合久久97| 久久99精品久久久久子伦 | 亚洲最新视频在线观看| 国产精品视频一区二区三区经| 特黄视频免费看| 日韩中文在线电影| 精品国产免费一区二区三区四区| 91猫先生在线| 自拍亚洲图区| 国产日产亚洲精品系列| 97se在线视频| 影音先锋国产在线| 亚洲黄网站黄| 久久成年人免费电影| 大又大又粗又硬又爽少妇毛片 | 欧美18—19性高清hd4k| 一区二区三区在线免费看| 91福利国产精品| 国产av国片精品| 在线观看的av| 91美女片黄在线| 99re视频在线| 国产伦精品一区二区三区四区 | 在线免费观看欧美| 久久天天躁夜夜躁狠狠躁2022| 丰满少妇一区二区三区| 91tv亚洲精品香蕉国产一区| 亚洲国产精品嫩草影院| 欧美一级黄色录像片| av电影在线网| 久久久久久99久久久精品网站| 成人国产精品日本在线| 成人av网站在线播放| 精品动漫av| 欧美另类第一页| 蜜桃视频最新网址| 日本一区二区三区视频| 日韩极品精品视频免费观看| 最新中文字幕日本| 日本一区二区三区视频在线看| 精品视频1区2区| 88av.com| 日本肉肉一区| 欧美日韩在线三级| 国产精品天天av精麻传媒| 2020av在线| 亚欧色一区w666天堂| 97中文字幕在线| 在线观看中文| 亚洲一区在线视频观看| 久久这里只有精品8| av在线下载| 久久精品一区二区三区四区| 欧美二级三级| 成人亚洲性情网站www在线观看| 国产午夜精品久久久久久免费视 | 97国产精品视频| 国产精品密蕾丝袜| 九九热线有精品视频99| 亚洲欧美激情一区| 久久亚洲AV无码专区成人国产| 久久av中文| 在线成人一区二区| 午夜黄色福利视频| 综合天堂av久久久久久久| 久久久91精品| 久久精品免费在线| 午夜在线a亚洲v天堂网2018| 日本高清视频一区| 伊人久久一区二区| 国产传媒日韩欧美成人| 国产视色精品亚洲一区二区| 天天综合在线视频| 99久久99久久综合| 午夜精品福利一区二区| 国产精品久久久久久福利| 一区二区三区在线免费观看 | 最新成人av网站| 欧美最顶级的aⅴ艳星| 人妻体内射精一区二区三区| 国产午夜在线观看| 国产女人aaa级久久久级| 亚洲毛片aa| 婷婷色在线资源| 午夜激情一区二区三区| 男人操女人免费| 91久久青草| 亚洲国产精彩中文乱码av| 玖玖爱在线观看| 婷婷亚洲五月色综合| 欧美精品xxx| av大片免费观看| 国产自产视频一区二区三区| 国产精品久久久久久久小唯西川 | 成人短视频下载| 麻豆精品传媒视频| av理论在线观看| 欧美性xxxxxxx| 精品国产鲁一鲁一区二区三区| 粉嫩av一区二区| 中文字幕一精品亚洲无线一区| 久久久美女视频| 免费在线成人网| 国产高清在线精品一区二区三区| 精华区一区二区三区| 亚洲免费毛片网站| 密臀av一区二区三区| 综合激情五月婷婷| 日韩在线欧美在线国产在线| 日韩精品国产一区二区| 精品一区二区免费| 蜜桃久久精品乱码一区二区| av香蕉成人| 在线看日本不卡| 一本色道综合久久欧美日韩精品 | 国产又粗又猛又黄又爽| 26uuu久久天堂性欧美| 无码人妻aⅴ一区二区三区日本| 黄色亚洲网站| 日韩av资源在线播放| 妺妺窝人体色www聚色窝仙踪| 青青草精品视频| 蜜桃免费一区二区三区| 电影k8一区二区三区久久| 欧美美女直播网站| av网站免费在线看| 欧美亚洲专区| 国模精品娜娜一二三区| 欧美日韩经典丝袜| 91精品欧美一区二区三区综合在| 性欧美精品男男| 久久久久网站| 欧美精品123| 免费看男女www网站入口在线| 亚洲精品在线观看网站| 久久国产美女视频| 国内精品久久久久影院色| 日产国产精品精品a∨| 亚洲女同av| 国产视频久久久久久久| 国产一级做a爱片久久毛片a| 成人午夜短视频| 国产精品久久久久久久乖乖| 久久gogo国模啪啪裸体| 久久精品99久久久香蕉| 国产精品热久久| 亚洲女同一区二区| 中文字幕在线观看视频www| 亚洲自拍偷拍网| 亚洲精品日韩激情在线电影| 国产不卡在线| 日韩精品专区在线影院重磅| 九九热视频精品| 丁香六月综合激情| 青青青免费在线| 亚洲老女人视频免费| 欧日韩不卡在线视频| 欧美少妇另类| 在线亚洲人成电影网站色www| 国产午夜福利一区| 久久99精品国产.久久久久久| 咪咪色在线视频| 91精品国产自产在线丝袜啪| 国内精品久久久久久中文字幕| 国产自产一区二区| 色哟哟一区二区在线观看| 亚洲第一综合网| 精品在线观看免费| 日本精品久久久久久久久久| 玖玖玖免费嫩草在线影院一区| 日本精品一区二区三区在线播放视频 | 国产亚洲精品久久久久久无几年桃 | 欧美jjzz| 蜜桃视频成人| 9999精品| 91精品国产91久久久久久| 国产日本在线观看| 亚洲五月激情网| 天堂91在线| 色综合天天性综合| 亚洲天堂最新地址| 国产精品亚洲专一区二区三区| 99久久久精品视频| 蜜桃视频欧美| 亚洲a级在线观看| 亚洲精品福利电影| 欧美88av| 国产精品福利小视频| 黄色一级大片在线免费看产| 亚洲成av人片在线观看香蕉| 日本熟女毛茸茸| 亚洲男同1069视频| 91久久免费视频| 国产九色精品成人porny| 免费高清在线观看免费| 午夜国产一区二区| 蜜桃视频在线观看成人| 亚洲午夜国产成人| 欧美在线视频免费播放| 成人在线直播| 精品视频中文字幕| 国产极品久久久| 欧美系列亚洲系列| 日韩xxx高潮hd| 日韩理论在线观看| 亚洲激情视频小说| 成人性生交大片免费看中文 | 欧美一区=区| 成人黄色片免费| 欧美一区二区性| 久久av免费观看| 欧美黄色一级| 国产欧洲精品视频| 欧美黑人疯狂性受xxxxx野外| 欧美裸体男粗大视频在线观看| www.亚洲免费| 亚洲人成在线播放| 天天干,夜夜操| 精品日本一线二线三线不卡| 91久久久久久久久久久久| 色综合网站在线| 91九色丨porny丨肉丝| 一级中文字幕一区二区| 黄色录像免费观看| 中文字幕乱码日本亚洲一区二区| 日本韩国欧美精品大片卡二| 免费看美女视频在线网站| 日韩精品中文字幕在线播放| 性欧美18一19性猛交| 欧美日韩一区 二区 三区 久久精品| 国产又色又爽又黄的| 亚洲欧美日韩国产综合| 在线观看天堂av| 欧美韩日一区二区三区| 乐播av一区二区三区| 久久久久久一二三区| 少妇饥渴放荡91麻豆| av成人老司机| 中文字幕无码人妻少妇免费| 不卡的av电影在线观看| 亚洲一级Av无码毛片久久精品| 国产成人免费av在线| 日本亚洲一区二区三区| 久久久久久毛片| 300部国产真实乱| 国产精品97| japanese在线视频| 国产精品久久天天影视| 一区二区高清视频| 99re久久最新地址获取| 一区二区三区av在线| 日本一二区不卡| 日本黄色a视频| 久久婷婷国产综合尤物精品| 欧美一级大黄| 国产精品18久久久久久首页狼| 美女日韩欧美| 国产精品欧美激情| 亚洲毛片在线免费| 91精品国产高清久久久久久91裸体| 欧美三级一区| 国产一区二区视频在线免费观看| 欧美一性一交| 日本精品免费| 国产精品7m凸凹视频分类| japanese在线播放| 日韩亚洲国产欧美| 日本在线视频www| 美国十次了思思久久精品导航 | 免费不卡在线视频| 亚洲妇熟xx妇色黄蜜桃| 国产成人午夜精品影院观看视频| 中文字幕在线视频播放| 久久久精品一品道一区| 成人三级视频在线观看| 亚洲尤物视频在线| 日韩精品一区二区亚洲av| 欧美日韩激情一区二区| 亚洲经典一区二区| 国产午夜精品视频| 18+视频在线观看| 2019中文在线观看| 综合久草视频| 久久久一本精品99久久精品| 91视频精品| 九一国产精品视频| 麻豆91在线播放免费| 欧美大喷水吹潮合集在线观看| 国产日韩欧美精品电影三级在线| www.99re7| 在线免费不卡视频| 日本精品一二区| 久久国内精品一国内精品| 韩国成人二区| 亚洲一区二区三区乱码aⅴ| 久久av免费| 黄色一级片在线看| 精品综合免费视频观看| 国产肉体xxxx裸体784大胆| 中文字幕一区二区在线播放| 欧美三级韩国三级日本三斤在线观看 | 国产一区二区激情| 美女搞黄视频在线观看| 91色p视频在线| 国语产色综合| 免费看又黄又无码的网站| 国模大尺度一区二区三区| 精品无码一区二区三区| 成人资源视频网站免费| 51漫画成人app入口| 国产精品极品美女在线观看免费| 香蕉大人久久国产成人av| 视频在线99| 国产精品一页| 在线中文字日产幕| 亚洲人成网站在线| 亚洲视频一区二区三区四区| 日韩电影在线观看永久视频免费网站| 国产在线69| 国产欧美一区二区三区久久| 久久久影院一区二区三区| 精品国产一区二区三区不卡蜜臂| 艳母动漫在线免费观看| 久久性天堂网| 国产精品无码网站| 亚洲成人自拍偷拍| 亚洲大尺度视频| 欧美成人精品xxx| 亚洲资源在线| 一区二区三区四区五区视频| 久久久久久夜| 国产又粗又猛又爽视频| 欧美天堂在线观看| 欧美亚洲日本| 欧洲中文字幕国产精品| 韩国女主播一区二区三区| 日韩欧美猛交xxxxx无码| 国模无码大尺度一区二区三区| 国产在线免费看| 欧美日韩免费不卡视频一区二区三区 | 六九午夜精品视频| 水蜜桃一区二区三区| 日本视频一区二区| 神马久久久久久久久久久| 欧美中文一区二区三区| 成年人免费在线视频| 国产精品综合不卡av| 四季av一区二区三区免费观看| 天天看片天天操| 亚洲欧美日韩久久| 国产成人精品一区二三区四区五区| 欧美成人激情图片网| 国产女人18毛片水真多18精品| 中文字幕无码精品亚洲资源网久久| 成人sese在线| 亚洲欧美自拍视频| 尤物yw午夜国产精品视频明星| 日韩成人精品一区二区三区| 伊人情人网综合| 成人性生交大片| 99精品人妻国产毛片| 在线日韩中文字幕| 日本精品视频| 免费观看精品视频| 国产精品久久久久久久岛一牛影视| 国产精品区在线观看| 久久乐国产精品| 精品国产91乱码一区二区三区四区 | 亚洲精品无码久久久久| 久久手机精品视频| 免费看成人人体视频| 中文字幕永久视频| 一区二区三区在线不卡| 亚州视频一区二区三区| 欧美做受高潮6| 亚洲欧美一区二区视频| 99精品久久久久久中文字幕| 欧美激情久久久久| 西野翔中文久久精品字幕| 亚洲 欧美 另类人妖| 亚洲狠狠丁香婷婷综合久久久| 蜜臀av中文字幕| 国产成人avxxxxx在线看| 中文字幕午夜精品一区二区三区| 污片免费在线观看| 欧美日韩精品一二三区| 男男gaygays亚洲| 在线观看中文字幕2021| 欧美色男人天堂| 国产黄网站在线观看| 国内一区二区三区在线视频| 日韩精品免费专区| 久久久久久久久精| 伊人伊成久久人综合网小说 | 亚洲专区国产精品| 久久久精品五月天| 久久久久久天堂| 色噜噜狠狠狠综合曰曰曰88av|