微服務:通用介面設計
什麼是微服務
微服務(Microservice)這個概念是2012年出現的,作為加快Web和移動應用程式開發程序的一種方法,2014年開始受到各方的關注,而2015年,可以說是微服務的元年;
越來越多的論壇、社群、blog以及網際網路行業巨頭開始對微服務進行討論、實踐,可以說這樣更近一步推動了微服務的發展和創新。而微服務的流行,Martin Fowler功不可沒。
微服務架構(Microservice Architecture)是一種架構概念,旨在通過將功能分解到各個離散的服務中以實現對解決方案的解耦。你可以將其看作是在架構層次而非獲取服務的類上應用很多SOLID原則。微服務架構是個很有趣的概念,它的主要作用是將功能分解到離散的各個服務當中,從而降低系統的耦合性,並提供更加靈活的服務支援。
概念:把一個大型的單個應用程式和服務拆分為數個甚至數十個的支援微服務,它可擴充套件單個元件而不是整個的應用程式堆疊,從而滿足服務等級協議。
定義:圍繞業務領域元件來建立應用,這些應用可獨立地進行開發、管理和迭代。在分散的元件中使用雲架構和平臺式部署、管理和服務功能,使產品交付變得更加簡單。
本質:用一些功能比較明確、業務比較精練的服務去解決更大、更實際的問題。

背景
現在有一個使用者服務User service,該服務主要提供登陸、註冊、登出等一系列跟使用者相關的服務,隨著業務的發展,訂單服務和產品服務需要向User service 定製各種各樣的新功能,此時User service的介面會變得越來越多,如下圖所示:

隨著定製需求越來越多,其他服務也會遇到介面氾濫同樣的問題。
通用介面設計
為了解決上述介面氾濫問題,我們提出了一個通用介面的概念,那麼什麼是通用介面?通用介面也就是使用一個介面,搞定所有業務需求。
實現方式一:入參和出參都採用Object形式
為了解決一個介面搞定所有業務,一開始我們想到了,入參和出參都採用Object的形式,程式碼如下:
1public Object common(Object param){
2 //...
3 return obj;
4}
Java中的Object是一個神奇的類,它是所有類的父類,所以在Java中它能代表一切,but,當初看到這個介面的定義的時候,你肯定想罵人了,這是什麼鬼,我怎麼能看出人蔘和出參是什麼,而且在實際的程式碼設計過程中,面對如何取object中的field也是一個難題,並且你上游的呼叫方肯定會抓狂忍不住會飈出WTF三個字。所以這樣的介面設計被我們pass了。
實現方式二:採用Map的形式
1public Map common(Map param){
2 //...
3 return map;
4}
採用Map的好處是,如果知道key的形式,可以通過key獲取入參的value,從而做出相應的邏輯處理,缺點是無法知道key的定義,也無法對入參進行校驗。
實現方式三:採用Map + zk + 檢視的形式
先看整體架構:

檢視中心的設計非常關鍵,它需要非常直觀的展示出入參、出參、業務方三者之間的關係;因此檢視中心抽象如下:
1、params,代表入參
2、event,事件型別,代表是屬於哪一個業務方呼叫的
3、result, 返回值

新增完介面的入參和出參關係後,需要將引數關係寫入到zk,寫入zk的目的是在通用介面中校驗引數型別,從而避免上游的引數型別不正確。
我們看下修改後的code:
1public Map common(Map param){
2 //獲取所屬event
3 String event = param.get("event");
4 //獲取zk引數關係資料
5 Map paramFromZk = getParamFromZk(event);
6 //引數校驗
7 checkParam(param, paramFromZk);
8 // 執行相應的業務邏輯
9 Map result = doExecute(param);
10 return result;
11}
邏輯圖如下:

這樣每次新的需求,只需要在檢視中心做配置,就可完成功能的開發了,開發週期也可以大大的縮短;對於不同的業務,執行的業務邏輯是不同的,如果做的更抽象點,可以將業務邏輯部分抽象成一個業務引擎服務,對於相同的程式碼部分寫一份即可,對於不同的邏輯部分,可以採用dsl語言進行動態配置,這樣,每次新需求,只需要在檢視中心配置引數關係,在業務引擎服務中配置dsl業務邏輯,就可以徹底完成一個功能的開發到上線了,開發效率將大大提高。
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,
需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,
但跳槽時面試碰壁。
需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,
常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。
但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5. 群號:高階架構群 Java進階群:180705916.備註好資訊!送架構視訊。
6.阿里Java高階大牛直播講解知識點,分享知識,
多年工作經驗的梳理和總結,帶著大家全面、
科學地建立自己的技術體系和技術認知!