NodeJS+Sidecar异构系统+Zuul(七)
更多内容参见个人技术博客,无广告欢迎关注
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