Spring Cloud(十)整合異構系統Nodejs(Spring Cloud Sidecar)
一、 Sidecar簡介
什麼是Sidecar模式? Sidecar模式是一種將應用功能從應用本身剝離出來作為單獨程序的方式。該模式允許我們嚮應用無侵入新增多種功能,避免了為滿足第三方元件需求而嚮應用新增額外的配置程式碼。
就像邊車加裝在摩托車上一樣,在軟體架構中,sidecar附加到主應用,或者叫父應用上,以擴充套件/增強功能特性,同時Sidecar與主應用是鬆耦合的。
非JVM微服務可操作Eureka的REST端點,從而實現註冊與發現。事實上,也可使用Sidecar更方便整合非JVM微服務。Spring Cloud Netflix Sidecar的靈感來自Netflix Prana,它包括了一個簡單的HTTP API來獲取指定服務所有例項資訊(例如主機和埠)。不僅如此,還可通過內嵌的Zuul來代理服務呼叫,該代理從Eureka Server中獲取資訊。非JVM微服務需要實現監控檢查
{"status":"UP"}
其中,status用於描述微服務的狀態,常見取值有:UP、DOWN、OUT_OF_SERVICE以及UNKNOWN等。
二、 建立Nodejs環境
2.1 windows安裝nodejs環境
2.2 編寫listener.js
nodejs 必須新增健康介面並返回狀態{"status":"UP"}
var http = require('http'); var url = require("url"); var path = require('path'); // 建立server var server = http.createServer(function(req, res) { // 獲得請求的路徑 var pathname = url.parse(req.url).pathname; res.writeHead(200, { 'Content-Type' : 'application/json; charset=utf-8' }); // 訪問http://localhost:8060/,將會返回{"index":"歡迎來到首頁"} if (pathname === '/') { res.end(JSON.stringify({ "index" : "Hello Payne!" })); } // 訪問http://localhost:8060/health.json,將會返回{"status":"UP"} else if (pathname === '/health.json') { res.end(JSON.stringify({ "status" : "UP" })); } // 其他情況返回404 else { res.end("404"); } }); // 建立監聽,並列印日誌 server.listen(8060, function() { console.log('listening on localhost:8060'); });
注意: JSON.stringify({ “status” : “UP” }) “UP”必須是大寫,否則Eureka Server 將不識別。如下圖所示:
2.3 執行listener.js
win+R==>cmd==>node listener.js 根據js程式: 訪問:http://localhost:8060/
{“index”:“Hello Payne!”}
{“status”:“UP”}
證明node環境已經準備就緒;
三、 Spring Cloud 後端程式碼
新建sidecar-server專案
3.1 更改pom檔案
新增spring-cloud-netflix-sideca
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
3.2 更改啟動類
新增EnableSidecar註解,@EnableSidecar是一個組合註解,它整合了三個註解,分別是:@EnableCircuitBreaker、@EnableDiscoveryClient、@EnableZuulProxy
@SpringBootApplication
@EnableSidecar
public class SidecarServerApplication {
public static void main(String[] args) {
SpringApplication.run(SidecarServerApplication.class, args);
}
}
3.3 資原始檔
server.port=8082
spring.application.name=sidecar-server
eureka.client.service-url.defaultZone = http://localhost:8080/eureka/
sidecar.port=8060
sidecar.health-uri=http://localhost:${sidecar.port}/health.json
management.endpoints.web.exposure.include=*
3.4 驗證結果
依次啟動Eureka-server,sidecar-server(8082) 訪問sidecar-server: http://127.0.0.1:8082/
{“status”:“UP”}
可以看到我們Sidecar-server狀態是好的,node已經被sidecar裝入Eureka server進行管理了;
當我們停掉Nodejs:
繼續訪問和health介面:
四、總結
- SideCar的設計很優雅,它完全不會去入侵其他應用的程式碼。
- Sidecar是一個用於監聽非JVM應用程式(可以是Python或者Node或者Php等等)的一個工具,通過Sidecar可以實現Java和第三方應用程式的雙向互動
- 第三方應用程式必須要實現一個health監測的介面,實時向Sidecar報告自己的狀態,告訴Sidecar自己還在執行著。
- Sidecar應用程式必須和第三方應用程式執行在同一臺電腦上,也就是說他們之間是localhost,不能是ip訪問