Swagger Codegen CLI Java 客户端每个实例一个访问令牌,不是线程安全的

问题描述 投票:0回答:1

我有openapi 3.0规范。 生成代码:

java -jar /usr/bin/swagger-codegen-cli-v3.jar generate -l java -i openapi_shop.yaml -o apishop -DhideGenerationTimestamp=true -c config_shop.json

如果现在在 1 个服务中我想调用该 api,我需要执行以下操作:

String accessToken = getUserAccessToken();
api.getApiClient().setAccessToken(accessToken);
Products response = api.productsGet();

但是正如您所看到的,如果 50 个用户同时开始 ping 该 api 会怎样?它最终会在那里混合访问令牌。 使用自动生成的客户端的正确方法是什么? 我看到有 2 个选项:

  1. 修改现有的自动生成代码,并在每个方法中将 token 作为参数,并将其简单地放在最后的 headers 中,如 json body

  2. 每次为每个用户的请求创建新实例(这听起来不太好)

也许我错过了什么?谢谢!

java swagger-codegen
1个回答
1
投票

建议为每个请求创建ApiClient。如果您重用底层使用的客户端实现(例如 webclient 实例),那么它对性能的影响并不那么显着

GitHub 存储库中的示例提到了此建议

建议在多线程环境中为每个线程创建一个 ApiClient 实例,以避免任何潜在问题。

https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/java/retrofit2rx

更新:我在这里用代码示例更详细地解释了它 - https://blog.ideaharbour.site/engineering/2024/03/16/how-to-relay-access-token-on-multi-threaded -openapi-generator-client/

© www.soinside.com 2019 - 2024. All rights reserved.