spring cloud alibaba ——sidecar服务异构
什么是sidecar?
spring-cloud-starter-alibaba-sidecar 是一个用来快速完美整合(享受服务发现的优势、有负载均衡、有断路器) Spring Cloud 与异构微服务(非Spring Cloud应用,如下面的python服务)的框架,灵感来自 spring-cloud-netflix-sidecar(只支持使用Eureka作为服务发现,Zuul 1.x作为网关,而它们已经停更了)。和Service Mesh相比,它非常轻量,核心代码不超过200行,整合起来非常方便。
原理:
- 它会根据配置的异构微服务的IP、端口等信息,将异构微服务的IP/端口注册到服务发现组件上 。
- Alibaba Sidecar实现了 健康检查 ,Alibaba Sidecar会定时检测异构微服务是否健康。如果发现异构微服务不健康,Alibaba Sidecar会自动将代表异构微服务的Alibaba Sidecar实例下线;如果异构微服务恢复正常,则会自动上线。最长延迟是30秒
要求:
- 异构微服务(非Spring Cloud应用,如下面的python服务)必须使用HTTP进行通信,因为Spring Cloud本身就是基于HTTP的;
- 如果微服务配置了 sidecar.health-check-url ,则表示开启健康检查,此时,你的异构微服务需实现健康检查(可以是空实现,只要暴露一个端点,返回类似 {"status": "UP"} 的字符串即可)。
优点:
- 异构服务集成:允许将非 JVM 语言(如 Python、Node.js 等)开发的微服务无缝集成到 Spring Cloud 生态中
- 服务发现透明化:异构服务可以注册到 Nacos 等注册中心,像普通 Spring Cloud 服务一样被发现和调用
- 统一监控:异构服务可以通过 Sidecar 模式获得统一的健康检查和监控能力
- 负载均衡支持:可以利用 Spring Cloud LoadBalancer 对异构服务进行负载均衡
- 配置管理:异构服务可以共享 Spring Cloud Config 的配置管理能力
- 降低迁移成本:遗留系统或非 Java 服务可以逐步迁移到微服务架构
缺点:
- 资源开销:每个异构服务都需要一个 Sidecar 代理进程,增加了系统资源消耗
- 复杂性增加:部署和运维变得更加复杂,需要同时管理原服务和 Sidecar 进程
- 网络延迟:请求需要经过 Sidecar 代理,可能增加网络延迟
- 故障点增加:Sidecar 本身可能成为故障点,影响服务可用性
- 版本兼容性:需要确保 Sidecar 版本与 Spring Cloud 版本兼容
- 调试困难:问题排查时需要同时考虑原服务和 Sidecar 的状态
sidecar的使用
首先我们需要一个python服务
1.安装好python环境:Windows 系统上如何安装 Python 环境(详细教程)_如何在win10上安装python-CSDN博客
2.idea安装一个python插件,配置好python SDK
3.简单创建一个py文件实现几个接口,作为python服务,用于测试
from flask import Flask, jsonifyapp = Flask(__name__)# 健康检查接口
@app.route('/health', methods=['GET'])
def health():return jsonify({"status": "UP"}), 200# 示例业务接口
@app.route('/api/data', methods=['GET'])
def get_data():return jsonify({"data": "Hello from Python service!"})if __name__ == '__main__':app.run(port=5000)
两个接口:
- 接口127.0.0.1:5000/health是用来健康检查的,必须暴露有一个健康检查的接口,且返回一个类似 {"status": "UP"} 的字符串即可
- 测试调用接口:127.0.0.1:5000/api/data,返回一JSON字符串
app.run(port=5000):指定了启动端口
注意:有一个Flask的包需要导入,
在控制台运行命令
pip3 install Flask
查看版本
pip show Flask
启动app.py,成功示例:
创建一个service-sidecar服务
引入sidecar和服务注册依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sidecar</artifactId>
</dependency>
配置:
server:port: 9999
spring:application:name: service-sidecarcloud:loadbalancer:nacos:enabled: trueribbon:enabled: falsediscovery:server-addr: 127.0.0.1:8848namespace: # 命名空间group: DEFAULT_GROUPusername: # 用户名password: # 密码
sidecar:# 异构微服务的IPip: 127.0.0.1# 异构微服务的端口port: 5000# 异构微服务的健康检查URLhealth-check-url: http://127.0.0.1:5000/healthmanagement:endpoint:health:show-details: always
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class SidecarApplicationMain {public static void main(String[] args) {SpringApplication.run(SidecarApplicationMain.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}
测试接口:
@RestController
@RequestMapping("/sidecar")
public class SidecarController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/getData")public String getData() {return "调用异构服务" + restTemplate.getForObject("http://service-sidecar/api/data", String.class);}
}
启动项目:
服务注册成功
进入详情:
我们发现配置的service-sidecar的端口不是9999吗,怎么变成了python服务的端口5000
原因:
在 Spring Cloud Alibaba Sidecar 模式中:
- server.port(默认9999):是 Spring Boot 应用本身的监听端口
- sidecar.port(配置的5000):是实际异构服务(Python服务)的端口
注册到 Nacos 的地址使用的是 sidecar.ip:sidecar.port,即 127.0.0.1:5000
我们通过客户端调用接口:http://127.0.0.1:9999/sidecar/getData
结果:
成功调用了python服务
工作原理
当通过负载均衡器(如 Ribbon 或 Spring Cloud LoadBalancer)调用 service-sidecar 服务时:
- 客户端向 service-sidecar 发起请求
- 负载均衡器从 Nacos 获取服务实例列表
- 获取到的实际地址是 127.0.0.1:5000(即 Python 服务地址)
- 请求直接转发到 Python 服务,绕过 Java 应用的 9999 端口
Sidecar 模式的核心思想:
- Java 应用作为代理,负责与 Nacos 交互
- 实际的服务调用直接指向真正的异构服务(Python服务)
- 实现了透明的服务发现和调用,客户端无需关心背后是何种技术栈
服务被注册到nacos,但实际被注册上去的是sidecar异构的服务,所以后端其他服务通过服务名称去调用的也是异构的python服务