1. 程式人生 > >Spring Cloud(十)整合異構系統Nodejs(Spring Cloud Sidecar)

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微服務需要實現監控檢查

,以便Sidecar將它的狀態上報給Eureka Server,健康檢查的形式如下:

{"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

r依賴

<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訪問