Spring Cloud Alibaba 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秒,详见
Alibaba SidecarChecker#check
。要求:
- 异构微服务(非Spring Cloud应用,如下面的python服务)必须使用HTTP进行通信,因为Spring Cloud本身就是基于HTTP的;
- 如果微服务配置了
sidecar.health-check-url
,则表示开启健康检查,此时,你的异构微服务需实现健康检查(可以是空实现,只要暴露一个端点,返回类似{"status": "UP"}
的字符串即可)。
优点
使用 Sidecar 的主要好处在于其与 Spring Cloud 生态系统的深度集成,特别在服务发现和管理方面:
1. 自动服务发现和负载均衡
- 当通过
RestTemplate
调用其他语言服务时,通常需要指定服务的具体地址(如 IP 和端口),而这些信息可能会随部署动态变化。通过 Sidecar,你可以将非 Java 服务注册到 Spring Cloud 的服务注册中心(如 Eureka、Nacos),这样其他服务就可以通过服务名自动发现目标服务,而不需要指定具体地址。 - 此外,Spring Cloud 的
LoadBalancer
可以自动为这些注册的服务提供负载均衡,使得多实例部署的服务调用更加方便和可靠。
2.服务健康监测
- Spring Cloud Sidecar 可以帮助实现对异构服务的健康检查(如集成 Eureka 的健康检查机制),并能自动将健康状况上报给服务注册中心。
- 如果使用
RestTemplate
调用,你需要自己实现健康检查和自动移除不可用实例的逻辑。Sidecar 则可以帮助自动进行服务实例的上下线管理,简化了运维流程。
3.统一治理和监控
- Spring Cloud/Alibaba 有丰富的治理组件,例如熔断、限流和监控等,通过 Sidecar 可以让这些功能扩展到非 Java 服务上,实现统一的服务治理。
- 如果直接使用 HTTP 请求,虽然可以集成一些外部监控和治理框架,但通常需要自己实现较多的代码来管理这些逻辑。
4.与 Spring Cloud Gateway 的集成
- 如果在架构中使用 Spring Cloud Gateway,Sidecar 能够更方便地集成,确保所有请求的路由和过滤策略对不同语言的服务也有效。
5.接入简单
- 几行代码就可以将异构微服务整合到Spring Cloud/Alibaba生态,不侵入原代码
如果你的微服务体系中包含大量异构语言服务,并且你希望它们都能享受到 Spring Cloud 提供的服务发现、健康检查、API网关、限流降级等集成功能,Sidecar 会是一个很好的选择。反之,如果异构服务较少,且不需要频繁的实例动态管理,直接使用 RestTemplate
调用可能更简单直接。
缺点
1.增加部署成本
每接入一个异构微服务实例,都需要额外部署一个Alibaba Sidecar实例,增加了部署成本。
2.性能略有下降
异构微服务调用Spring Cloud微服务时,本质是把Alibaba Sidecar当网关在使用,经过了一层转发,性能有一定下降。但由于Sidecar都是和异构微服务部署在同一个节点上,相比较使用它的好处,我觉得这是可以接受的。
Spring Cloud Sidecar 整合Nacos
官方示例及文档:Spring Cloud Alibaba 参考文档
-
下载phython程序,安装到电脑本地,参考:Windows 系统上如何安装 Python 环境(详细教程)_如何在win10上安装python-CSDN博客
-
安装 Flask。可以通过
pip
直接安装bashpip3 install Flask
-
安装完成后,可以用以下命令验证 Flask 是否安装成功
bashpip show Flask
如下图所示:
-
在项目目录中,新建一个文件,命名为
app.py
pythonfrom flask import Flask, jsonify app = 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)
-
在终端中,导航到包含
app.py
文件的目录,然后运行以下命令启动服务bashpython app.py
如果运行成功,你将看到类似如下的输出:
-
在浏览器中访问以下 URL,确保服务已成功启动
-
返回结果应为:
{"status": "UP"}
-
http://127.0.0.1:5000/api/data
返回结果应为:
{"data": "Hello from Python service!"}
这样,Python 服务就成功启动了,并且可以通过 Sidecar 将其注册到 Spring Cloud 微服务体系中。
-
-
接下来是SpringCloud工程的开发,创建SpringCloud工程,引入SpringBoot和SpringCloud依赖
-
依赖版本
xml<dependencies> <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>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> <version>2021.0.6.1</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies>
-
配置文件
yamlserver: port: 8070 spring: cloud: nacos: discovery: server-addr: 192.168.0.201:8848 username: nacos password: nacos loadbalancer: nacos: enabled: true ribbon: enabled: false application: name: python-sidecar sidecar: # 异构微服务的IP ip: 127.0.0.1 # 异构微服务的端口 port: 5000 # 异构微服务的健康检查URL health-check-url: http://127.0.0.1:5000/health management: endpoint: health: show-details: always
-
示例代码
java// 配置类 import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class AppConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } // 请求类 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class SidecarController { @Autowired private RestTemplate restTemplate; @GetMapping("/call-python-service") public String callPythonService() { // 调用 Python 服务的 `/api/data` 接口 String response = restTemplate.getForObject("http://python-sidecar/api/data", String.class); return "Response from Python service: " + response; } } // 启动类 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class SidecarApplication { public static void main(String[] args) { SpringApplication.run(SidecarApplication.class, args); } }
启动后查看Nacos控制台,发现服务已经注册进去了,详情显示IP端口都是异构微服务的,如下图所示:
-
浏览器发起请求:http://localhost:8070/call-python-service也正常响应
如果想要测试负载均衡效果,可以按照上面的步骤,部署两套边车和异构微服务,默认会使用轮训策略,如下所示:
我在1分钟内发起15次调用,两个异构微服务分别承担了7次和8次,实现了负载均衡效果。