Sidebar简介

Sidecar是作为一个代理的服务来间接性的让其他语言可以使用Eureka等相关组件。通过与Zuul的来进行路由的映射,从而可以做到服务的获取,然后可以使用Ribbon,Feign对服务进行消费,以及对Config Server的间接性调用。

你是否想要在非jvm的语言中利用(间接性使用)Eureka,Ribbon以及Config Server?Spring Cloud Netflix Sidecar的设计灵感来自Netflix Prana。它包含一个简单的http api去获取一个已知服务的所有实例(例如主机和端口)。你也可以通过嵌入的Zuul代理(Zuul中有一个代理功能)对代理的服务进行调用,Zuul从Eureka服务注册中心获取所有的路由记录(route entries)。通过host发现(host lookup)或者Zuul代理可以直接访问Spring Cloud Config。非jvm需要应该实现一个健康检查,Sidecar能够以此来报告给Eureka注册中心该应用是up还是down状态。

在你的项目中使用Sidecar,需要添加依赖,其group为org.springframework.cloud,artifact id为spring-cloud-netflix-sidecar。(这是以maven依赖的方式)

启用Sidecar,创建一个Spring Boot应用程序,并在在应用主类上加上@EnableSidecar注解。该注解包含@EnableCircuitBreaker, @EnableDiscoveryClient以及@EnableZuulProxy。Run the resulting application on the same host as the non-jvm application. (这句不太会翻译,我的理解为:在与非jvm应用程序相同的主机上运行生成的应用程序)注:这里的生成应该是通过代理产生的服务。

配置Sidecar,在application.yml中添加sidecar.port和sidecar.health-uri。sidecar.port属性是非jre程序监听的端口号,这就是Sidecar可以正确注册应用到Eureka的原因。sidecar.health-uri是非jre应用提供的一个对外暴露的可访问uri地址,在该地址对应的接口中需要实现一个模仿Spring Boot健康检查指示器的功能。它需要返回如下的json文档。(注:通过返回一个json,其用status字段来标识你的应用的服务状态,是up还是down,sidecar会将该状态报告给eureka注册中心从而实现你的服务的状态可用情况。简单的说就是用来控制sidecar代理服务的状态!)

health-uri-document.(heal-uri指向的接口地址需要返回的json文档)

1
2
3
{
"status":"UP"
}

这里是一个Sidecar应用程序的application.yml配置示例:
application.yml

1
2
3
4
5
6
7
8
9
server:
port: 5678
spring:
application:
name: sidecar

sidecar:
port: 8000
health-uri: http://localhost:8000/health.json

API DiscoveryClient.getInstances()所对应的访问方式是/hosts/{serviceId},这是访问/hosts/customers后的响应示例,它返回了两个不同主机上的实例(可以看到主机地址不一样)。
非jre程序可以访问这个api,如果sidecar的端口号为5678,那么完整url则为:http://localhost:5678/hosts/{serviceId}.

/hosts/customers.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"host": "myhost",
"port": 9000,
"uri": "http://myhost:9000",
"serviceId": "CUSTOMERS",
"secure": false
},
{
"host": "myhost2",
"port": 9000,
"uri": "http://myhost2:9000",
"serviceId": "CUSTOMERS",
"secure": false
}
]

Zuul代理会自动为每个在Eureka注册中心上的服务添加路由到/serviceId上,所以上面那个customers的服务可以通过/customers访问。非Jre应用可以通过http://localhost:5678/customers来访问Customer Service(假设Sidecar的监听端口为5678)

如果Config Server注册到了Eureka,非jre应用就可以通过Zuul代理访问它。如果ConfigServer的serviceId为configserver并且Sidecar的端口为5678,那么可以通过http://localhost:5678/configserver 的方式来访问Config Server。

非Jvm应用可以利用Config Server的能力来获取Config Server返回的YAML文档,通过访问 http://sidecar.local.spring.io:5678/configserver/default-master.yml 就可以获取到类似下面的YAML文档结果

1
2
3
4
5
6
7
8
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
password: password
info:
description: Spring Cloud Samples
url: https://github.com/spring-cloud-samples

如上是对spring cloud sidebar相关章节的翻译。
spring cloud sidebar官方文档:http://cloud.spring.io/spring-cloud-static/Edgware.SR3/multi/multi__polyglot_support_with_sidecar.html

译文参考:https://www.cnblogs.com/YrlixJoe/p/7509655.html

使用Sidebar将nodejs应用引入spring cloud

这里提供了一个nodejs应用,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 引入Http模块
var http = require('http');
// 引入path模块
var path = require('path');
// 引入url模块
var url = require('url');

// 创建Server
var server = http.createServer(function(req,res) {
// 获得请求路径
var pathname = url.parse(req.url).pathname;
res.writeHeader(200,{'Content-Type': 'application/json;charset=utf-8'});

if (pathname == '/') {
res.end(JSON.stringify({'index' : '欢迎来到首页!'}));
}
// /health.json返回{status:'UP'}
else if (pathname == '/health.json') {
res.end(JSON.stringify({'status' : 'UP'}));
}
// 其他情况返回404
else {
res.end('404');
}

});

server.listen(8050,function() {
console.log('nodejs is listening on port 8050.');
});

有如下映射关系:

1
2
3
localhost:8050/ ==> {'index' : '欢迎来到首页!'}
localhost:8050/health.json ==> {'status' : 'UP'}
locahost:8050/其他请求 ==> 404

在Sidebar的介绍中,我们知道需要非jvm应用提供spring boot的健康指标功能,上面/health.json即提供的此功能。

创建模块microservice-sidecar

加入依赖

1
2
3
4
5
6
7
8
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

spring boot主类增加@EnableSidecar

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableSidecar
public class SidecarApplication
{
public static void main( String[] args )
{
SpringApplication.run(SidecarApplication.class,args);
}
}

application.yml增加sidecar配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
application:
name: microservice-sidecar

server:
port: 8807

eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true

sidecar:
port: 8050
health-uri: http://localhost:8050/health.json

启动Eureka server,zuul和microservice-sidecar,以及nodejs的应用。

然后通过http://zuulHost:zuulPort/microservice-sidecar就可以访问nodejs应用的[http://localhsot:8050/](http://localhsot:8050/)。

通过zuul访问nodejs的服务

nodejs服务

注意事项:
1.非jvm应用需要与sidecar部署在同一台机器上。如果不想部署在同一台机器,可以配置${eureka.instance.hostName}。

2.每个非jvm应用都需要有一个对应的sidecar应用。这应该是最大的一个问题,sidecar是与业务无关的,如果有很多非jvm的应用,会导致大量的sidecar应用。具体使用时需要评估。