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 

 

posted @ 2019-01-31 15:16  一只特立独行的程序猿  阅读(1643)  评论(0编辑  收藏  举报