1.1 NodeJS
1.1.1 簡介

谷歌Chrome的V8引擎執行JavaScript的速度非常快,性能非常好。 Node.js是一個基於Chrome JavaScript運行時建立的平台,用於方便地搭建響應速度快、易於擴展的網絡應用。Node.js 使用事件驅動,非阻塞I/O 模型而得以輕量和高效,非常適合在分布式設備上運行數據密集型的實時應用。
1.1.2 安裝
Windows下非常好安裝,一路NEXT即可。
node-v10.15.1-x64.msi
1.1.3 NodeJs代碼
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'});
if (pathname === '/') {
res.end(JSON.stringify({"index": "歡迎"}));
} else if (pathname === '/health.json') {
res.end(JSON.stringify({"status": "UP"}));
} else {
res.end("404");
}
});
//創建監聽,並打印日志
server.listen(8060, function(){
console.log('listening on localhost:8060');
});
注意:開發的Node.js應用,必須去實現一個健康檢查接口,來讓Sidecar可以把這個服務實例的健康狀況報告給Eureka。
1.1.4 中文亂碼
注意:文件編碼必須是UTF-8,否則中文亂碼

1.1.5 啟動nodeServer
安裝完成nodejs,就可以在dos窗口中執行node命令,后面跟編寫的node-service.js文件。
node node-service.js

1.1.6 測試
訪問首頁

訪問監控檢查

訪問不存在頁面

1.2 Sidecar異構系統
什么是Sidecar模式?
Sidecar模式是一種將應用功能從應用本身剝離出來作為單獨進程的方式。該模式允許我們向應用無侵入添加多種功能,避免了為滿足第三方組件需求而向應用添加額外的配置代碼。就像邊車加裝在摩托車上一樣,在軟件架構中,sidecar附加到主應用,或者叫父應用上,以擴展/增強功能特性,同時Sidecar與主應用是松耦合的。舉個例子,假設現在有6個相互通信的微服務,每個微服務都需要具有可觀察性、監控、日志記錄、配置、斷路器等功能,而所有這些功能都是在微服務中使用一些第三方庫實現的。這樣一組服務的實際情況可能會非常復雜,增加了應用的整體復雜性,尤其是當每個微服務用不同的語言編寫、使用不同的基於.net、Java、Python等語言的第三方庫……
Sidecar異構系統解決的問題是:非JVM微服務可通過Sidecar請求其他注冊在Eureka Server的微服務
通過sidecar來調用nodejs的服務。
1.2.1 創建Maven項目

1.2.2 pom.xml
注意引入spring-cloud-netflix-sidecar,不是start開頭的
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wood</groupId>
<artifactId>spring-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wood</groupId>
<artifactId>sidecar</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sidecar</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
</dependencies>
</project>
1.2.3 application.properties
server.port=8096
spring.application.name=sidecar
eureka.client.serviceUrl.defaultZone=http://localhost:6001/eureka
# 定義根目錄下日志級別
logging.level.root=DEBUG
sidecar.port=8060
sidecar.health-uri=http://localhost:8060/health.json
1.2.4 SidecarApplication.java
package com.wood.sidecar;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.sidecar.EnableSidecar;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@SpringBootApplication
@EnableEurekaClient // zuul服務要注冊到Eureka上
@EnableZuulProxy // 開啟Zuul
@EnableSidecar
public class SidecarApplication {
public static void main(String[] args) {
SpringApplication.run(SidecarApplication.class, args);
}
}
注意:
To enable the Sidecar, create a Spring Boot application with @EnableSidecar. This annotation includes @EnableCircuitBreaker,
@EnableDiscoveryClient, and @EnableZuulProxy. Run the resulting application on the same host as then non-jvm application.
官網上寫了異構程序必須在一個host下部署,否則要配置${eureka.instance.hostName}
1.2.5 Zuul的application.yml
增加app-sidecar的映射。#為備注,yml文件中不能使用/tab鍵,只能空格
server.port=8095
spring.application.name=getway-zuul
eureka.client.serviceUrl.defaultZone=http://localhost:6001/eureka
# 定義根目錄下日志級別
logging.level.root=DEBUG
# zuul配置:app-a路由名稱隨意,path映射路徑,訪問路徑就無需敲入serviceId那么長,可以利用path映射路徑簡寫
# 默認會把所有注冊在eureka上的微服務都反向代理
##############################################################################
zuul.routes.app-a.path=/user/**
zuul.routes.app-a.service-id=provider-user
##############################################################################
# 這樣配置后,只有provider-user的被映射到user,其它的服務訪問形式不變,如果有多個之間用逗號隔開
##############################################################################
#zuul.routes.app-a.path=/user/**
#zuul.routes.app-a.service-id=provider-user
zuul.ignored-services="*"
##############################################################################
# app-sidecar名稱隨意,唯一就好,通過sidecar調用nodejs的服務
# 路徑 user -> provider-user服務, 路徑 sidecar -> sidecar服務
zuul.routes.app-sidecar.path=/sidecar/**
zuul.routes.app-sidecar.service-id=sidecar
1.2.6 測試
注意:sidecar基於zuul實現,所以必須通過zuul來訪問,否則報錯。
啟動EurekaServerApplication
啟動GetewayZuulApplication
啟動SidecarApplication

訪問sidecar首頁:http://localhost:8096


第一次訪問為空,訪問業務鏈接后,再訪問如下內容:
1.2.7 通過Zuul訪問
訪問健康鏈接: http://localhost:8095/sidecar/health.json

訪問首頁: http://localhost:8095/sidecar

通過將node-service多次啟停,並觀察Sidecar的/health端點。Sidecar會獲取node-service的健康狀態,並將狀態傳播到Eureka Server。使用這種方式,Eureka Server就能感知到非JVM微服務的健康狀態。
為了深入理解Sidecar原理及應用,可以擴展一個PHP-service來增強主容器功能。
demo下載 spring-cloud-sidecar.zip
