首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

干净的架构:在哪里进行API调用

干净的架构(Clean Architecture)是一种软件设计哲学,它强调将系统分层,使得业务逻辑与外部因素(如数据库、框架、用户界面等)分离。这种架构的核心思想是依赖倒置原则(Dependency Inversion Principle),即高层组件不应该依赖于底层组件,它们都应该依赖于抽象。

API调用的位置

在干净的架构中,API调用通常发生在以下几个层次:

  1. 接口适配器层(Adapter Layer):这一层负责将外部请求转换为内部系统可以理解的格式,并将内部系统的响应转换为外部可以理解的格式。例如,RESTful API的控制器通常位于这一层。
  2. 应用服务层(Application Service Layer):这一层包含业务逻辑,但不直接与数据库或其他外部系统交互。它调用领域层的服务来完成业务逻辑,并通过接口适配器层与外部世界通信。
  3. 领域层(Domain Layer):这一层包含业务对象和业务规则。领域服务(Domain Services)可能会调用基础设施层的服务来进行某些操作,如API调用。
  4. 基础设施层(Infrastructure Layer):这一层负责与外部系统(如数据库、第三方API等)的交互。它提供了领域层所需的抽象,使得领域层不直接依赖于具体的实现。

优势

  • 可测试性:由于各层之间的依赖关系被明确管理,可以更容易地进行单元测试和集成测试。
  • 可维护性:业务逻辑与外部因素分离,使得代码更易于理解和维护。
  • 可扩展性:系统更容易适应变化,因为更改通常只影响相关的层次。

类型

  • 同步API调用:客户端发送请求后等待服务器响应。
  • 异步API调用:客户端发送请求后不等待立即响应,可以通过回调、事件或消息队列等方式接收响应。

应用场景

  • 微服务架构:每个微服务可以有自己的API接口,通过干净的架构设计,可以确保服务之间的解耦。
  • 企业应用:大型企业应用通常需要与多个外部系统交互,干净的架构可以帮助管理这些交互。

遇到的问题及解决方法

问题:API调用失败

  • 原因:可能是网络问题、API服务端问题、请求参数错误等。
  • 解决方法
    • 检查网络连接。
    • 查看API服务端的日志。
    • 校验请求参数是否正确。
    • 实现重试机制和错误处理逻辑。

问题:API响应时间过长

  • 原因:可能是API服务端处理缓慢、网络延迟等。
  • 解决方法
    • 优化API服务端的性能。
    • 使用缓存减少响应时间。
    • 考虑使用异步调用或消息队列。

示例代码

以下是一个简单的Python示例,展示如何在接口适配器层进行API调用:

代码语言:txt
复制
import requests

def get_user_data(user_id):
    url = f"https://api.example.com/users/{user_id}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        raise Exception(f"Failed to get user data: {response.status_code}")

# 调用示例
try:
    user_data = get_user_data(123)
    print(user_data)
except Exception as e:
    print(e)

参考链接

通过以上信息,您可以更好地理解在干净的架构中API调用的位置、优势、类型、应用场景以及可能遇到的问题和解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Camera系统 | OpenCameracamx架构调用

: 通过一个JumpTableHAL3类型对象pHAL3来分发(dispatch)或者说跳转到实际实现中 g_jumpTableHAL3描述跳转关系 \vendor\qcom\proprietary...m_ChiAppCallback进行调用,根据上一篇初步理解,CHI模块应该是与Camx对接,厂商自定义代码,这里和App扯上关系不太明白是为什么,并且还是一个callback。...: 深入理解Android相机体系结构之六_xiaozi63博客-CSDN博客_深入理解android相机体系结构 “HAL3Module构造方法中会去通过dlopen方法加载com.qti.chi.override.so...,看了上下几个函数都需要GetInstance来获取实例,看来这个ExtensionModule对象是一个单例 ExtendOpen调用位置: \vendor\qcom\proprietary...\chi-cdk\core\chiframework\chxextensionmodule.cpp 看上去做了很多设置,没有像tv一样去和V4L2进行交互 接下来,一路返回直至 \vendor

1.9K42

调用API之前,你需要理解LSTM工作原理

LSTM 是目前应用非常广泛模型,我们使用 TensorFlow 或 PyTorch 等深度学习库调用它甚至都不需要了解它运算过程,希望本文能为各位读者进行预习或复习 LSTM 提供一定帮助。...虽然上图并没有表明详细和真实 LSTM 架构,但它能给我们一个直观理解。此外,正因为 LSTM 这种属性,它不会对整个信息进行统一运算,而是稍微修改一些局部信息。...因此我们需要把他「输入」到我们新闻中作进一步分析。 但是现在所有这些碎片信息都不够主流媒体上进行报道,因此一段时间后,我们需要总结这些信息并「输出」对应结果给我们读者。...我们使用 Keras,它是一个用于神经网络高阶 API,并在 TensorFlow 或 Theano 之上工作。因此进入代码之前,请确保你已安装运行正常 Keras。好,我们开始生成文本!...我们接着把 X_modified 中 0 到 1 之间进行缩放,并且 Y_modified 中对真值进行独热编码(one hot encode)。

1.5K40
  • ButterCMS架构:完成数百万次调用关键任务API

    停机时间是致命 客户web站点在发送request/response过程中,会产生对ButterCMSAPI调用来获取页面内容。对ButterCMSAPI请求失败,他们页面可能不会呈现。...如果API宕机了,我们客户网站就会和我们一起停机。 这是我们早期学到严重一课。不可靠服务器托管导致频繁间歇性中断和性能下降,这会使客户很失望。...通过FastlyCDN来提供API响应,这意味着客户网站访客,无论何处都可以获得快速加载次数。 消除单点故障 ButterCMS早期,处理两个独立DNS事件令人身心疲惫。...经验告诉我们整个架构中注意消除任何一个单点故障。 对于DNS服务器,使用来自不同DNS提供商不同域名服务器。...除了通过 Fastly缓存API,也使用Memcached应用层缓存API。这为防止数据库或者服务器中断提供了一个额外缓存。

    1.7K60

    使用 Spring Cloud Gateway 进行微服务架构 API 网关实践

    随着微服务架构流行,API网关成为了微服务架构中不可或缺一部分。API网关不仅仅是一个简单路由器,而且还有许多其他功能,例如负载均衡,安全性和监控等。...Spring Cloud Gateway是一个轻量级API网关,它是Spring Cloud生态系统中一个组件,可以帮助开发人员快速构建高效微服务架构。...现在,我们可以通过发送HTTP请求来测试API网关。例如,要调用用户服务,我们可以向http://localhost:8080/users发送GET请求。...同样,要调用订单服务,我们可以向http://localhost:8080/orders发送GET请求。...进一步配置Spring Cloud Gateway还提供了许多其他配置选项,例如路由过滤器,负载均衡和安全性等。下面是一些例子:使用路由过滤器可以使用路由过滤器对传入和传出请求进行修改和验证。

    1.3K131

    只需使用VS CodeREST客户端插件即可进行API调用

    在过去,为了连接 UI 以接受数据之前测试 REST API,通常必须通过终端命令行查询 API,或者使用像 Insomnia 或 Postman 这样 GUI(我之前博客中对它们进行了比较)...安装完成后,我们可以继续进行设置。...测试一下:基本操作 这是很酷部分:经验中,这个小小 REST Client 插件能够做事情和 Postman 等更复杂 API 客户端一样多。...下面,我将向你展示如何进行每一种类型基本 CRUD 操作,再加上如何像 JWT 令牌一样进行需要认证 API 调用,使用我本地运行 MERN 用户注册应用来指向调用。...POST 示例 我将介绍第一个示例是 REST Client POST,因为用户应用程序中必须先注册才能进行其他任何操作(毕竟,这只是一个登录服务)。

    8.4K20

    Laravel中使用GuzzleHttp调用第三方服务API接口代码

    背景:用laravel进行分布式开发,自己写了一个业务系统,还写了一个用户中心和其他信息中心 现在需要做到前端只需要访问业务系统API接口也可以获取到其他服务上面的数据 找了很多资料,最后查到了Laravel...自带GuzzleHttp可以达到我需求 Guzzle中文文档: http://guzzle-cn.readthedocs.io/zh_CN/latest/index.html 引入安装 composer.json...文件“require”项中加入 “guzzlehttp/guzzle”: “^6.3”, 然后命令行执行composer install 项目中具体用法: 1、项目某个地方,我选择app/...post方法, 'Cookie'= 'XDEBUG_SESSION=PHPSTORM', 这一行加进去之后可以使用XDebug进行调试,但是真正用起来时候不需要在header里面加这一行了 如果是调用...GuzzleHttp调用第三方API接口了 以上这篇Laravel中使用GuzzleHttp调用第三方服务API接口代码就是小编分享给大家全部内容了,希望能给大家一个参考。

    2.8K21

    有道翻译API接口服务开通与使用Python进行接口调用实例演示,有道智云·AI开放平台

    有道翻译 API 接口服务开通与使用 Python 进行接口调用实例演示 第一章:服务开通 ① 有道智云·AI开放平台【注册】 ② 创建应用,获取【应用密钥和id】 ③ 创建实例,绑定应用 ④ 官方帮助文档...第二章:Python 调用接口实例演示 ① 源码展示 ② 要点讲解 ③ 效果展示 先来张效果图,然后来给大家展示我接口调用过程。...第一章:服务开通 我们官方注册,获取我们后续需要【应用密钥】和【应用id】。 ① 有道智云·AI开放平台【注册】 有道 api 接口调用官方网站:有道智云 进去注册个账号。...② 创建应用,获取【应用密钥和id】 创建应用获取应用密钥(API Key) 然后就可以看到应用密钥和应用 id 了,这两个是我们调用 api 所需要。...④ 官方帮助文档 有道 api 接口调用:官方帮助文档 有道老平台 第二章:Python 调用接口实例演示 ① 源码展示 import requests import time import

    3.2K20

    认证鉴权与API权限控制微服务架构设计与实现(三)

    引言: 本文系《认证鉴权与API权限控制微服务架构设计与实现》系列第三篇,本文重点讲解token以及API级别的鉴权。本文对涉及到大部分代码进行了分析,欢迎订阅本系列文章。 1....前文回顾 开始讲解这一篇文章之前,先对之前两篇文章进行回忆下。第一篇 《认证鉴权与API权限控制微服务架构设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型。...当然我们构建时候可能需要一些配置,当我们调用HttpSecurity对象方法时,实际上就是进行配置。...--- 参考 微服务API级权限技术架构 spring-security-oauth Spring-Security Docs 相关阅读 认证鉴权与API权限控制微服务架构设计与实现(一) 认证鉴权与...API权限控制微服务架构设计与实现(二)

    2.5K40

    认证鉴权与API权限控制微服务架构设计与实现(四)

    引言: 本文系《认证鉴权与API权限控制微服务架构设计与实现》系列完结篇,前面三篇已经将认证鉴权与API权限控制流程和主要细节讲解完。...前文回顾 首先还是照例对前文进行回顾。第一篇 认证鉴权与API权限控制微服务架构设计与实现(一)介绍了该项目的背景以及技术调研与最后选型。...第三篇认证鉴权与API权限控制微服务架构设计与实现(三)先介绍了资源服务器配置,以及其中涉及配置类,后面重点讲解了token以及API级别的鉴权。...为了适配当前新架构,采取方案就是对这些遗留服务操作APIAuth服务进行API级别的操作权限鉴定。...权限控制微服务架构设计与实现(一) 认证鉴权与API权限控制微服务架构设计与实现(二) 认证鉴权与API权限控制微服务架构设计与实现(三)

    1.8K80

    认证鉴权与API权限控制微服务架构设计与实现(一)

    引言: 本文系《认证鉴权与API权限控制微服务架构设计与实现》系列第一篇,本系列预计四篇文章讲解微服务下认证鉴权与API权限控制实现。 1....尤其当访问来源不只是浏览器,还包括其他服务调用时,单体应用架构鉴权方式就不是特别合适了。微服务架构下,要考虑外部应用接入场景、用户--服务鉴权、服务--服务鉴权等多种鉴权场景。...技术方案 这主要包括两方面需求:其一是认证与鉴权,对于请求用户身份授权以及合法性鉴权;其二是API级别的操作权限控制,这个第一点之后,当鉴定完用户身份合法之后,对于该用户某个具体请求是否具有该操作执行权限进行校验...总结 本文是《认证鉴权与API权限控制微服务架构设计与实现》系列文章总述,从遇到问题着手,介绍了项目的背景。通过调研现有的技术,并结合当前项目的实际,确定了技术选型。...最后对于系统最终实现进行展示。后面将从实现细节,讲解本系统实现。敬请期待后续文章。 ---- 参考 理解OAuth 2.0 微服务API级权限技术架构 微服务架构安全认证与鉴权

    3.2K60

    认证鉴权与API权限控制微服务架构设计与实现(二)

    引言: 本文系《认证鉴权与API权限控制微服务架构设计与实现》系列第二篇,本文重点讲解用户身份认证与token发放具体实现。...系统概览 在上一篇 《认证鉴权与API权限控制微服务架构设计与实现(一)》介绍了该项目的背景以及技术调研与最后选型,并且对于最终实现endpoint执行结果进行展示。...对系统架构虽然有提到,但是并未列出详细流程图。笔者应用场景中,Auth系统与网关进行结合。在网关出配置相应端点信息,如登录系统申请token授权,校验check_token等端点。...如果需要对该请求进行校验,会将该请求相关验证信息截取,以及API权限校验所需上下文信息(笔者项目对于一些操作进行权限前置验证,下一篇章会讲到),调用Auth系统,校验成功后进行路由转发。 ?...Docs 相关阅读 认证鉴权与API权限控制微服务架构设计与实现(一)

    1.7K40

    认证鉴权与API权限控制微服务架构设计与实现:升级

    概述 之前系列文章认证鉴权与API权限控制微服务架构设计与实现中,我们有四篇文章讲解了微服务下认证鉴权与API权限控制实现。...密码匹配(matches):用户登录时,密码匹配阶段并没有进行密码解密(因为密码经过Hash处理,是不可逆),而是使用相同算法把用户输入密码进行hash处理,得到密码hash值,然后将其与从数据库中查询到密码...关于怎么初始化密码呢,和注册用户时候怎么给密码加密,我们可以初始化密码时调用如下方法: 1SCryptPasswordEncoder sCryptPasswordEncoder = new SCryptPasswordEncoder...结果验证 经过如上升级改造,我们将验证如下API端点: password模式获取token:/oauth/token?...小结 OAuth鉴权服务是微服务架构一个基础服务,项目公开之后得到了好多同学关注,好多同学加入QQ群之后也提出了自己关于这方面的疑惑或者建议,一起讨论和解决疑惑地方。

    1K20

    Python 爬虫篇 - 调用有道翻译api接口翻译外文网站整篇西班牙文实战演示。爬取西班牙语文章调用有道翻译接口进行整篇翻译

    Python 调用有道翻译 api 接口翻译整篇西班牙文实战演示 第一章:翻译效果展示 ① 翻译文章示例一【阿尔卡拉门无海摩纳哥:“不到4万欧元,你就不能在这里租任何东西。”】...第二章:实现 ① 文章结构分析 我们可以看到文章标题是 class="ue-l-article__header-content" div 下 h1 里内容。 ?...正文内容 class="ue-l-article__body ue-c-article__body" div 下 p 元素里。 ?...实现过程,还有有道 api 配置过程可以看我这篇文章: Python 技术篇-有道翻译api接口调用详细讲解、实战演示,有道智云·AI开放平台 import requests import time.../api' # 有道api地址 input_text = "" # 翻译文本生成sign前进行处理 # 当文本长度小于等于20时,取文本 if(len(translate_text

    1.4K20

    C++核心准则T.69:模板内部,不要进行不受限制非成员函数调用

    ,不要进行不受限制非成员函数调用,除非你希望它成为一个定制点 Reason(原因) Provide only intended flexibility....存在三种主要方式让调用代码定制模板。...如果你想用依赖模板类型参数值t调用你自己帮助函数helper(t),将它放入::detail命名空间并用detail::helper(t)对调用进行限定;如果一个帮助函数处于t类型可以被触发命名空间...,不受限调用会成为一个定制点;这会引起意外调用非约束函数模板等问题。...模板同一个命名空间中,如果存在一个同名非成员函数,标记模板中针对传递受影响类型变量非成员函数不受限调用

    1.1K10

    AngularJS与服务器端MVC比较

    首先分离关注是架构设计一个基本原则,多层架构中:数据存储 服务层 API层和表现层各层之间应该最小依赖,服务层只需要知道在哪里存储数据,API只需要知道哪个服务被调用,而表现层主要是通过REST和API...多层之间只能单向依赖,比如API不能知道是谁调用它,它不能依赖于表现层。...(可见:干净架构) 真实情况下各层情况比较复杂,但是分离关注随着机器和设备(laptop, mobile, tablet, desktop)增加越发重要,后端应该只提供业务逻辑和数据。...API调用,并以简单JSON格式返回,服务器端负载降低了。...会制约前端开发者美工和创意方面的发挥。 下图是一张基于RESTful微服务和客户端MVC和服务器端MVC架构图: ?

    2K40

    认证鉴权与API权限控制微服务架构设计与实现:授权码模式

    引言: 之前系列文章《认证鉴权与API权限控制微服务架构设计与实现》,前面文章已经将认证鉴权与API权限控制流程和主要细节讲解完。由于有些同学想了解下授权码模式,本文特地补充讲解。...原来基础上,进行Spring-Securiy相关配置,允许用户进行表单登录: 同时需要把ResourceServerConfig中资源服务器中对于登出端口处理迁移到WebSecurityConfig...源码详解 AuthorizationServerTokenServices是授权服务器中进行token操作接口,提供了以下三个接口: 请注意,生成token都是与授权用户进行绑定。...生成token: 需要注意到,创建token过程中,会根据该授权用户去查询是否存在未过期access_token,有就直接返回,没有的话才会重新创建新access_token,同时也应该注意到是先创建...小结 本文主要讲了授权码模式,授权码模式需要用户登录之后进行授权才获取获取授权码,再携带授权码去向TokenEndpoint请求访问令牌,当然也可以在请求中设置response_token=token

    1.1K20
    领券