SpringCloudAlibabaSidecar整合异构微服务

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 直接安装

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

    bash 复制代码
    pip show Flask

    如下图所示:

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

    python 复制代码
    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 文件的目录,然后运行以下命令启动服务

    bash 复制代码
    python app.py

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

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

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

  7. 接下来是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>
    • 配置文件

      yaml 复制代码
      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
    • 示例代码

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

相关推荐
吴冰_hogan2 分钟前
nacos集群源码解析-cp架构
java·spring boot·spring·架构·服务发现·springcloud
白总Server2 小时前
JVM 处理多线程并发执行
jvm·后端·spring cloud·微服务·ribbon·架构·数据库架构
LightOfNight3 小时前
Redis设计与实现第9章 -- 数据库 总结(键空间 过期策略 过期键的影响)
数据库·redis·后端·缓存·中间件·架构
颜淡慕潇11 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
运维&陈同学11 小时前
【模块一】kubernetes容器编排进阶实战之k8s基础概念
运维·docker·云原生·容器·kubernetes·云计算
mit6.82412 小时前
[Docker#4] 镜像仓库 | 部分常用命令
linux·运维·docker·容器·架构
林戈的IT生涯12 小时前
一个基于Zookeeper+Dubbo3+SpringBoot3的完整微服务调用程序示例代码
微服务·rpc·dubbo
研究司马懿16 小时前
【Golang】Go语言环境安装
开发语言·后端·云原生·golang·二开
乌恩大侠16 小时前
了解 Open RAN 架构中的 DU 和 CU
架构
贵州晓智信息科技16 小时前
深入理解 React 架构从概览到核心机制
前端·react.js·架构