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

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

时间:2024-07-03 22:02:10浏览次数:3  
标签:__ api 数据交换 数据库 df API import data id

image.png

很多大数据开发提供数据给外部系统直接给表结构,这是不好的方式。在不同系统间进行数据交换时,通过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 json

app = 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'}), 404
    return jsonify(result[0])

@app.route('/api/data', methods=['POST'])
def add_data():
    new_data = request.json
    df.append(new_data, ignore_index=True)
    return jsonify({'message': 'Data added successfully'}), 201

if __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 {

    @Autowired
    private DataRepository dataRepository;

    @GetMapping
    public 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);
        }
    }

    @PostMapping
    public 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 SparkSession

spark = 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 SparkSession

app = 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'}), 404
    return jsonify(result[0])

if __name__ == '__main__':
    app.run(debug=True)

总结

image.png

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

标签:__,api,数据交换,数据库,df,API,import,data,id
From: https://blog.csdn.net/u012955829/article/details/140137219

相关文章

  • Unity的Package库在IDE里不显示API注释的解决方法
    当你在代码里使用Package库的API的时候,比如Addressable和Unity.Entities等等,以VisualStudio为例,鼠标放到API上,会发现不显示注释:然而按F12访问源代码,会发现代码里面是有注释的,而且对于Unity的包,注释会非常的详细:本质原因是Unity在编译这些Package的时候,没有生成XML注释文档,导......
  • SQLServer数据库批量kill会话的脚本(慎用!)
    微软大佬提供的一个批量kill会话的脚本,很凶很暴力,慎用慎用慎用!尤其是涉及大事务时。請注意:如果資料庫還在正在Recovery階段無效,因為無法Kill系統Session,必須等候Recovery完畢(或是重建交易紀錄檔案)。/*Function:KillallSPIDonspecificdatabaseandRepairWri......
  • 阿里巴巴中国站拍立淘API返回值分析:图像识别技术助力电商用户体验升级
    阿里巴巴中国站拍立淘API的返回值分析,以及图像识别技术如何助力电商用户体验升级,可以从以下几个方面进行详细阐述:一、拍立淘API返回值分析拍立淘API是阿里巴巴中国站提供的一项基于图片搜索的商品搜索服务,它允许用户通过上传商品图片,系统自动识别图片中的商品信息,并返回与之......
  • 12条技巧,打造出超高性能的接口API
    插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(前言–人工智能教程)坚持不懈,越努力越幸运,大家一起学习鸭~~~1.并行处理简要说明举个例子:在价格查询链路中,我们需要获取多种独立的价格配置项......
  • Neo4j图数据库操作
    Neo4j图数据库操作文章目录Neo4j图数据库操作1批量添加节点、关系1.1直接使用`UNWIND`批量创建关系1.2使用CSV文件批量创建关系1.3选择方法2索引2.1创建单一属性索引2.2创建组合属性索引2.3创建全文索引2.4列出所有索引2.5删除索引2.6注意事项3清空所......
  • Oracle数据库统计信息收集
    Oracle数据库统计信息收集重新收集表统计信息--重新收集表统计信息BEGINDBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'ORCL',TABNAME=>'XXX',ESTIMATE_PERCENT=>100,DEGREE=>4);END;重新收集列统计信息......
  • 小白也能懂的Mysql数据库索引详解
    核心概念主键索引/二级索引聚簇索引/非聚簇索引回表/索引覆盖索引下推联合索引/最左联合匹配前缀索引explain一、[索引定义]1.索引定义在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现......
  • W外链 短网址系统API 源码,网址缩短API接口
    1、提供的接口W外链提供接口如下:2、签名简介使用前请了解如下事项:API 的签名主要是用于获取身份令牌 AccessToken 时所需必要认证参数在请求需要复杂认证接口的时候,系统会验证 AccessToken在请求获取 AccessToken 的接口时候,服务器会对用户请求合法性的 signature 进......
  • 【Python&网络通信】基于Bypy调用百度网盘api实现自动上传和下载网盘文件
    ​    网盘对于大家的生活工作可以说是息息相关,但是如果每天都重复去上传下载文件就会很浪费时间,所以有没有什么办法可以解放双手?那就是网盘接口,本文通过Bypy库实现百度网盘的自动上传和下载文件。原创作者:RS迷途小书童博客地址:https://blog.csdn.net/m0_56729804?t......
  • 真太卷了...又开源一款开放API管理工具,支持扩展插件(带私活源码)
     关于API管理工具,相信大家已经都有自己用着顺手的。像国外的Postman,国内有Apifox等等。今天给大家分享的是近期在GitHub比较热门的另一款开放API管理工具:Eoapi。1.Eoapi简介概括来说:这是一款API管理工具,支持扩展插件,简单,开源。Eoapi集合了基础的API管理功能和测试......