NodeJS+Sidecar異構系統+Zuul(七)


1.1         NodeJS

1.1.1      簡介

谷歌ChromeV8引擎執行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      Zuulapplication.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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM