当前位置: 首页 > 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.多…...

论文阅读之旋转目标检测ARC:《Adaptive Rotated Convolution for Rotated Object Detection》

论文link&#xff1a;link code&#xff1a;code ARC是一个改进的backbone&#xff0c;相比于ResNet&#xff0c;最后的几层有一些改变。 Introduction ARC自适应地旋转以调整每个输入的条件参数&#xff0c;其中旋转角度由路由函数以数据相关的方式预测。此外&#xff0c;还采…...

面向对象(Java)

构造方法只能在对象实例化的时候调用 this可以作为方法参数&#xff0c;表示调用方法的当前对象 this可以作为方法返回值&#xff0c;表示返回当前对象 封装 通过方法访问数据&#xff0c;隐藏类的实现细节 static&#xff1a;类对象共享&#xff0c;类加载时产生&#xff0c;…...

I/O多路复用

参考面试官&#xff1a;简单说一下阻塞IO、非阻塞IO、IO复用的区别 &#xff1f;_unix环境编程 阻塞io和非阻塞io-CSDN博客 同步阻塞(BIO) BIO 以流的方式处理数据 应用程序发起一个系统调用&#xff08;recvform&#xff09;&#xff0c;这个时候应用程序会一直阻塞下去&am…...

线性代数基础概念:向量空间

目录 线性代数基础概念&#xff1a;向量空间 1. 向量空间的定义 2. 向量空间的性质 3. 基底和维数 4. 子空间 5. 向量空间的例子 总结 线性代数基础概念&#xff1a;向量空间 向量空间是线性代数中最基本的概念之一&#xff0c;它为我们提供了一个抽象的框架&#xff0c…...

php 抓取淘宝商品评论数据 json

要抓取淘宝商品评论数据&#xff0c;你可以使用PHP的cURL库来发送HTTP请求并获取JSON格式的数据。 API接入流程&#xff1a;需要开放平台或者是封装接口注册账号&#xff0c;并申请相应的API使用权限&#xff0c;以获取必要的密钥和接口文档。获取接口使用权限&#xff1a;接入…...

Java 7新特性深度解析:提升效率与功能

文章目录 Java 7新特性深度解析&#xff1a;提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理&#xff08;捕获多个异常&#xff09;四、增强泛型推断五、NIO2.0&#xff08;AIO&#xff09;新IO的支持六、SR292与InvokeDynamic七、Path接口…...

RHEL9找不到/var/log/dmesg日志文件问题

问题描述 在Rocky Linux 9 服务器上查看启动日志&#xff0c;发现没有/var/log/dmesg文件。 dmesg是什么&#xff1f; dmesg(diagnostic messages)用于打印kernel ring buffer的所有消息。 kernel会将开机信息存储在ring buffer中&#xff0c;如果开机时来不及查看启动信息&…...

是什么让以太坊从众多公链中脱颖而出

以太坊从众多公链中脱颖而出&#xff0c;成为区块链和加密货币领域的一个重要玩家&#xff0c;主要是由于以下几个关键因素&#xff1a; 智能合约&#xff1a; 以太坊是第一个广泛实施智能合约的区块链平台&#xff0c;智能合约允许在区块链上自动执行合同条款&#xff0c;无需…...

HarmonyOS--路由管理--组件导航 (Navigation)

文档中心 什么是组件导航 (Navigation) &#xff1f; 1、Navigation是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式 2、Navigation组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0…...

【Linux 命令】文件比较 diff

diff 命令是 Unix 和类 Unix 系统&#xff08;如 Linux 和 macOS&#xff09;中用于比较文件内容差异的一个非常有用的命令行工具。它可以逐行比较两个文件的内容&#xff0c;并输出它们之间的差异。这些差异通常以行为单位显示&#xff0c;并且会标记出哪些行是唯一的、添加的…...