微服務框架Spring Cloud介紹 Part2: Spring Cloud與微服務

原文地址:http://skaka.me/blog/2016/08/03/springcloud2/

之前介紹過微服務的概念與Finagle框架, 這個系列介紹Spring Cloud.

Spring Cloud還是一個相對較新的框架, 今年(2016)才推出1.0的release版本. 雖然Spring Cloud時間最短, 但是相比我之前用過的Dubbo和Finagle, Spring Cloud提供的功能最齊全.

Spring Cloud完全依賴於Spring Boot, 我先簡單介紹下Spring Boot. Spring Boot是Pivotal在Spring基礎上推出的一個支持快速開發的框架. 如果是新項目, 建議基於Spring Boot而不是Spring. 以前使用Spring的項目, 需要自己指定一大堆項目依賴, 例如依賴Spring Core, Spring MVC, Mybatis等等, Spring Boot將這些依賴都模塊化好了, 你不再需要自己手動去添加多個依賴項. 另外Spring Boot默認內嵌了一個Servlet容器, 你的頁面可以直接通過main方法啓動訪問了, 不再需要部署到單獨的應用服務器中, 這樣應用的開發調試都會方便很多. Spring Boot的這些特點使得它比較適合用來做微服務的基礎框架, 但是要開發一個完整的微服務系統可不僅僅是從命令行啓動一個web系統這麼簡單. Pivotal看到了這點, 推出了Spring Cloud.

Spring Cloud基於Spring Boot, 由衆多的子項目組成. 例如Spring Cloud Config是一箇中心化的配置管理服務, 用來解決微服務環境下配置文件分散管理的難題, Spring Cloud Stream是一個消息中間件抽象層, 目前支持Redis, Rabbit MQ和Kafka, Spring Cloud Netflix整合了Netflix OSS, 可以直接在項目中使用Netflix OSS. 目前Spring Cloud的子項目有接近20個, 如果要使用Spring Cloud, 務必先將子項目都瞭解一遍, 得知道哪些功能Spring Cloud已經提供了, 避免團隊花費大量時間重複造輪子.

Spring Cloud是伴隨着微服務的概念誕生的. 毫無疑問, 微服務真正落地是一項艱鉅的任務. 不但是技術的變革, 也是開發方式的轉變. 僅僅依靠Dubbo或Spring Cloud開發幾個互相調用的服務不能算做是微服務. 一個合格的微服務系統必然包括從設計(從業務層面劃分服務, 獨立數據庫), 到開發(選用合適的架構和工具, 解決CAP問題), 到測試(持續集成, 自動化測試), 到運維(容器化, 服務監控, 服務容錯)的一系列解決方案.

我這個系列的博客就是介紹如何藉助Spring Cloud和Netflix OSS, 來解決上面提到的問題. 之後的博客主要會涉及下面這些技術:
使用eureka和Netflix Ribbon進行服務註冊和服務發現
使用Spring Cloud Stream, zookeeper和kafka實現分佈式事務
使用hystrix實現服務隔離, 並且用hystrix dashboard和turbine監控hystrix服務
使用Spring MVC和Swagger實現REST API
使用Spring Cloud Config實現配置集中管理
使用Spring Cloud Sleuth與Zipkin實現服務監控

內容比較多, 我會分成多篇博客. 我不想泛泛地談概念, 這樣有點無趣, 對實際工作也起不到什麼幫助. 我爲演示這些技術的使用, 搭建了一個項目: mysteam. 我選擇了一個簡單的問題域, 電商系統裏最基礎的下單功能. 圍繞下單功能, 系統拆分成了五個服務:
用戶服務(user service)
賬戶服務(account service)
產品服務(product service)
優惠券服務(coupon service)
訂單服務(order service)

下面是mysteam的架構示意圖: 我們的關注點主要在Backend Services和MQ, MySQL這一部分. 服務之間通過Rest API和事件進行通信. Rest API主要用來進行一些只讀等不需要事務的操作, 涉及事務的操作一般使用事件來完成. 具體怎麼做後面有專門的博客來介紹.

首先, 讓我們來個Hello World, 先介紹如何將mysteam下載下來並啓動. 一旦涉及微服務, 項目結構和環境都會比較複雜, 我已經儘量簡化了, 請繫好安全帶: )

1. 環境準備

JDK 8+
MySQL
kafka 0.8.22
zookeeper
 (可以下載, 也可以直接使用kafka自帶的zookeeper)
Intellij IDEA或Eclipse (這個項目結構比較複雜, IDE能起到很大幫助)

2. 從GitHub上下載項目

需要下載兩個項目:
mysteam
mysteam-config-repo

mysteam是主項目, mysteam-config-repo是配置文件存放倉庫, 後面講Spring Cloud Config的時候會用到.

3. 修改配置文件

1. 修改配置文件讀取路徑

假設你的mysteam-config-repo項目存放路徑是D:/mysteam-config-repo, 打開$YOUR_PATH/mysteam/config/src/main/resources/application.yml, 找到uri: https://github.com/sunnykaka/mysteam-config-repo這一行, 替換爲uri: file:///D:/mysteam-config-repo.(如果你是linux系統, 並且mysteam-config-repo項目存放路徑是/home/my/mysteam-config-repo, 則改爲uri: file:///home/my/mysteam-config-repo).

2. 修改kafka和zookeeper地址

打開$YOUR_PATH/mysteam/config/src/main/resources/application.yml, 將brokers: 192.168.239.129:9092,192.168.239.129:9093,192.168.239.129:9094修改成你的 kafka地址, 將zkNodes: 192.168.239.129:2181修改成你的zookeeper地址. 打開$YOUR_PATH/mysteam-config-repo/application.yml, 同樣, 將brokers: 192.168.239.129:9092,192.168.239.129:9093,192.168.239.129:9094修改成你的 kafka地址, 將zkNodes: 192.168.239.129:2181修改成你的zookeeper地址.

3. 修改MySQL數據庫地址

進入$YOUR_PATH/mysteam-config-repo目錄, 打開account.ymlcoupon.ymlorder.ymlproduct.ymluser.yml這幾個文件, 找到datasource的配置, 將數據庫的ip地址和端口, 以及用戶名和密碼修改成你的配置.

4. 初始化數據庫

數據庫初始化文件是$YOUR_PATH/mysteam/docs/init_database.sql. 執行方法(假設你的mysteam目錄是D:/mysteam, 數據庫在本機3306, 用戶名密碼都是root):

1
2
cd D:/mysteam
mysql -uroot -proot < docs/init_database.sql

執行完成之後, 進入數據庫應該可以看見5個數據庫已經初始化好了.

5. 啓動Eureka服務, Config服務, 並運行測試.

主要介紹如何在IDE中啓動服務. 因爲Eureka和Config服務被其他服務使用, 所以要首先啓動這兩個服務. 其中Eureka服務要最先啓動.

1. 啓動Eureka服務, 運行在1111端口

打開$YOUR_PATH/mysteam/eureka/src/main/java/com/akkafun/eureka/EurekaApplication.java, 直接運行main方法.

2. 啓動Config服務, 運行在8888端口.

打開$YOUR_PATH/mysteam/config/src/main/java/com/akkafun/config/ConfigApplication.java, 直接運行main方法.

3. 運行EventBusTest測試.

打開$YOUR_PATH/mysteam/user/core/src/test/java/com/akkafun/common/event/service/EventBusTest.java, 運行junit測試.

這個測試的運行時間稍長, 在我機器上需要3分鐘左右. 如果測試全部通過, 代表環境OK了. 如果運行報錯, 則檢查下前面的步驟看看問題出在哪兒. 特別關注下kafka和zookeeper的服務是不是啓動了, 並且ip是否正確.

下一篇我會介紹mysteam的maven項目結構, 以及實現用戶註冊功能.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章