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 参考文档

  1. 下载phython程序,安装到电脑本地,参考:Windows 系统上如何安装 Python 环境(详细教程)_如何在win10上安装python-CSDN博客

  2. 安装 Flask。可以通过 pip 直接安装

    pip3 install Flask
    
  3. 安装完成后,可以用以下命令验证 Flask 是否安装成功

    pip show Flask
    

    如下图所示:
    在这里插入图片描述

  4. 在项目目录中,新建一个文件,命名为 app.py

    from 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)
    
  5. 在终端中,导航到包含 app.py 文件的目录,然后运行以下命令启动服务

    python app.py
    

    如果运行成功,你将看到类似如下的输出:

    在这里插入图片描述

  6. 在浏览器中访问以下 URL,确保服务已成功启动

    • http://127.0.0.1:5000/health

      返回结果应为:{"status": "UP"}

      在这里插入图片描述

    • http://127.0.0.1:5000/api/data

      返回结果应为:{"data": "Hello from Python service!"}

      在这里插入图片描述

    这样,Python 服务就成功启动了,并且可以通过 Sidecar 将其注册到 Spring Cloud 微服务体系中。

  7. 接下来是SpringCloud工程的开发,创建SpringCloud工程,引入SpringBoot和SpringCloud依赖

    • 依赖版本

      <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>
      
    • 配置文件

      server:
        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
      
    • 示例代码

      // 配置类
      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次,实现了负载均衡效果。

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐