天天看點

在阿裡雲容器服務上開發基于Docker的Spring Cloud微服務應用(四)

本文為阿裡雲容器服務spring cloud應用開發系列文章的第四篇。

四、服務間通信與內建(本文)

服務之間的通信一般采用http+json協定,由于http的開銷遠大于本地調用,在調用的時候一定要注意服務間api的粒度。

在前文我們已經示範了如何利用eureka進行服務發現。在示例代碼中,<code>foobar</code>服務需要通過http/json調用<code>foo</code>服務和<code>bar</code>服務。spring cloud提供及對http協定和json解析的支援,具體可以參見下面的代碼示例:

resttemplate的聲明需要加上<code>@autowired</code>和<code>@loadbalanced</code>兩個注解。在随後對<code>resttemplate.getforobject</code>的調用傳入服務的url。

其中<code>bar</code>服務名,<code>/message</code>為希望調用的url path。 <code>resttemplate.getforobject</code>從eureka中獲得<code>bar</code>服務的所有執行個體,并根據内置的負載均衡算法選擇一個執行個體調用并傳回結果。

這段内容和前文介紹的服務發現和調用的内容一緻,通過resttemplate可以完成服務的發現和調用(http協定)。springcloud提供的其它方式我們就不在這裡讨論了。

本文的示例代碼中沒有示範消息通信,這部分内容以後會更新。

在build.gradle中添加如下内容可以将java項目對mysql的依賴包導入。

建立jpa通路資料庫的interface,代碼見<code>foo</code>服務的<code>inforepository.java</code>檔案。

在代碼中通過上面定義的interface通路資料庫,代碼見<code>foo</code>服務的<code>foocontroller.java</code>檔案:

對資料的初始化部分就不在這裡讨論了,讀者可以根據自己的實際情況選擇方案。

<code>foo</code>的代碼示範如何通路mysql資料庫,同樣的代碼也可以用于通路阿裡雲上的rds服務。

在application.yml中配置對mysql的通路資訊。

<code>jdbc:mysql://mysql:3306/</code>中<code>mysql:3306</code>表示通路位址為mysql的3306端口。通過docker-compose啟動服務的時候,可以通過docker compose檔案指定mysql所具體對應的位址,可以是一個容器化的mysql鏡像,也可以是阿裡雲上的rds服務。

通路mysql鏡像,一般用于開發測試環境,檔案為<code>docker-compose.yml</code>:

docker-compose為下載下傳<code>registry.aliyuncs.com/acs-sample/mysql:5.7</code>鏡像并建立一個mysql容器,<code>foo</code>通過<code>links</code>将自己要通路的mysql和實際的mysql關聯起來。

如果要通路rds服務,則隻需将mysql的<code>image</code>改為<code>external</code>,<code>foo</code>在docker compose檔案中的配置不用更改。這部分内容存在docker-compose.acs.yml:

本文示範了spring cloud應用如何利用http進行同步通信,在資料庫通路一節,讨論如何通過docker compose檔案配置對mysql或rds的通路。