当前位置: 首页 > article >正文

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

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


http://www.kler.cn/a/391558.html

相关文章:

  • CentOS 服务
  • 并发基础:(淘宝笔试题)三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串【举一反三】
  • 矢量拟合(1)Sanathanan–Koerner算法
  • vue3项目中内嵌vuepress工程两种实现方式
  • 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
  • redis实现消息队列的几种方式
  • ES6模块、CommonJS、AMD等不同的模块化实现。
  • npm i 的时候报错: npm ERR! Error: EPERM: operation not permitted, rename
  • 已解决:spark代码中sqlContext.createDataframe空指针异常
  • 优化Mac的鼠标使用体验超简单方法
  • C++零基础趣味学信息学奥赛系列课程简介
  • 科技云报到:数字化转型,从不确定性到确定性的关键路径
  • Java的六大排序
  • react-router-dom 库作用
  • C++知识回顾
  • 游戏之地图找怪进行PK升级。C++
  • hive alter table add columns 是否使用 cascade 的方案
  • Linux后台运行jar包,nohup、>、
  • 源码解析-Spring Eureka
  • Qt 获取当前系统中连接的所有USB设备的信息 lsusb版
  • Spring Boot编程训练系统:架构设计与技术选型
  • creo toolkit二次开发学习之获取任意选择模型作为元件,并进行获取约束等
  • 6.2 对角化矩阵(1)
  • 【机器学习导引】ch6-支持向量机
  • RabbitMQ队列详细属性(重要)
  • 【MATLAB源码-第215期】基于matlab的8PSK调制CMA均衡和RLS-CMA均衡对比仿真,对比星座图和ISI。