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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/911674.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 组件传递数据-Props(六)

一、Props传递静态数据 defineProps() 和 defineEmits() 为了在声明 props 和 emits 选项时获得完整的类型推导支持&#xff0c;我们可以使用 defineProps 和 defineEmits API&#xff0c;它们将自动地在 <script setup> 中可用&#xff1a; defineProps 和 defineEmits …

SpringBoot源码解析(三)

一、手写模拟springboot核心流程 前面两章内容已经详细解释了springboot的核心原理与启动流程&#xff0c;本章通过手写模拟实现一个SpringBoot&#xff0c;让大家能以非常简单的方式就能知道SpringBoot大概是如何工作的&#xff0c;作为对上两章内容的一个巩固。 一、模拟Sp…

Python实战:调用淘宝API以抓取商品页面数据

在数据驱动的商业决策中&#xff0c;获取电商平台的商品数据至关重要。淘宝作为中国最大的在线购物平台&#xff0c;其商品数据对于市场分析、价格监控和竞品研究等方面都具有极高的价值。本文将通过一个Python实战案例&#xff0c;展示如何调用淘宝API来抓取商品页面的数据。 …

STL---迭代器

本文来源&#xff1a;《C语言程序设计》第10章 理解迭代器对于理解STL框架并掌握STL的使用至关重要。 迭代器是泛化的指针&#xff0c;STL算法利用迭代器对存储在容器中的元素序列进行遍历&#xff0c;迭代器提供了访问容器中每个元素的方法。 虽然指针也是一种迭代器&#…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

京东AI单旋旋转验证码98准确率通杀方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/12 京东单旋验证码最近更新了,使用AI生成,要求识别角度,以下是部分数据集: 接下…

playground.tensorflow神经网络可视化工具

playground.tensorflow 是一个可视化工具&#xff0c;用于帮助用户理解深度学习和神经网络的基本原理。它通过交互式界面使用户能够构建、训练和可视化简单的神经网络模型。以下是一些主要的数学模型和公式原理&#xff0c;它们在这个平台中被应用&#xff1a; 1. 线性模型 线…

[vulnhub] DarkHole: 2

https://www.vulnhub.com/entry/darkhole-2,740/ 端口扫描主机发现 探测存活主机&#xff0c;185是靶机 # nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 18:02 CST Nmap scan report for 192.168.75.1 Host is up (0.…

【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 064 &#xff0c;文末自助获取源码 \color{red}{T064&#xff0c;文末自助获取源码} T064&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

移动取证和 Android 安全

当今的数字时代已经产生了许多技术进步&#xff0c;无论是智能手机还是虚拟现实、人工智能和物联网 (IoT) 等下一代基础技术。 智能手机已不再只是奢侈品&#xff0c;而是我们生存所必需的东西。根据各种统计数据&#xff0c;如今全球有超过 50% 的人使用手机。 由于数据存储…

C++builder中的人工智能(14):修正线性单元(ReLU)激活函数

这篇文章将解释在人工神经网络&#xff08;ANN&#xff09;中修正线性函数&#xff08; Rectified Linear Function&#xff09;是什么&#xff0c;以及如何使用ReLU激活函数。让我们回顾一下激活函数的概念&#xff0c;并定义这些术语。学习修正线性函数对于使用C软件编写程序…

【信号处理】基于联合图像表示的深度学习卷积神经网络

Combined Signal Representations for Modulation Classification Using Deep Learning: Ambiguity Function, Constellation Diagram, and Eye Diagram 信号表示 Ambiguity Function(AF) 模糊函数描述了信号的两个维度(dimensions):延迟(delay)和多普勒(Doppler)。 …

05 SQL炼金术:深入探索与实战优化

文章目录 SQL炼金术&#xff1a;深入探索与实战优化一、SQL解析与执行计划1.1 获取执行计划1.2 解读执行计划 二、统计信息与执行上下文2.1 收集统计信息2.2 执行上下文 三、SQL优化工具与实战3.1 SQL Profile3.2 Hint3.3 Plan Baselines3.4 实战优化示例 SQL炼金术&#xff1a…

MySQL_第13章_视图

1. 常见的数据库对象 2. 视图概述 2.1 为什么使用视图&#xff1f; 视图一方面可以使用表的一部分而不是所有的表&#xff0c;另一方面也可以针对不同的用户制定不同的查询视图。 2.2 视图的理解 视图是一种虚拟表&#xff0c;本身是不具有数据的&#xff0c;占用很少的内存…

【代码随想录day24】【C++复健】93.复原IP地址; 78.子集 ;90.子集II

今天写代码的时候整体状态其实就不太好&#xff0c;整个人晕晕的&#xff0c;好多时候写出来的代码也是多少带点愚蠢。 93.复原IP地址 看卡哥说“大家做完 分割回文串 之后&#xff0c;本题就容易很多了”还以为是秒杀题呢&#xff0c;结果直接被卡住。怎么说呢&#xff0c;…

Vue:条件渲染 列表渲染

Vue&#xff1a;条件渲染 & 列表渲染 条件渲染v-showv-if 列表渲染v-for数组对象 条件渲染 Vue允许依据一定的条件&#xff0c;通过表达式的布尔值&#xff0c;来决定是否渲染某些元素&#xff0c;其依赖于v-show和v-if两条指令。 v-show v-show可以依据表达式的布尔值&…

计算机的错误计算(一百四十八)

摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…

input file检验成功之后才可以点击

input file检验成功之后才可以点击 需求 在上传发票前需要先填写发票号&#xff0c;然后点击选择文件直接完成上传功能 实现思路 在没有输入发票号之前&#xff0c;file按钮不可用不能点击&#xff0c;输入之后&#xff0c;按钮可用&#xff0c;点击之后选择文件&#xff…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文&#xff0c;其提供了应用的一些基础信息&#xff0c;例如resourceManager&#xff08;资源管理&#xff09;、applicationInfo&#xff08;当前应用信息&#xff09;、dir&#xff08;应用文件路径&#xff09;、area&#xff08;文件分区…

算法每日练 -- 双指针篇(持续更新中)

介绍&#xff1a; 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff08;左右指针&#xff09;&#xff0c;一种是快慢指针&#xff08;前后指针&#xff09;。需要注意这里的双指针不是 int* 之类的类型指针&#xff0c;而是使用数组下标模拟地址来进行遍历的方式。 …