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

不同系统间数据交换要通过 api 不能直接数据库访问

image.png

很多大数据开发提供数据给外部系统直接给表结构,这是不好的方式。在不同系统间进行数据交换时,通过API(应用程序编程接口)而非直接访问数据库是现代系统集成的一种最佳实践。

目录

      • 为什么要通过API进行数据交换
      • 如何通过API进行数据交换
      • 实现步骤
      • 使用Flask构建RESTful API
        • 安装Flask
        • API代码示例
        • 启动API服务器
      • 使用Spring Boot构建RESTful API
        • 创建Spring Boot项目并添加依赖
        • 创建API控制器
        • 创建数据实体和仓库
        • 启动Spring Boot应用
      • 将大数据平台的数据提供给外部系统
        • 使用PySpark读取数据
        • 将PySpark数据集成到Flask API
      • 总结

为什么要通过API进行数据交换

image.png

  1. 安全性

    • 控制访问:API可以通过认证和授权机制来控制谁可以访问数据。
    • 隔离系统:通过API访问数据可以隔离不同系统,减少一个系统的漏洞或故障对其他系统的影响。
  2. 数据一致性

    • 统一接口:API提供了统一的数据访问接口,可以确保数据的一致性和完整性。
    • 减少重复:通过API避免了在多个地方实现相同的数据逻辑,从而减少了重复代码和潜在的错误。

image.png

  1. 维护性和扩展性

    • 模块化设计:API使得系统更加模块化,便于维护和扩展。
    • 易于升级:通过API可以更容易地进行系统的升级和更新,而不影响其他系统。
      image.png
  2. 日志和监控

    • 跟踪访问记录:API可以记录所有的请求和响应,便于监控和审计。
    • 性能监控:通过API可以更容易地监控系统性能,发现和解决瓶颈问题。
      image.png

如何通过API进行数据交换

image.png

  1. RESTful API

    • 定义资源:每个API端点代表一个资源,如用户、订单等。
    • 使用HTTP方法:GET、POST、PUT、DELETE等方法对应于读取、创建、更新、删除操作。
  2. SOAP API

    • 使用XML:SOAP(简单对象访问协议)使用XML格式来定义消息结构。
    • 更严格的标准:SOAP提供了更严格的协议和标准,适用于需要高安全性和事务处理的场景。
  3. GraphQL

    • 灵活查询:允许客户端指定需要的数据结构,减少数据传输量。
    • 单个端点:通过单个端点提供数据查询和操作,简化接口管理。
  4. 消息队列

    • 异步通信:使用消息队列(如RabbitMQ、Kafka)可以实现系统间的异步数据传输。
    • 解耦系统:通过消息队列可以解耦生产者和消费者,提升系统的扩展性和可靠性。

实现步骤

image.png

  1. 需求分析

    • 确定需要交换的数据和操作,设计API接口和数据模型。
  2. API设计

    • 选择合适的API风格(RESTful、SOAP、GraphQL等)。
    • 定义API端点、请求方法、参数和响应格式。
  3. 安全机制

    • 实现认证(如OAuth、JWT)和授权机制。
    • 确保数据传输的安全性(如HTTPS)。
  4. 开发和测试

    • 开发API,并进行单元测试和集成测试。
    • 使用工具(如Postman、Swagger)进行测试和文档编写。
  5. 部署和监控

    • 部署API服务,并设置日志和监控系统。
    • 定期检查和优化API性能和安全性。

通过API进行数据交换不仅提高了系统的安全性和维护性,还增强了系统的扩展能力和灵活性,是现代系统架构设计中的重要实践。

image.png

其实开发接口 也不难,以下是一些代码示例和步骤,展示如何使用不同技术栈实现API,并将大数据平台的数据提供给外部系统。

使用Flask构建RESTful API

安装Flask
pip install Flask
API代码示例
from flask import Flask, request, jsonify
import pandas as pd
import jsonapp = Flask(__name__)# 示例数据,实际情况中应从大数据平台读取数据
data = {'id': [1, 2, 3],'name': ['Alice', 'Bob', 'Charlie'],'score': [85, 90, 78]
}df = pd.DataFrame(data)@app.route('/api/data', methods=['GET'])
def get_data():result = df.to_dict(orient='records')return jsonify(result)@app.route('/api/data/<int:id>', methods=['GET'])
def get_data_by_id(id):result = df[df['id'] == id].to_dict(orient='records')if not result:return jsonify({'error': 'Data not found'}), 404return jsonify(result[0])@app.route('/api/data', methods=['POST'])
def add_data():new_data = request.jsondf.append(new_data, ignore_index=True)return jsonify({'message': 'Data added successfully'}), 201if __name__ == '__main__':app.run(debug=True)
启动API服务器
python app.py

使用Spring Boot构建RESTful API

创建Spring Boot项目并添加依赖

pom.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-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies>
创建API控制器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Optional;@RestController
@RequestMapping("/api/data")
public class DataController {@Autowiredprivate DataRepository dataRepository;@GetMappingpublic List<Data> getAllData() {return dataRepository.findAll();}@GetMapping("/{id}")public Data getDataById(@PathVariable Long id) {Optional<Data> data = dataRepository.findById(id);if (data.isPresent()) {return data.get();} else {throw new ResourceNotFoundException("Data not found with id " + id);}}@PostMappingpublic Data addData(@RequestBody Data data) {return dataRepository.save(data);}
}
创建数据实体和仓库
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Data {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String name;private int score;// getters and setters
}
import org.springframework.data.jpa.repository.JpaRepository;public interface DataRepository extends JpaRepository<Data, Long> {
}
启动Spring Boot应用
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

将大数据平台的数据提供给外部系统

假设数据存储在Hadoop HDFS中,我们可以使用PySpark读取数据并通过API提供给外部系统。

使用PySpark读取数据
from pyspark.sql import SparkSessionspark = SparkSession.builder \.appName("Data API") \.getOrCreate()# 读取HDFS中的数据
df = spark.read.csv("hdfs://path/to/data.csv", header=True, inferSchema=True)# 将数据转换为Pandas DataFrame以便使用Flask
pandas_df = df.toPandas()
将PySpark数据集成到Flask API
from flask import Flask, request, jsonify
import pandas as pd
import json
from pyspark.sql import SparkSessionapp = Flask(__name__)# 创建Spark会话
spark = SparkSession.builder \.appName("Data API") \.getOrCreate()# 读取HDFS中的数据
df = spark.read.csv("hdfs://path/to/data.csv", header=True, inferSchema=True)
pandas_df = df.toPandas()@app.route('/api/data', methods=['GET'])
def get_data():result = pandas_df.to_dict(orient='records')return jsonify(result)@app.route('/api/data/<int:id>', methods=['GET'])
def get_data_by_id(id):result = pandas_df[pandas_df['id'] == id].to_dict(orient='records')if not result:return jsonify({'error': 'Data not found'}), 404return jsonify(result[0])if __name__ == '__main__':app.run(debug=True)

总结

image.png

通过构建API,可以安全、有效地将大数据平台的数据提供给外部系统。无论是使用Flask还是Spring Boot,都可以实现RESTful API的构建。同时,结合大数据平台的读取能力(如Hadoop HDFS和PySpark),可以轻松实现数据的获取和提供。

相关文章:

不同系统间数据交换要通过 api 不能直接数据库访问

很多大数据开发提供数据给外部系统直接给表结构&#xff0c;这是不好的方式。在不同系统间进行数据交换时&#xff0c;通过API&#xff08;应用程序编程接口&#xff09;而非直接访问数据库是现代系统集成的一种最佳实践。 目录 为什么要通过API进行数据交换如何通过API进行数据…...

深度探索“目录名称无效“:原因、解决方案与最佳实践

目录名称无效&#xff1a;现象背后的秘密 在日常使用电脑或移动设备时&#xff0c;我们时常会遇到“目录名称无效”的错误提示&#xff0c;这一提示仿佛是一道无形的屏障&#xff0c;阻断了我们与重要数据的联系。从本质上讲&#xff0c;“目录名称无效”意味着系统无法识别或…...

open3d基础使用-简单易懂

Open3D是一个开源库&#xff0c;主要用于快速开发处理3D数据的软件。它提供了丰富的数据结构和算法&#xff0c;支持点云、网格和RGB-D图像等多种3D数据的处理。以下是对Open3D基础使用的详细归纳和说明&#xff1a; 一、安装Open3D Open3D可以通过Python的包管理器pip进行安…...

【前端】HTML+CSS复习记录【5】

文章目录 前言一、padding、margin、border&#xff08;边框边距&#xff09;二、样式优先级三、var&#xff08;使用 CSS 变量更改多个元素样式&#xff09;四、media quary&#xff08;媒体查询&#xff09;系列文章目录 前言 长时间未使用HTML编程&#xff0c;前端知识感觉…...

三分钟看懂SMD封装与COB封装的差异

全彩LED显示屏领域中&#xff0c;COB封装于SMD封装是比较常见的两种封装方式&#xff0c;SMD封装产品主要有常规小间距以及室内、户外型产品&#xff0c;COB封装产品主要集中在小间距以及微间距系列产品中&#xff0c;今天跟随COB显示屏厂家中品瑞一起快速看懂SMD封装与COB封装…...

深入理解策略梯度算法

策略梯度&#xff08;Policy Gradient&#xff09;算法是强化学习中的一种重要方法&#xff0c;通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理&#xff0c;推导其数学公式&#xff0c;并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…...

Unicode 和 UTF-8 以及它们之间的关系

通俗易懂的 Unicode 和 UTF-8 解释 Unicode 是什么&#xff1f; 想象一下&#xff0c;我们有一个巨大的图书馆&#xff0c;这个图书馆里有各种各样的书&#xff0c;每本书都有一个唯一的编号。Unicode 就像是这个图书馆的目录系统&#xff0c;它给世界上所有的字符&#xff0…...

【C++】多态详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 一、多态概念 二、多态的定义及实现 1. 多态的构成条件 2. 虚函数 2.1 什么是虚函数 2.2 虚函数的重写 2.3 虚函数重写的两个…...

C#异常捕获

前言 在C#中&#xff0c;我们无法保证我们编写的程序没有一点bug&#xff0c;如果我们对于这些抛出异常的bug不进行任何的处理的话&#xff0c;那么我们的软件在抛出这些异常的时候就会崩溃&#xff0c;也就是软件闪退&#xff0c;并且这种闪退由于我们没有进行处理&#xff0…...

工业一体机根据软件应用需求灵活选配

在当今工业领域&#xff0c;数字化、智能化的发展趋势愈发明显&#xff0c;工业一体机作为关键的设备&#xff0c;其重要性日益凸显。而能够根据软件应用需求进行灵活选配的工业一体机&#xff0c;更是为企业提供了高效、定制化的解决方案。 一、工业一体机的全封闭无风扇散热功…...

centos7 mqtt服务mosquitto搭建记录

1、系统centos7.6&#xff0c;安装默认版本 yum install mosquitto 2、启动运行 systemctl start mosquitto 3、设置自启动 systemctl enable mosquitto 4、修改配置文件 vim /etc/mosquitto/mosquitto.conf 监听端口&#xff0c;默认为1883&#xff0c;需要修改删除前面…...

双阶段目标检测算法:精确与效率的博弈

双阶段目标检测算法&#xff1a;精确与效率的博弈 目标检测是计算机视觉领域的一个核心任务&#xff0c;它涉及在图像或视频中识别和定位多个对象。双阶段目标检测算法是一种特殊的目标检测方法&#xff0c;它通过两个阶段来提高检测的准确性。本文将详细介绍双阶段目标检测算…...

Python量化交易策略

策略详情 按照1分k线图&#xff1b;跳过9&#xff1a;30点1分k线图不计算 买入&#xff1b;监控市面的可转债&#xff1b;当某1分涨幅大于x涨幅&#xff0c;一直重复x次&#xff0c;选择买入&#xff0c;符合x设置的条件只选择成交额最大的可转债买入&#xff08;x要自定义&…...

为什么我感觉 C 语言在 Linux 下执行效率比 Windows 快得多?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;Windows的终端或者叫控制台…...

算法导论 总结索引 | 第四部分 第十六章:贪心算法

1、求解最优化问题的算法 通常需要经过一系列的步骤&#xff0c;在每个步骤都面临多种选择。对于许多最优化问题&#xff0c;使用动态规划算法求最优解有些杀鸡用牛刀了&#xff0c;可以使用更简单、更高效的算法 贪心算法&#xff08;greedy algorithm&#xff09;就是这样的算…...

用“文心一言”写的文章,看看AI写得怎么样?

​零售连锁店的“支付结算”业务设计 在数字化浪潮的推动下&#xff0c;连锁店零售支付结算的设计愈发重要。一个优秀的支付结算设计不仅能够提升用户体验&#xff0c;还能增强品牌竞争力&#xff0c;进而促进销售增长。 本文将围绕一个具体的连锁店零售支付结算案例&#xf…...

企业消费采购成本和员工体验如何实现“鱼和熊掌“的兼得?

有企业说企业消费采购成本和员工体验的关系好比是“鱼和熊掌”&#xff0c;无法兼得&#xff1f; 要想控制好成本就一定要加强管控&#xff0c;但是加强管控以后&#xff0c;就会很难让员工获得满意的体验度。如果不加以管控&#xff0c;员工自由度增加了&#xff0c;往往就很难…...

发表EI论文相当于SCI几区?

EI&#xff08;工程索引&#xff09;本身并不进行分区&#xff0c;它是一个收录工程领域高质量文献的数据库&#xff0c;与SCI&#xff08;科学引文索引&#xff09;的分区制度不同。然而&#xff0c;在非正式的学术评价中&#xff0c;有时人们会将EI与SCI的分区进行比较。 虽…...

STFT短时傅里叶变换MTLAB简析

代码&#xff1a; 解释&#xff1a; 如果信号x有Nx个时间样本&#xff0c;短时傅里叶变换的结果矩阵s有k列&#xff1b; k的计算方式如图所示&#xff0c;M是窗函数的长度&#xff0c;L是重叠长度。 此符号是向下取整符号。 短时傅里叶变换的结果矩阵s的行数与参数‘FFTLength’…...

海致科技实施实习生面试

一、面试内容 注&#xff1a;此次是电话面试 1.是XX先生吗 2.你是有考虑转实施的吗&#xff1f; 3.请讲一下你对项目部署实施的理解和掌握 4.用过数据库&#xff0c;会编写SQL语句吗&#xff1f; 5.讲一下SQL的常用关键字 6.了解SQL中的函数吗&#xff1f;谈谈函数 7.多…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...