我有一个 Spring-Boot 应用程序,我也在其中启动了 gRPC 服务器/服务。servlet 和 gRPC 代码都将请求发送到一个公共对象来处理请求。当请求进来时,我想更新日志以显示唯一的“ID”,以便我可以通过系统跟踪请求。
在 Spring 方面,我设置了一个“过滤器”,它更新日志记录 MDC 以向日志请求添加一些数据(请参阅此示例)。这工作正常
在 gRPC 方面,我创建了一个“ServerInterceptor”并将其添加到服务中,而拦截器被调用,更新 MDC 的代码不会粘住,因此当请求通过 gRPC 服务时,我没有打印出 ID日志。我意识到这与我在一个线程中拦截调用并且它在另一个线程中由 gRPC 调度这一事实有关,我似乎无法弄清楚如何在执行工作的线程中拦截调用或添加 MDC 信息,以便将其正确传播到执行工作的线程。
我做了很多搜索,很惊讶没有找到这个问题/答案,我只能假设我的查询技巧缺乏:(
我对 gRPC 相当陌生,这是我正在编写的第一个拦截器。我已经尝试以几种不同的方式添加拦截器(通过 ServerInterceptors.intercept、BindableService instance.intercept)。
我看过LogNet 的 Spring Boot gRPC Starter,但我不确定这是否能解决问题。
这是我在拦截器类中添加的代码
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(final ServerCall<ReqT, RespT> call, final Metadata headers, final ServerCallHandler<ReqT, RespT> next) {
try {
final String mdcData = String.format("[requestID=%s]",
UUID.randomUUID().toString());
MDC.put(MDC_DATA_KEY, mdcData);
return next.startCall(call, headers);
} …Run Code Online (Sandbox Code Playgroud) 我已经看了一个星期了,却找不到任何对我有帮助的东西。我会成为先行者,我是AWS的新手,所以我确定一切都在脑海中浮现。
问题
我目前正在编写一个正在部署到Elastic Beanstalk的应用程序,该应用程序是用Spring Boot编写的,并公开了几个RESTful API,IT还通过gRPC公开了一些API。AWS Load Balancer的REST API没有问题(如预期的那样),但我似乎无法使其与gRPC一起使用。
我尝试过 的内容:
尽我所能解释的是,很多人说这是可能的,但是我错过了一些简单的东西,或者他们没有提供有关您需要在AWS中做什么才能使其正常工作的任何信息。
我确实尝试了以下简单的解决方案:设置“经典负载平衡器”,然后在gRPC端口上具有TCP的侦听器,但是当我尝试连接至该端口时,它显示“连接被拒绝”,这使我认为LB不是不能正常工作(打开该端口),但是一切都表明它是正确的,并且它正确地请求了REST请求。
我尝试使用新的负载平衡器,但遇到一些配置问题,我正在等待某人休假以帮助我解决问题。
Kubernetes
有人建议我使用Kubernetes(Amazon的EKS),但在此我仍然很熟练。这是可能的,如果有的话,还有指针吗?
提前致谢
load-balancing amazon-elastic-beanstalk grpc elastic-load-balancer
我有一个用于发布请求的处理程序,响应可能需要一段时间,所以我流式传输它。如果响应时间太长,我会收到 AsyncRequestTimeoutException ,我通过@ControllerAdvice处理程序处理该异常。问题是,一旦我收到该错误,下一个进入的连接在尝试连接时就会收到错误。
卷曲:
(52) 服务器的空回复
邮递员:
错误:套接字挂起
在服务器中,当连接进入时,我确实看到以下日志消息
2020-10-13 11:53:26.090 INFO 22536 --- [nio-8080-exec-7] o.a.catalina.connector.CoyoteAdapter : Encountered a non-recycled response and recycled it forcedly.
org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException: null
at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:525) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1364) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1072) ~[tomcat-embed-core-9.0.38.jar:9.0.38]
Run Code Online (Sandbox Code Playgroud)
查看 CoyoteAdapter,这似乎是一条信息性消息,并且没有迹象表明传入连接将不会被处理。
在获取AsyncRequestTimeoutException后,我需要做什么才能让 Spring Boot/Tomcat 正确处理下一个请求(注意:在某些情况下, AsyncRequestTimeoutException是预期的,所以我不关心这一点。我已经设置了spring. mvc.async.request-timeout到我想要的位置)。
我的系统是 Mac OSx,但在 Docker 容器中重复 ( openjdk:11-jre-slim )
Spring Boot:2.3.4.RELEASE(嵌入了 Tomcat 9.0.38)
仅使用spring-boot-starter-web使用 Spring Iniatlizr 创建
2020-10-13 11:53:26.090 INFO …Run Code Online (Sandbox Code Playgroud) 我已经使用这篇Baeldung 文章为我的 Spring 2.0.4 应用程序添加了 Actuator 支持。在第 4.4 节中,它谈到
健康指标的一个方便特性是我们可以将它们聚合为层次结构的一部分
但它没有讨论如何进行这种聚合。我也找不到有关如何执行此操作的任何文档。
问题 你们中有人知道有关创建此类聚合的教程、示例或其他文档吗?
更多信息
我的应用程序中有一个依赖于几个子组件的服务。只有当所有这些子组件都关闭时,才认为服务本身已关闭。只要有一个,那么服务就启动了。当前使用正常HealthIndicator机制,如果子组件之一关闭,则将服务器标记为关闭。
似乎我想使用CompositeHealthIndicator但不清楚如何在没有系统拾取的情况下创建子 HealthIndicators。该警告是,这些子组件的使用@Scheduled注释,我的理解是,为了使该工作类必须使用@Component注解(或类似),这将导致它被创建并吸入到应用程序运行状况。
澄清 我添加了执行器,健康 URL 如下所示:
{"status":"UP","details":{"MyServ1":{"status":"UP","details":{"Latency":...}},"MyServ2":{"status" :"UP","details":{"Latency":...}},"diskSpace":{"status":"UP","details":{"total":...,"free": ...,“临界点”:...}}}}
但是如果“MyServ1”或“MySrv2”关闭,则整体状态关闭,但我只希望在“diskSpace”关闭或“MyServ1”和“MyServ2”关闭时发生这种情况。
看起来这CompositeHealthIndicator将是合适的课程,目前尚不清楚我如何为其创建儿童健康指标(只需使用new)?
提前致谢
我有一个非常令人沮丧的 Terraform 问题,我对我的 terraform 脚本进行了一些更改,但在应用该计划时失败了。我经历了一堆阴谋,可能使情况变得更糟,因为我最终手动删除了一堆 AWS 资源来尝试解决这个问题。
所以现在我根本无法使用 Terraform(刷新、计划、销毁)都得到相同的错误。
我有一个 Fargate 服务列表,以及一组关联 Fargate 服务不同功能的地图,例如负载均衡器的“目标组”(我在下面提供了一些代码)。问题似乎是 Terraform 没有发现这些资源已被手动删除,或者因为它们不存在而不知何故变得混乱。此时,如果我运行刷新、计划或销毁,我会收到一个错误,指出特定列表为空,即使它不是(或不应该是)。
在失败的运行中,我在下面的列表中添加了一个新服务以及一个新的 url(参见下面的代码)
在这一点上,我会满足于破坏整个环境(这是我的开发环境),但是;理想情况下,我只想让系统正常工作,以便 Terraform 能够检测到更改并正常工作。
我已将我的 Terraform 脚本恢复到最后一个已知的良好版本。我已经在我们的临时环境中运行了好的版本,它运行良好。
MacOS 莫哈韦沙漠 10.14.6 (18G103)
Terraform v0.12.24。
- provider.archive v1.3.0
- provider.aws v2.57.0
- provider.random v2.2.1
- provider.template v2.1.2
Terraform 状态文件存储在 S3 存储桶中,并
terraform init --reconfigure已被调用。
我最初遇到类似的错误,但它位于不同的位置,经过几个小时的谷歌搜索和尝试(我没有写下来),我决定手动删除与有问题的代码(ALB、目标组)相关的 AWS 资源, 安全组)
不幸的是,我无法发布实际的脚本,因为它是私人的,但我已经发布了我认为相关的部分,但已编辑了一些信息。我提到这一点的原因是您可能会看到的任何语法类型错误都是由这种编辑引起的,正如我上面所说的,脚本在我们的登台环境中运行时可以正常工作。
在根目录中。在 Terraform 运行失败的情况下,我向service_names( edd = "edd") 列表添加了一个新名称(我添加为第一个元素)。在service_name_map_2_url我添加了新条目 ( edd = "edd") 作为最后一个条目。我不确定我以不同的“顺序”添加这些元素的事实是否是问题,尽管它确实不应该,因为我通过名称而不是索引访问地图 …
我希望这是一个简单的配置问题,但我似乎无法弄清楚它可能是什么。
设置
问题
我的应用程序启动正常并开始处理来自 Amazon SQS 的消息。一段时间后,我看到以下警告
2020-02-01 04:16:21.482 LogLevel=WARN 1 --- [ecutor-thread14] osjlDefaultMessageListenerContainer:计划的消费者数量已降至并发消费者限制以下,可能是由于任务被拒绝。检查你的线程池配置!由剩余消费者触发自动恢复。
上述警告被打印多次,最终我看到以下两条信息消息
2020-02-01 04:17:51.552 LogLevel=INFO 1 --- [ecutor-thread40] casjavamessaging.SQSMessageConsumer :关闭 ConsumerPrefetch 执行器
2020-02-01 04:18:06.640 LogLevel=INFO 1 --- [ecutor-thread40] com.amazon.sqs.javamessaging.SQSSession :关闭 SessionCallBackScheduler 执行程序
上述 2 条消息将显示多次,并且在某个时刻,SQS 不再消耗任何消息。我在日志中没有看到任何其他消息表明存在问题,但我没有从处理程序收到任何消息表明它们正在处理消息(我有 2 个~),并且我可以看到 AWS SQS 队列的消息数量不断增长,并且年龄。
~:当我有一个处理程序时,这个确切的代码工作正常,当我添加第二个处理程序时,这个问题就开始了。
配置/代码
我意识到的第一个“警告”是由ThreadPoolTaskExecutor的货币引起的,但我无法获得正常工作的配置。这是我当前的 JMS 配置,我尝试了各种级别的最大池大小,除了根据池大小迟早启动警告之外,没有任何实际影响
public ThreadPoolTaskExecutor asyncAppConsumerTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setThreadGroupName("asyncConsumerTaskExecutor");
taskExecutor.setThreadNamePrefix("asyncConsumerTaskExecutor-thread");
taskExecutor.setCorePoolSize(10);
// Allow the thread pool …Run Code Online (Sandbox Code Playgroud) spring amazon-sqs amazon-web-services spring-jms spring-cloud
spring ×3
spring-boot ×3
grpc ×2
amazon-sqs ×1
grpc-java ×1
java ×1
mdc ×1
slf4j ×1
spring-cloud ×1
spring-jms ×1
spring-mvc ×1
terraform ×1
tomcat ×1