👈👈👈 欢迎点赞收藏关注哟
首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...
一. 前言
这一篇来看看如何在 Nacos 集成 非Java 应用 以及讨论这样集成的必要性。
涉及到的是一个叫 Sidecar 的概念以及一个 spring-cloud-starter-alibaba-sidecar 框架。
Sidecar 是什么 ?
Sidecar 是 Server Mesh 中的一种概念 , 是一种和容器内应用伴生的代理服务,可以对流量进行监控,路由,以及负载均衡等作用。
- Server Mesh : 处在基础设施层,是一种管理微服务同学的方式,用于简化负载的应用程序网络拓扑.
- Sidecar : 主应用容器的伴生容器,运行在同一个pod 中 ,用于代理服务通信,日志记录,安全控制等
二. 使用方式
操作上主要分为3个部分 :
- 第三方语言服务 :一个带有可调接口的服务 ,对外提供 Rest 调用能力
- sidecar 服务 :用于服务发现和注册以及健康检查
- 调用服务 : 调用第三方服务提供的 API , 执行业务流程
2.1 第三方服务和调用服务
准备了一个 Python 服务,注意这里要 checkHealth 要返回 status UP ,才满足检查的要求
java
from django.http import JsonResponse
def hello(request):
data = {
'status': 'UP'
}
return JsonResponse(data)
2.2 sidecar 服务
Maven 依赖
java
- spring-boot-starter-parent : 2.3.10.RELEASE
<!-- dependency management -->
- org.springframework.cloud / spring-cloud-dependencies : Hoxton.SR3
- com.alibaba.cloud / spring-cloud-alibaba-dependencies : 2.2.0.RELEASE
<!-- 主要依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sidecar</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
服务是标准 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
阶段总结 :
- 核心的 Maven 依赖是 sidecar ,gateway 主要是为了做 nacos 调用
- 通过 @EnableDiscoveryClient 发起 Nacos 注册,但是注册的地址实际上是 sidecar 配置的 IP 地址
2.3 服务的调用方式
java
// python 接口
- http://127.0.0.1:8000/hello/
// 实际调用接口
http://127.0.0.1:8087/PORTAL-NEWS-SIDECAR/hello/
核心解析 :
- PORTAL-NEWS-SIDECAR 是上文的 application.name
- 能通过 PORTAL-NEWS-SIDECAR 发起调用的主要原因是 spring-cloud-starter-gateway 和对应的配置 spring.cloud.gateway.discovery.locator.enabled
- 不加载 gateway 也可以通过 restTemplate 发起调用
可以看到注册的 IP 实际上是 Python 的 IP 和端口,这也是这个流程和核心。
三. 定位与思考
3.1 目的和原因
- 跨语言调用 : 对应其他的语言来说,集成到 Nacos 是有不小难度的,使用 sidecar 可以快速把其他语言的服务集成到 Nacos 体系中
- 统一管理: 使用
sidecar
模块可以将所有的服务统一注册到服务注册中心,实现统一的服务发现和管理 - 健康检查 : 实际上也属于统一管理的一部分,对服务健康度进行检查
3.2 思考和延展
我使用 sidecar 的目的是让python 服务可以在JAVA 调用,很显然这个目的达到了。
但是我们要去思考其中的原理,sidecar 组件是在自己注册 Nacos 的时候,把配置中的sidecar配置作为主机 IP 进行的配置,其注册的源头主要是在健康检查的定时任务里面。
主要流程如下 :
- S1 : AutoConfiguration 里面开启一个定时任务开始通过 HealthCheckInterval 配置的时间间隔进行监控检查
- S2 : 调用配置的 健康检查 Url 判断第三方语言服务的运行情况
- S3 : 把 Python服务 注册到 Nacos 中
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 的使用 。 但是很多场景下,我们可能需要更多的功能 ,也就是说我们期望能为我们调用第三方服务的时候提供额外的附加功能 ,例如 :流量监控 / 日志记录 / 负载均衡及集群管理
针对这些功能,我认为去做个总线服务会更合适。
-
在总线服务中,最好将第三方接口 Java 化,也就是为这些接口提供一个 FeignClient 。其他服务可以通过 Client 直接调用 Python 服务,即规约了入参和出参,又使其他的定制化变为可能。
-
其次可以通过 Filter 和 AOP 对日志进行管理,对所有的 Request 和 Response 进行抓取。
-
负载均衡可能就会有点复杂了,因为 Feign 的模式复杂是做到调用端的,这个时候就需要在总线服务里面注册多个节点上去,这一块做起来会稍微有点复杂。
-
在于流量监控 ,都已经定义为接口了,这一块阿里的 ARMS 或者腾讯的组件 ,第三方的 SkyWalking 都能轻松做到
总结
提供了一种思路,可行性有待验证,有兴趣的兄弟可以试试。
学有所用, sidecar 有其本身的优势,但是并没有达到我的预期,使用方式很简单,对 Nacos 的应用很深刻了,想了解 Nacos 发现和调用的原理看这些源码是很有帮助的。
后续继续完善 Python 的时候会继续按照我的思路去做,这种思路也不是空穴来风,主要的方式和低代码平台的思路类似,搞不好可以弄一个开源框架出来。