这一篇来看看如何在 Nacos 集成 非Java 应用 以及讨论这样集成的必要性。
涉及到的是一个叫 Sidecar 的概念以及一个
spring-cloud-starter-alibaba-sidecar 框架。
Sidecar 是什么 ?
Sidecar 是 Server Mesh 中的一种概念 , 是一种和容器内应用伴生的代理服务,可以对流量进行监控,路由,以及负载均衡等作用。
操作上主要分为3个部分 :
准备了一个 Python 服务,注意这里要 checkHealth 要返回 status UP ,才满足检查的要求
java
复制代码
from django.http import JsonResponse def hello(request): data = { 'status': 'UP' } return JsonResponse(data)
Maven 依赖
java
复制代码
-
spring-boot-starter-parent : 2.3.10.RELEASE - org.springframework.cloud / spring-cloud-dependencies : Hoxton.SR3 - com.alibaba.cloud / spring-cloud-alibaba-dependencies : 2.2.0.RELEASE
服务是标准 SpringBoot 项目,只需要一个 Application 启动类 :
java
复制代码
@SpringBootApplication @EnableDiscoveryClient public class CaseAlibabaSidecarApplication { public static void main(String[] args) { SpringApplication.run(CaseAlibabaSidecarApplication.class, args); } }
配置文件 :
java
复制代码
spring: application: name: PORTAL-NEWS-SIDECAR cloud: nacos: discovery: server-addr: 127.0.0.1:8848 gateway: discovery: locator: enabled: true server: port: 8087 management: info: defaults: enabled: true endpoint: health: show-details: ALWAYS endpoints: web: exposure: include: '*' sidecar: ip: 127.0.0.1 port: 8000 #第三方程序提供的标准health接口 health-check-url:
http://127.0.0.1:8000/hello
阶段总结 :
java
复制代码
// python 接口 -
http://127.0.0.1:8000/hello/ // 实际调用接口 http://127.0.0.1:8087/PORTAL-NEWS-SIDECAR/hello/
核心解析 :
可以看到注册的 IP 实际上是 Python 的 IP 和端口,这也是这个流程和核心。
我使用 sidecar 的目的是让python 服务可以在JAVA 调用,很显然这个目的达到了。
但是我们要去思考其中的原理,sidecar 组件是在自己注册 Nacos 的时候,把配置中的sidecar配置作为主机 IP 进行的配置,其注册的源头主要是在健康检查的定时任务里面。
主要流程如下 :
java
复制代码
public void check() { Schedulers.single().schedulePeriodically(() -> { String ip =
this.sidecarProperties.getIp(); Integer port = this.sidecarProperties.getPort(); String applicationName = this.environment.getProperty("spring.application.name"); // 获取服务的状态,并且进行注册或者下线 Status status = this.healthIndicator.health().getStatus(); if (status.equals(Status.UP)) { this.sidecarDiscoveryClient.registerInstance(applicationName, ip, port); } else { this.sidecarDiscoveryClient.deregisterInstance(applicationName, ip, port); } }, 0L, this.sidecarProperties.getHealthCheckInterval(), TimeUnit.MILLISECONDS); }
那么整个流程就需要思考了,这些是否全部达到了我们的要求 :
首先 , sidecar 本身是没有做到代理的,因为它直接注册了Python 服务的 IP ,所以应用的请求会直接通过IP调用到 Python 服务中。可能有兄弟没有读过这一块的源码,大概流程是这样的 :
那么在这其中,sidecar 就做了两件事,注册 IP 到 Nacos 以及 健康检查, 实际上 Sidecar 和 主服务没有发生关联。
那么问题来了,虽然集成很简单,但是这些功能完全也可以做到调用端,往更复杂的角度想,甚至可以做一个 starter 用于读取配置文件的 URL 以及 健康检查 , 想想确实是这样,代码量也差不多。
不过这就涉及到一个重要原因了,sidecar 是无侵入的,也就是服务端不需要集成任何配置 ,这也就是使用它的最大原因。
扩展
看了上面的东西,我们大概明白了 sidecar 的使用 。 但是很多场景下,我们可能需要更多的功能,也就是说我们期望能为我们调用第三方服务的时候提供额外的附加功能 ,例如 :流量监控 / 日志记录 / 负载均衡及集群管理
针对这些功能,我认为去做个总线服务会更合适。
提供了一种思路,可行性有待验证,有兴趣的兄弟可以试试。
学有所用, sidecar 有其本身的优势,但是并没有达到我的预期,使用方式很简单,对 Nacos 的应用很深刻了,想了解 Nacos 发现和调用的原理看这些源码是很有帮助的。
后续继续完善 Python 的时候会继续按照我的思路去做,这种思路也不是空穴来风,主要的方式和低代码平台的思路类似,搞不好可以弄一个开源框架出来。