通过微服务传播错误的良好实践

2023-12-22

我们有一个微服务架构,我们正在讨论如何向客户端公开内部错误。

这是一个例子:

假设我们有 3 个服务,服务 A、B 和 C。 当客户端向公共服务 A 发送请求时,该服务向服务 B 发送请求,服务 B 向服务 C 发送请求(这是内部的,需要身份验证,但凭据像环境变量一样存储在内部,它们是不是由客户端发送)。

由于某种原因,B 和 C 之间的通信收到 401(可能是 422、403 或任何与客户端相关的错误),这意味着该请求未经授权。

Something like that:enter image description here

B和C之间的通信是内部的,用户不知道这些服务。我是否应该公开我们的内部结构并向客户端发送 401?既然这不是客户的错?我应该寄500吗?


最好避免显式暴露 500 状态,但在某些情况下这是必要的。用户使用您的系统而不是特定的服务,对他来说,里面有什么并不重要。内部系统实现可能会有所不同,但用户交互可以保持不变。

例如,A 是电子商务服务,B 是计费服务,C 是计费网关。用户通过A购买产品,A向B发送计费请求,B与C通信以执行交易。 B 和 C 之间的 401 可能出于不同的原因。如果只是内部配置问题(未更新密码、过期证书等),则这是内部系统错误,您需要告诉用户服务现在不可用或类似的信息,当然不要传递所有内部错误详细信息。在这种情况下,您可以使用 5xx 代码。也许服务 B 可以将请求放入某种队列并告诉服务 A 一切正常,您的请求将在稍后处理。但如果是因为用户尝试使用不良信用卡或没有足够的钱(未经授权的请求),A 需要显示正确的消息和 4xx 响应代码。

一般来说,服务公开资源,无论其背后有多少内部或外部服务、数据库、数据源等。也许 B 和 C 之间的 401 意味着 B 转到 D 服务(C 备用),而 A 服务根本不应该知道 401。因此,这取决于您需要向用户公开什么以及您需要如何处理不同的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过微服务传播错误的良好实践 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • Node.js 未处理的“错误”事件

    我编写了一个简单的代码并将其保存在文件 try js 中 var http require http var makeRequest function message var options host localhost port 8080
  • 从 iOS 应用程序内的 Junos Pulse 获取用户凭据

    我正在通过 Junos Pulse 在 iPad 中建立 VPN 连接 以进入我组织的 Intranet 谁能告诉我是否有任何 iOS api 或 SDK 可用于获取在 iOS 应用程序内的 Junos pulse 中输入的用户凭据 Jun
  • SSDT SQL Server 数据库项目中用于架构比较的命令行/API?

    在 Visual Studio 2012 中 我们有Schema Compare http msdn microsoft com en us library hh272690 28v vs 103 29 aspx in SSDT http
  • REST URI 和对象上的操作,可以进行评论、标记、评级等

    我正在为我的公司研究一种 Web API 看起来我们可能会实现一个 RESTful API 我现在已经阅读了几本关于此的书籍 O Reilly 的 RESTful Web 服务 似乎最有用 并为可以评论 标记和评级的对象提出了以下一组 UR
  • 自定义 HTTP 标头:命名约定

    我们的一些用户要求我们将与其帐户相关的数据包含在HTTP 标头我们向他们发送的请求 甚至是他们从我们的 API 获得的响应 添加自定义 HTTP 标头的一般约定是什么 naming format etc 另外 请随意发布您在网络上偶然发现的
  • 如何按角色限制对 Spring Data REST 投影的访问?

    在使用 Spring Data JPA 和 Spring Data REST 的应用程序中 假设您有一个如下所示的实体类 Entity public class Person Id GeneratedValue private int id
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 以下 Android HTTP 示例/教程 - 为网络活动实现异步任务的问题

    我正在尝试遵循有关发布 HTTP 数据的教程 但是由于 IO 线程上的网络活动 它强制关闭主线程 因此我尝试实现 AsyncTask 正如其他几个有用的 SO 用户所建议的那样 但是我已经屠宰了代码 整个辣酱玉米卷饼的力量就向我逼近了 ht
  • laravel - 使用请求类或输入类

    在宁静的控制器中 我应该使用哪个类来获取传递的变量 member gt email Input get email or member gt email Request get email 两种选择都适合我 但有什么区别 Input get
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • git 是否有任何静态接口?

    我一直在寻找一个宁静的 git api 但似乎没有找到 我得到的最接近的是 Github 的 api 来访问一些存储库信息 还有其他的实施吗 Orion Git API http wiki eclipse org Orion Server
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • 是否可以检测 http git 远程是智能还是愚蠢?

    我正在我的应用程序中实现一个选项来使用 depth 1制作 git repo 的最小功能克隆 我刚刚意识到愚蠢的 http 传输不支持 depth 我想自动检测 http 远程是愚蠢的还是聪明的 这样我就可以省略 depth与哑 http
  • 用于获取随机数动词的 RESTful Web 服务

    如果您创建一个可以返回随机数的 RESTful Web 服务 您应该使用什么动词 我个人的感觉是使用 POST 因为你每次都会创建一个新的随机数 但我听到了一些使用 GET 的令人信服的论据 因为你本质上是在获取随机数 GET也有被缓存的危
  • 使用 Swift(使用 SwiftJWT)和 REST API 连接到 Apple Store Connect - 失败并出现 401

    我正在尝试通过他们的 REST API 连接到 Apple Store Connect 虽然这在几天前有效 但我无法弄清楚为什么它停止工作 现在我无法通过身份验证 即我发出的服务器响应的每个请求都是 401 我是否遗漏了什么 我做什么 生成
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 流星图像、CSS、“普通”Web 服务

    我经常看到这个问题出现 如何在我的 Meteor 网站上放置图像 如何使用 Meteor 托管 标准 网页内容 我尝试添加一个 img src img myimage png 标签但没有图像显示 如何在 Meteor 站点上托管一些文件 将
  • 将 CURL 命令行转换为 VBA

    在 CURL 中 我可以使用这一行 curl data DataToBeSent https example com resource cgi 我正在努力将此类行转换为在 VBA 中使用 这是我到目前为止的尝试 Sub POST Metho

随机推荐

  • 从 spring 异常处理程序读取 httprequest 内容

    我正在使用 Spring 的 ExceptionHandler注释来捕获我的控制器中的异常 有些请求将 POST 数据作为写入请求正文的纯 XML 字符串 我想读取该数据以记录异常 问题是 当我在异常处理程序中请求输入流并尝试从中读取时 流
  • 无法将类型“System.Windows.Forms.Form”的对象转换为类型“Project.Form1”

    我有一个UserControl它使用了我的表单上可用的一些公共属性 位于表单的顶部Paint为此举办的活动UserControl 我参考了Parent控件的类型并将其转换为我的表单的类型 var parent Form1 Parent 但是
  • 将 2 列合并为一列 SQL

    我是 Postgres 的初学者 需要做这样的事情 我的 Postgres 查询输出有 2 列 我需要将这两者结合起来 如下所示 第 1 栏 A B C 第 2 栏 D D D 输出列 A B C D 第 1 列中的所有值和第 2 列中的不
  • 如何对数据框的对角线求和

    假设我有这个数据框 1 2 3 4 100 8 12 5 14 99 1 6 4 3 98 2 5 4 11 97 5 3 7 2 在上面的数据框中 这些值表示进行了多少次观察的计数 100 1 99 1 etc 在我的上下文中 对角线具有
  • 简化正则表达式

    我正在进行有关正则表达式的练习 但我真的不确定如何做到这一点 正则表达式为 a b a 我真的很不擅长 但我认为 a b 可以简化为 a b 但如果这是对的 那么比上一个 a 实际上只是一个重复 所以我认为整个表达式可以简化为 a b 这看
  • Python:FileNotFoundError [WinError 2] 系统找不到指定的文件,subprocess.py:1582

    详细错误消息 FileNotFoundError WinError 2 The system cannot find the file specified at AppData Local Programs Python Python39
  • 将HINTERNET连接移到程序之外

    这是我的代码的缩短版本 include
  • 错误:原因:无法在 E:\AndroidStudio\SDK 中找到哈希字符串“Google Inc.:Google APIs:23”的目标

    我有上述错误 但不知道为什么我仍然有它 我已经多次重新安装 API 23 并进行了谷歌搜索 我发现的唯一修复方法是重新安装 API 但问题仍然存在 有人有办法解决吗 apply plugin com android application
  • 如何将字符串转换为二进制

    嘿 是否有一个 dart 构建可以将字符串转换为二进制字符串 打印 a to Binary gt 0110 0001 或者您认为最好的方法是什么 您需要说出您需要哪种格式 字符串是 16 位整数的序列 在某些设置中 它们被解释为 UTF 1
  • 如何在 Mac OsX 10.7.3 上安装和运行 wkhtmltopdf 以在 PHP 应用程序中使用

    我编写了一个 PHP MySQL 应用程序 它利用 wkhtmltopdf 根据输入数据库的数据生成报告 客户要求我也安装它 以便在他拥有的 Mac 上独立运行 目前 使用 XAMMP 可以毫无困难地运行 PHP MySQL 部分 但在系统
  • 如何列出合并提交中已解决冲突的统计信息?

    在合并分支时 可能会发生冲突 我们应该解决冲突才能完成合并 我们如何才能仅列出合并中已解决冲突的统计信息 TL DR 答案 你试一试 分支在 git 中的成本为零 因此只需创建几个test merge source and test mer
  • 如何为具有可变停止次数的梯度制作 LESS mixin?

    我发现的所有渐变混合都只有固定数量的停止点 less 和 css 在使用逗号时的冲突使得变量停止不可能以同样的方式完成 我当前用于 2 路渐变的 mixin gradient origin left step 1 white step 2
  • 在powershell脚本中连续读取串口数据

    我正在尝试编写一个 powershell 脚本 该脚本将命令发送到串行设备 然后继续读取来自设备的数据 System IO Ports SerialPort GetPortNames Write Host Select Serial Por
  • Python Sphinx css 无法在 github 页面上运行

    我已经使用 Sphinx 为 Django 项目创建了文档 并复制了以下内容html执行后的文件夹make html命令进入docs 我的存储库文件夹并将其推送到 Github 之后我设置了这个docs 目录到Github Pages 现在
  • 使用预提交挂钩在提交之前修改文件

    我正在尝试编写一个预提交挂钩来修改代码中的一行 但我什至不知道从哪里开始 问题是 我有一个KEY public static final String APP KEY DELETE THE KEY BEFORE COMMIT 为了避免将 K
  • 使用 OSX Mavericks GHC 安装和构建 GHC

    为什么升级到 OSX Mavericks 后我的 GHC 7 6 3 无法工作 我花了很长时间才弄清楚如何使用 OSX 10 9 和 GHC 7 6 3 这里有一些提示可以帮助您重新构建 haskell 代码 Summary 下载命令行工具
  • Laravel:更新或创建关系?

    A user hasOne car users id name 1 Bob 2 Alice cars idMember color energy 1 blue 0 95 在 的里面User我有课 public function car re
  • 如何在Eclipse上的包中创建子包?

    我最近开始在 Eclipse 上为 Minecraft Bukkit 插件进行编码 并且进展顺利 最近 我一直在尝试将子包制作成包 但是如果我尝试新 gt 套餐 然后它使一个包与我的主包分开 我是初学者 所以请简单说明 还有什么我可以尝试的
  • 使用 Flask 运行计划时出现问题

    我需要在 Flask 应用程序上定期运行某个任务 我决定使用一个简单的库 Schedule https github com dbader schedule https github com dbader schedule 为此 我在与主应
  • 通过微服务传播错误的良好实践

    我们有一个微服务架构 我们正在讨论如何向客户端公开内部错误 这是一个例子 假设我们有 3 个服务 服务 A B 和 C 当客户端向公共服务 A 发送请求时 该服务向服务 B 发送请求 服务 B 向服务 C 发送请求 这是内部的 需要身份验证