利用Spring Cloud實現微服務(四)- 微服務實現與注冊

Code Is Only Differentiator

源碼:https://github.com/shuxingliu/microservices


一、生成項目文件(設置開發環境)

SpringCloud是Spring Boot的子集,我們可以使用Spring Boot預先配置網頁(http://start.spring.io)來選擇構建工具(Maven、Gradle)、項目元元數據(組名稱、工件名稱)。如果我們需要更多選擇,我們需要點擊"Switch to Full Version",在全部版本里,我們可以編輯更多的項目元數據信息(依賴項、打包格式、Java版本等),并選擇安全、Web服務器、關系型/非關系型數據庫、云服務的注冊/配置/路由/發現、微服務的熔斷等依賴項。我們要感謝Pivotol為我們提供了Spring Boot這么好的起點,大大簡化了JavaWeb應用的開發。

本節示例中,我們使用Maven來作為構建工具,工件命名為booking car,是一個開發打車微服務的演示項目,打包格式為jar,使用Java最新版本Java1.8,包的名稱設為:com.accenture.j2c.bookingcar,如下圖所示。

在頁面下面的依賴項,我們選擇了Web、Eureka Server等依賴項。

選擇依賴項后,界面顯示如下:

點擊Generate Project后,項目文件會打包成“項目名+zip”格式并自動下載到本地

我們使用NetBeans作為IDE,從項目zip文件導入剛才的項目

在導入項目的過程中,如果本地Maven庫里沒有聲明的依賴項,NetBeans會給我們提示,我們點擊“Resolve”即可,NetBeans會自動下載缺失的依賴項到本地Maven庫里。

項目文件導入后,我們發現項目中已經有下列文件:

我們可以看到項目的包名為com.accenture.j2c.bookingcar

其中,main程序位于BookingcarApplication.java內,main調用了Spring Boot的SpringApplication.run()方法來啟動應用程序。

二、EurekaClient的實現

為了能使微服務自動在Eureka服務器上注冊,bookingcar應用要聲明為Eureka Client。通過以下的兩個步驟聲明即可。

1. 導入包:org.springframework.cloud.netflix.eureka.EnableEurekaClient;

2. 添加注解:@EnableEurekaClient

三、實體、值對象的實現

在上一節的分析中,我們也可以發現,聚合中的實體、值對象位于戰術建模的最底層,聚合、服務、存儲庫都依賴于實體、值對象。領域事務的實現過于復雜,我們在本次演示里暫不涉及,以后可以單獨開辟一個單獨的章節將領域事件的實現。

我們把實體放到包com.accenture.j2c.bookingcar.domain.entity里,把值對象放到包:com.accenture.j2c.bookingcar.domain.vo里

各個實體類的實現:

1. 抽象類Entity的實現

對于所有實體,ID和name都是常見的,因此,我們可以如下定義抽象類Entity作為實體的抽象。

Entity實現代碼如下所示:

2. Order聚合的實現

Order是打車管理系統中的核心聚合,Order實體會作為Order聚合的聚合根。對Order的描述放到OrderVO里。User及Driver的實現同Order類似,不再累述。

OrderVO的實現:

Order實體的實現:

四、存儲庫類的實現

在本示例中,對于每一類實體,包括用戶、司機、訂單等,在某個時段里都會存在多個實例。比如,我們會有很多的用戶,張三、李四、王二麻子,有很多的司機,有很多的訂單。對于每一類實體,我們需要有個統一的接口來保存并引用這些實體。比如,對于用戶實體,我們應該有一個用戶存儲庫,用來存儲所有的用戶,管理用戶的增、刪、改、查。對于司機、訂單也是類似,也需要分別有一個存儲庫來對應。

我們需要三個存儲庫:UserRepository,DriverRepository, OrderRepository。

開始時,我們首先創建兩個抽象:ReadOnlyRepository和Repository。ReadOnlyRepository用于提供只讀操作的抽象,例如get,getall等。而Repository用于執行所有類型的操作,包括增、刪、改、查。

1. ReadOnlyRepository的實現如下:

2. Repository在ReadOnlyRepository基礎上進行擴展,提供增加、刪除、更新等操作接口,實現如下:

3. UserRepository、DriverRepository、OrderRepository接口在Repository接口上擴展,UserRepository、DriverRepository增加了containsName以及findByName兩個操作,OrderRepository還添加了findByUserId接口,通過用戶Id找到對應訂單。

僅以OrderRepository為例展示實現代碼:

4. 倉儲庫的實現

在Spring框架中,使用@Repository注解來定義實現存儲庫的bean。另外,我們把演示數據直接放到內存中,代替實際的數據庫操作。

本次例程里,實現了用戶和訂單的倉儲庫。僅以訂單的倉儲庫實現為例:

五、領域服務類的實現

領域服務定義了CRUD和一些界面操作。

我們抽象出ReadOnlyBaseService基類和BaseService基類,以及DomainService接口

1. ReadOnlyBaseService的實現如下:

2. BaseService繼承于ReadOnlyBaseService,實現如下:

3. 在Spring框架中,使用@Repository注解來定義實現領域服務的bean。對訂單操作的領域服務實現如下:

六、REST控制器類的實現

微服務最終會提供Restful接口給外面的程序調用。在微服務實現中,REST控制器是必不可少的。REST控制器用來處理HTTP請求,有四個常用的注解。

@RestController:類級注解,表明該類是REST控制器,用來處理HTTP請求,即表明該類可以提供Restful接口。

@RequestMapping:1)類級別,將URI映射到類上;2)方法級別:將路徑映射到不同的方法。從這兒可以看出,一個微服務可以通過@RequestMapping注解映射不同的接口。

@RequestParam和PathVariable用來傳遞HTTP請求的參數。在someUrl/{param=value}中的param可以通過@RequestParam將HTTP請求的參數和方法的參數綁定,而someUrl/{paramId}的paramId可通過@Pathvariable注解綁定它傳過來的值到方法的參數上。

本例程中,為了更好地演示,除了實現了上節里設計的使用用戶Id查找訂單的微服務接口外,還實現了使用訂單Id查詢訂單、使用用戶id查找用戶,使用用戶名字查找用戶等接口。這四個接口的端點如下:

使用用戶Id查找訂單:http://.../v1/order?userid={userid}

使用訂單id查詢訂單:http://.../v1/order/{id}

使用用戶id查找用戶:http://.../v1/user/{id}

使用用戶名稱查找用戶:http://.../v1/user?name={name}

我們使用了兩個控制器類UserController和OrderController來實現上面的四個接口端點

1. UserController的實現如下:

2. OrderController的實現如下:

七. 應用屬性的配置

要使微服務自動注冊到Eureka

Server里,我們要配置應用的屬性。

應用屬性的文件名稱為application.properties,在項目中的路徑如下:

本實現中,配置如下:

spring.application.name=bookingcar-lsx

spring.freemarker.enabled=false

spring.thymeleaf.cache=false

eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

server.port=2227

八、測試REST API

1. 按照系列文章中第一部分的描述,啟動Eureka Server



2. 選擇bookingcar項目,右鍵彈出快捷菜單

3. 在Run Maven的窗口里,Goals輸入"spring-boot:run"

4. Bookingcar應用啟動后,刷新Eureka Server的界面,我們會發現bookingcar的微服務已經在“Instances currently registered with Eureka"下

5. 點擊微服務后面的鏈接,我們會進入微服務的入口,輸入不同的請求參數,我們可以觀察到不同的反饋。

1) http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2227/v1/user/1

查找id為1的用戶,結果如下:


2) http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2227/v1/user?name=2

查找用戶名為2的用戶,結果如下:


3)http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2227/v1/order/2

查找id為2的訂單,結果如下:



4) http://cpx-bkdhx46cy4h.dir.svc.accenture.com:2227/v1/order?userid=1

查找用戶id為1的訂單集合,結果如下:

利用Spring Cloud實現微服務(七)- 內部調用

利用Spring Cloud實現微服務(六)- 服務網關

利用Spring Cloud實現微服務(五)- 負載均衡

利用Spring Cloud實現微服務(三)- 業務領域驅動微服務設計

利用Spring Cloud實現微服務(二)--領域驅動設計

利用Spring Cloud實現微服務(一):Eureka服務器

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容