springcloud系列22——非JVM语言支持之sidebar

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文档)

{
  "status":"UP"
}

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

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.

[
    {
        "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文档结果

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应用,代码如下:

// 引入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.');
});

有如下映射关系:

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

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

创建模块microservice-sidecar

加入依赖

<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

@SpringBootApplication
@EnableSidecar
public class SidecarApplication
{
    public static void main( String[] args )
    {
        SpringApplication.run(SidecarApplication.class,args);
    }
}

application.yml增加sidecar配置

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/

通过zuul访问nodejs的服务

nodejs服务

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值