工程師日記20181007

今天聊一聊后臺(tái)工程師(java初級工程師)的工作日常,微服務(wù)還有API。

導(dǎo)語:哎日常工作不就是增刪改查嗎!

其實(shí)初級工程師的日常工作還真是增刪改查。不過卻也沒那么簡單。談一下需要做好的工作吧

  1. 接口設(shè)計(jì)

  2. 代碼設(shè)計(jì)

API設(shè)計(jì)其實(shí)不是一個(gè)簡單的活,業(yè)界認(rèn)可的就是restful 規(guī)范,其次,就是接口文檔。要是你能夠定義一套規(guī)范的restful 的api,那層次算特別高的了。
其次,要維護(hù)一套文檔。
再者,api是對外的,對內(nèi)的,就是你的代碼結(jié)構(gòu),一個(gè)好的項(xiàng)目就是23種設(shè)計(jì)模式的有機(jī)結(jié)合。用好這寫設(shè)計(jì)模式,也是需要時(shí)間沉淀的。
最后,就是微服務(wù)的劃分。其實(shí)微服務(wù)的劃分這個(gè)有點(diǎn)屬于架構(gòu)師的工作范疇了,常見是基于業(yè)務(wù)領(lǐng)域的服務(wù)劃分,劃分過細(xì)的話,分分鐘一個(gè)保存操作,涉及三四個(gè)分布式事務(wù)。

本篇就討論一下微服務(wù)API吧

一、微服務(wù)的API設(shè)計(jì)

1.1.思想

之前領(lǐng)導(dǎo)是一個(gè)特別牛逼的偏前端的全棧工程師,那時(shí)候,我剛畢業(yè)對于一些api的設(shè)計(jì)理解有點(diǎn)偏,就是有點(diǎn)像是亂開接口。參數(shù)類型等等,定義不規(guī)范。那時(shí)候,給我看了幾家他就職過的大廠的接口的demo,引導(dǎo)我那種design在哪種場景更加合適。還有小接口,大接口。

總結(jié)起來就是:

不是為了一個(gè)功能方法而去開放一些需要的接口,而是為了一個(gè)功能模塊,我們后臺(tái)需要去開一套維度合適的接口。

有一個(gè)特別快的提升方式,跟一個(gè)前端工程師交朋友,每天問他,現(xiàn)在給的接口用起來會(huì)不會(huì)更爽一點(diǎn)。

1.2.服務(wù)提供者,和消費(fèi)者

見過幾個(gè)廠的微服務(wù)架構(gòu)。其實(shí)大同小異。對于服務(wù)的提供者和消費(fèi)者,都有自己的見解。但是在我看過的幾個(gè)項(xiàng)目,也有跟其他大神討論過,可以總結(jié)出來,大概有兩種形式吧:

  1. 提供者既是消費(fèi)者:
  2. 提供者與消費(fèi)者分層:

在這里得講兩個(gè)概念,外部接口,內(nèi)部接口。

外部接口其實(shí)沒啥可解釋的。

內(nèi)部接口,就是提供給其他微服務(wù)的接口,可以理解為service層的遠(yuǎn)程實(shí)現(xiàn),一般來說,是不對外開放。

服務(wù)提供者,就可以理解為是平時(shí)單機(jī)架構(gòu)里面的service層,

而消費(fèi)者,就是調(diào)用一或多個(gè)service,進(jìn)行業(yè)務(wù)邏輯操作,在某廠稱為business層。

消費(fèi)者開的是外部接口,提供者開的是內(nèi)部接口。

在下面的項(xiàng)目里面,其實(shí)就是提供者既是消費(fèi)者,但是,我在zuul里面沒有做控制而已。

1.3.微服務(wù)的API以及接口

對于服務(wù)的消費(fèi)者,一般寫的API,都是要遵循restful規(guī)范。

對于服務(wù)的提供者,我感覺,把他看成一個(gè)用http協(xié)議的遠(yuǎn)程接口就OK了,如果要用restful規(guī)范,會(huì)失去一定的靈活性(在做接口設(shè)計(jì)的時(shí)候是可以體會(huì)得到的)。
從兩個(gè)維度說吧:

  1. 框架方面

比如說,阿里的dubbo,新浪的motan,的服務(wù)提供者都是RPC框架實(shí)現(xiàn)的。你說要基于restful 嗎?

  1. 其他方面(分布式事務(wù)等)

先普及一下分布式事務(wù):

一般來說,微服務(wù)架構(gòu),多數(shù)使用的是柔性事務(wù)(基于業(yè)務(wù)代碼的事務(wù),不是基于資源的事務(wù))有三種:

  1. 基于消息的最終一致性事務(wù)
  2. TCC事務(wù)
  3. 最大努力通知型事務(wù)

比如說,一個(gè)提供者接受到一個(gè)請求,需要跨服務(wù)保存操作。這樣就涉及到分布式事務(wù),使用消息的最終一致性事務(wù)的話,是發(fā)一條消息過去,而用TCC的話,一個(gè)保存操作又有了一個(gè)取消接口,確認(rèn)接口。一個(gè)服務(wù)提供者,寫的接口也要遵循 restful design的話,******,所以說,不要太較真,物極必反。

接口校驗(yàn)

其實(shí)過濾器是公司統(tǒng)一的,其次就是一些接口校驗(yàn)了。其實(shí)也沒啥好說的。一般@Vaild校驗(yàn)的都是格式,長度,大小之類的。判空的一般會(huì)在Controller里面的業(yè)務(wù)邏輯里面做。

異常處理

其實(shí)更準(zhǔn)確的來說,是狀態(tài)碼。
狀態(tài)碼處理的話主要分兩種,一種是消費(fèi)者的,一種是提供者的。
消費(fèi)者的狀態(tài)碼:
其實(shí)就是給前端的狀態(tài)碼,比如說,有時(shí)候,你點(diǎn)擊一個(gè)按鈕,顯示,服務(wù)器繁忙請稍后再試,很多時(shí)候,前端顯示的提示信息,都是根據(jù)后臺(tái)給的狀態(tài)碼,還有信息顯示的。
提供者的狀態(tài)碼:
在Spring Cloud中,可以理解為Feign Client調(diào)用服務(wù)失敗,要怎么處理,比如說,你去調(diào)一另外一個(gè)服務(wù)查詢,返回500,其實(shí)可能有時(shí)候,那個(gè)服務(wù)當(dāng)?shù)袅?,這時(shí)候,你重試,再去調(diào)一次(基于負(fù)載均衡,調(diào)的是另外一臺(tái)服務(wù)器)可能就OK了,但是,如果,返回個(gè)不存在,這時(shí)候你重試是沒有意義的。

最后上代碼

allen-api-demo用到了 SPRING MVC + SWAGGER + OAUTH

水平有限,只是寫了一些API文檔的維護(hù),校驗(yàn),異常處理,接口權(quán)限,返回視圖的簡要使用方式。

再來一個(gè)今年一月多寫的

flexible-transaction-event-demo 基于消息的最終一致性事務(wù)

TCC的,看了挺多設(shè)計(jì)方法,也有再加一個(gè)事務(wù)的協(xié)調(diào)者的。后面再慢慢分享出來吧。

結(jié)語
自己的學(xué)習(xí)路程是先打好基礎(chǔ),然后分課題學(xué)習(xí)。我覺得大概我研究完這幾個(gè)課題應(yīng)該就有中級工程師水準(zhǔn)了

  • 軟件工程
  • API設(shè)計(jì)
  • 分布式事務(wù)
  • 消息中間件
  • 數(shù)據(jù)庫
  • 設(shè)計(jì)模式

自己研究的比較好的課題是API設(shè)計(jì),然后自己花的最多時(shí)間去吃的是分布式事務(wù)。再者,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容