如今愈來愈多的公司開始擁抱Spring Cloud了,不少Java方向的同窗也開始積極的學習Spring Cloud,其實這邊還有一個問題就是說:雖然你們學了Eureka,Ribbon,Hystrix,Zuul,Feign等等,可是要運用到實際的項目中去仍是有些難度的。bash
微服務難就難在服務的拆分上,框架只是工具,不少人都會用,服務拆分,服務之間的關係這些都是在拆分時候須要考慮的事情。微信
今天就有一位同窗給我發郵件,諮詢我下面2個問題:app
下面以我本身的經驗來作一些解答,僅供參考:框架
咱們所說的API其實就是一個接口,大部分都是用Spring MVC方式去開發的,也就是Controller中的一個加了註解的方法,註解就是咱們經常使用的那幾個:微服務
這種其實也沒有固定的模式,大部分是直接經過API網關轉發到你的業務服務上工具
以猿天地這樣的博客網站的業務類舉例:學習
有一個業務功能,當我查看具體的博客文章的時候,須要返回的信息以下:網站
這個時候咱們這個查看文章的接口其實就涉及到了3部分的數據,文章自己的信息,評論信息,做者的信息ui
就是有3個服務,用戶服務,博客服務,評論服務spa
那麼問題來了,涉及到多個服務以前的交互,其實跟上面那位同窗問個人是同樣的問題,是否須要統一工程,組裝其餘服務?是否能夠相互調用?
這種的話我推薦2種實現方式:
咱們這個API就是一個獲取博文信息的接口,主體確定是博客服務,在博客服務中有一個博文信息的接口,在接口中去調用用戶服務提供的用戶信息接口,還要去調用評論服務中博文的評論信息,下面看僞代碼:
@GetMapping("/blog/detail/{id}")
public BlogInfo blogInfo(@PathVariable("id") Long id) {
// 獲取博客信息
Blog blog = blogService.getById(id);
// 獲取用戶信息
UserInfo userInfo = userFeignClient.getUserInfo(blog.getUserId());
// 獲取評論信息
CommentInfo commentInfo = commentFeignClient.getCommentInfo(id);
return 組裝全部信息返回。
}
複製代碼
集合服務層也就是上面那位同窗說的是否是須要有一個統一的工程來作組裝服務的事情,這個就是說咱們博客服務仍是提供基礎的博客信息,單獨加一個業務的聚合服務用來組裝這些信息統一返回給調用方,僞代碼以下:
@GetMapping("/blog/detail/{id}")
public BlogInfo blogInfo(@PathVariable("id") Long id) {
// 獲取博客信息
Blog blog = blogFeignClient.getById(id);
// 獲取用戶信息
UserInfo userInfo = userFeignClient.getUserInfo(blog.getUserId());
// 獲取評論信息
CommentInfo commentInfo = commentFeignClient.getCommentInfo(id);
return 組裝全部信息返回。
}
複製代碼
數據都是遠程調用的,固然這邊你能夠並行去調用,還有一種方式就是聚合操做在API網關中進行,這種方案也是可行的,我建議仍是不要在網關中作,API網關儘可能簡單,只轉發,增長聚合服務層是不錯的選擇。
若是你的服務治理是用dubbo構建的,聚合服務層也是比較好的方法,將dubbo服務聚合統一提供http接口給外部調用。
還有一種方式的話就是調用方本身去分別調用博客接口,評論接口,用戶接口,這樣的話接口只須要關注本身自己的數據,把組裝的問題交給的使用方,這種通常用的比較少,最好是一次性將要用的數據返回給調用方,反覆調用特別是在移動端,請求太多了,浪費流量。
至於要怎麼去組裝數據,仍是得你本身來定,能夠將組裝放在對應的業務服務中,也能夠單獨增長一個聚合服務來組裝,也可讓客戶端本身去組裝。
服務之間確定是能夠相互調用的,要是不能相互調用,那麼你拆開還有什麼意義,用Feign來調用服務接口,你就把它當作Service之間的調用便可。 更多技術分享請關注微信公衆號:猿天地