国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

前言

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

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

巧合的時最近內部有部分項目又計劃采用 SpringBoot + K8s 開發,于是便著手繼續維護;現已經內部迭代了幾個版本比較穩定了,也增加了一些實用功能,在此分享給大家。

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

首先是新增了一些 features:

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

示例

結合上面提到的一些特性做一些簡單介紹,統一的 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 模塊,根據其中聲明的接口進行遠程調用。

配置文件:

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

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

@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");
}
}

監控 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 中實現該功能需要幾個步驟:

  1. 自定義一個通用異常。
  2. 服務提供方需要實現一個全局攔截器,當發生異常時統一對外響應數據。
  3. 服務消費方需要自定義一個異常解碼器的 bean。

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

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

接著定義了一個 HttpStatus 的類用于統一對外響應。

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

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

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

當出現異常時便會返回一個 http_code=500 的數據:

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

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

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

而這里的 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());
};
}
}

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

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

實現原理

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

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

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

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

code message 模式

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

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

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

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

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

總結

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

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

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

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

2023-09-11 11:38:53

漏斗工具模型

2020-11-04 07:56:19

工具Linux 翻譯

2014-08-18 09:58:48

一銘龍鑫操作系統

2021-04-19 15:37:43

鴻蒙HarmonyOS應用

2011-10-27 09:45:40

諾基亞增強現實Live View

2009-01-16 18:17:35

服務器虛擬化VMware

2013-03-25 16:07:13

和信創天云存儲

2014-10-29 15:11:35

Cocos Studi

2021-02-03 07:56:08

版本游戲邏輯

2021-04-27 07:52:19

StarterSpring Boot配置

2022-10-08 08:15:55

GScriptGo 語言

2011-02-22 14:32:24

2011-12-12 17:31:02

虛擬設備isyVmon v2.VMware

2022-01-21 07:35:06

LRU緩存java

2021-11-04 17:23:03

Java對象 immutable

2021-11-29 07:47:57

gRPCGUI客戶端

2009-11-24 18:20:16

曙光Gridview管理

2013-04-26 10:10:52

2011-08-31 13:35:50

PhotovinePiictu照片分享
點贊
收藏

51CTO技術棧公眾號

欧美成人在线免费观看| 欧美日韩性生活| 97视频在线观看成人| 在线观看的av| 99精品国产一区二区三区不卡| 男人艹女人网站| 美州a亚洲一视本频v色道| 欧美日韩在线观看视频小说| 日本成人超碰在线观看| 久久免费午夜影院| 亚洲国产欧美日韩精品| 日韩在线小视频| 中文字幕亚洲第一| 高清欧美性猛交xxxx黑人猛交| 97婷婷涩涩精品一区| 国产精品爽爽爽| 天海翼一区二区三区四区在线观看| 亚洲欧美激情在线| 日韩av免费电影| 日本不卡高清| 午夜精品一区二区三区在线播放| 欧美黑人疯狂性受xxxxx野外| 欧美色综合网站| 国产香蕉尹人视频在线| 亚洲国产精品国自产拍av| 国产人妻777人伦精品hd| 美女视频免费一区| 精品国产免费一区二区三区 | 一区二区精品伦理... | 一区二区久久久久久| 波多野结衣家庭教师在线播放| 日韩中文字幕麻豆| 久久综合伊人77777麻豆| 欧美久久九九| 成人激情视频在线播放| 欧美日韩一二三四| 欧美在线一级视频| 天堂网av成人| 国产精品你懂得| 国产一区二区三区不卡视频网站| 久久久久久国产精品美女| 久久av影院| 久久久av亚洲男天堂| 国产一区二区视频在线看| 久久亚洲精品成人| 成人福利免费在线观看| 欧美怡红院视频一区二区三区| 99ri日韩精品视频| 欧美综合在线观看| 久久一区二区三区喷水| 国产精品亚洲一区二区三区| 欧美激情黄色片| 91久久精品美女高潮| 亚洲午夜黄色| 久久综合一区| 精品一区二区三区久久久| avove在线观看| av成人免费在线观看| 中文字幕国内自拍| 亚洲一区二区精品久久av| 激情小视频在线| 日韩女同互慰一区二区| 你懂得影院夜精品a| 久久国产精彩视频| 日本一区二区在线看| 91精品久久香蕉国产线看观看| 国产欧美日本| 国产精品va在线观看无码| 国产亚洲精久久久久久| 中文字幕第12页| 欧美一区三区四区| 成人亚洲免费| 国产精品劲爆视频| 久久久久久一区二区| 国产午夜福利在线播放| 亚洲欧洲综合另类在线| 国产区在线视频| 欧美精品一区二区三区蜜臀| 九九久久国产| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲一区影音先锋| 免费日本一区二区三区视频| 日韩精品在线观看一区| 红杏aⅴ成人免费视频| 91在线观看欧美日韩| 久久精品国产精品亚洲精品| 香港日本韩国三级网站| 欧美日韩视频一区二区| 欧美精品总汇| 国产精品人成电影| 九九热在线视频观看这里只有精品| 超碰网在线观看| 欧美日韩精品是欧美日韩精品| 福利精品在线| 国产aⅴ精品一区二区三区黄| 国产精品一区二区久久精品爱涩| av小说在线| 亚洲国产精品电影在线观看| 日韩精品三级| 欧美性色黄大片人与善| 欧美国产禁国产网站cc| 成人在线网址| 国产精品草莓在线免费观看| 青青国产91久久久久久| 日本免费视频www| 亚洲人成在线观看| 中文字幕免费精品| 欧美性猛交xxx乱久交| 日韩欧美一区二区在线视频| 天堂俺去俺来也www久久婷婷| 一本一道久久久a久久久精品91| 综合久久久久久久| 我爱我色成人网| 国产精品一区二区三区免费观看| eeuss国产一区二区三区| 成人av一区| 欧美在线观看视频| 波多野结衣中文字幕一区二区三区| 免费福利在线观看| 欧美一级电影久久| 99国产精品久久久久久久久久久| 黄色免费网站在线| 91在线直播亚洲| 欧美韩国日本一区| 成人影院网站| 久久久久久a亚洲欧洲aⅴ| 亚洲精品日产精品乱码不卡| 精品视频在线一区二区在线| 久久亚洲高清| 精品久久久久久久久久久| 久久女人天堂| 中文字幕欧美日韩一区二区| 欧美在线观看你懂的| 亚洲理论电影片| 日韩精品无码一区二区三区免费| 亚洲国产精品一区二区三区| 伊人久久亚洲热| 日漫免费在线观看网站| 日韩av高清不卡| 中文字幕在线视频一区| 精品一区91| 自慰无码一区二区三区| 日韩乱码在线视频| 免费在线看成人av| 午夜伦理在线视频| 久久一区二区三区av| 欧美在线高清视频| 午夜性色一区二区三区免费视频| 激情校园亚洲图片| 8050国产精品久久久久久| 91免费精品国自产拍在线不卡| 欧美aa免费在线| 黄色www在线观看| 日韩电影中文字幕| 国内精品久久久久影院一蜜桃| 51精品视频| 好吊色视频988gao在线观看| 亚洲激情 国产| 久久电影国产免费久久电影 | 午夜成在线www| 日本一区二区不卡| 亚洲综合在线观看视频| 国产免费av一区二区三区| 涩涩漫画在线观看| 欧洲午夜精品久久久| 亚洲另类中文字| 99久久.com| 久久久久久青草| 精品乱子伦一区二区三区| 欧美日韩电影一区| 免费在线观看一区二区三区| 成人在线黄色电影| 日本免费a视频| 久久av中文字幕| 中文字幕制服丝袜成人av| 成人羞羞网站入口免费| 91精彩在线视频| 艳母动漫在线免费观看| 久久中文精品视频| 亚洲一区二区在线免费看| 亚洲高清av| 精精国产xxxx视频在线播放| 成人区一区二区| 国内久久久精品| 精品日韩美女的视频高清| 亚洲第一伊人| 欧美不卡高清一区二区三区| 爱福利视频一区二区| 日本成人精品在线| 欧美日韩综合不卡| 国产精品影视在线观看| 电影一区二区在线观看| 你懂的在线播放| 中文字幕中文字幕一区三区| 日韩资源在线观看| 亚洲午夜精品17c| 捆绑调教美女网站视频一区| 国产精品亚洲综合在线观看 | 色午夜这里只有精品| 中文字幕永久在线不卡|