Spring Cloud Netflix / Nodejs
嘗試使用Spring Cloud Netflix 加 Nodejs 技術棧混合搭建微服務。 (示例並無任何業務意義,只爲做演示)
代碼: https://github.com/choelea/spring-cloud-nodejs/
實現如下
1. 服務註冊發現
2. 服務間調用(feign)
3. 服務路由
4. 負載均衡 (eureka client 端)
5. 全鏈路跟蹤
6. 跨服務日誌跟蹤
7. 服務監控
相關版本依賴
Spring Boot: 1.5.9.RELEASE
Spring Cloud: Edgware.RELEASE
Nodejs: v8.9.1 (本機是v8.9.1的,沒有在其他版本上做測試)
架構圖 (Architecture for microservice)
此圖僅僅是服務註冊的,監控和全鏈路跟蹤未添加
- eureka-server: Spring Boot + Cloud 技術棧搭建eureka 服務。(服務註冊中心)
- bookmark-service: Spring Boot 的微服務程序
- nodejs-bookservice nodejs開發的微服務
- composite-service 聚合服務
- spring-boot-admin-server Spring Boot 監控
- zipkin 分佈式鏈路追蹤服務
- spring-apigateway Spring Boot + Cloud Netflix技術棧搭建的網關
- nodejs-web nodejs開發的網關兼web應用
eureka-server-peer1 和 eureka-server-peer2 是用來驗證eureka 集羣的,可以選擇啓動這兩個服務,不啓動eureka-server服務。
程序運行
按照上面的順序依次運行。 Spring Boot的程序運行:mvn spring-boot:run
; nodejs 程序運行:npm start
spring-boot-admin-server 的控制檯會有異常拋出,是因爲nodejs的 bookservice程序無法接入spring boot admin的監控的。 —- 儘管restful的微服務號稱技術平臺無關,然而一旦選擇了某些技術棧,基本也就限制了使用某個語言和某個技術。
測試spring-apigateway
spring-apigateway 作爲eureka的客戶端結合zuul proxy的反向代理,爲多個微服務提供一個單一的訪問節點。
訪問http://localhost:8080/bookmarks/jlong/bookmarks (結果同http://localhost:9098/jlong/bookmarks 完全一致)
[
{
"userId": "jlong",
"id": 2,
"href": "http://some-other-hostjlong.com/",
"description": "A description for jlong's link",
"label": "jlong"
}
]
訪問http://localhost:8080/books 反向代理至nodejs-bookservice的服務:http://localhost:3001/books
[
{
"bookname": "Nodejs Web Development",
"author": "David Herron"
},
{
"bookname": "Mastering Web Application Development with Express ",
"author": "Alexandru Vlăduțu"
}
]
測試nodejs
nodejs 採用eureka-js-client 組件獲取/註冊微服務。這裏nodejs-web只作爲服務的消費方,接入eureka server,消費上游的服務並展示給客戶端(瀏覽器)。
查看nodejs-web作爲eureka client 獲取到註冊的服務信息,通過向服務直接發起request來獲取數據並展示。訪問:http://localhost:3000 即可看如下顯示:
查看服務註冊情況:
打開http://localhost:8761/
instance信息的獲取主要通過下面的鏈接:
- http://localhost:8761/eureka/apps 獲取整個註冊進來的服務的信息
- http://localhost:8761/eureka/apps/{app} 獲取某個服務的所有的實例信息 例如:http://localhost:8761/eureka/apps/BOOK-SERVICE
- http://localhost:8761/eureka/apps/{app}/{instanceId} 獲取具體的instance的信息
nodejs 使用eureka-js-client 來配置服務的instance信息,需要配置的信息更多,也更直觀的反應了instance的信息;和通過連接(http://localhost:8761/eureka/apps)查到的基本一致。
nodejs的微服務app,在eureka的client的配置中最好保持app,vipAddress(secureVipAddress 一般不會用上)一致。
經測試發現,Spring Boot / Cloud Netflix 技術棧開發的apigateway,採用Zuul Reverse Proxy 反向代理的時候,必須app 和 vipAddress設置一致。 多個instance通過instanceId來區分。
監控Spring Boot服務
通過http://localhost:8088可以進入Spring Boot的服務列表;選中服務點擊Details可以查看詳細信息。
調用鏈路跟蹤
通過http://localhost:9411查詢服務間調用情況