06.10 微服務:通用接口設計

什麼是微服務

微服務(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業務邏輯,就可以徹底完成一個功能的開發到上線了,開發效率將大大提高。


本公眾號團隊成員由餓了麼、阿里、螞蟻金服等同事組成,關注架構師之巔,可以瞭解最前沿的技術。

  • 長按下方的二維碼可以快速關注我們


分享到:


相關文章: