当前位置: 首页 > 知识库问答 >
问题:

如何用Resilience4j断路器装饰外部依赖项中的服务方法(特别是在spring cloud config服务器上)?

施彦
2023-03-14

EnvironmentController类是一个Spring

我在circuitbreaker中看到了用于修饰调用、函数等的方法,但似乎没有一个适用于此。(我对Resilience4j是完全陌生的,所以我希望我没有找到一个简单的解决方案。)

共有1个答案

田兴旺
2023-03-14

一种常见的方法(不仅用于Resilience4J,而且通常用于Spring)是使用BeanPostProcessor(您可以在这里看到一个不相关的示例)。

然后,在beanPostProcessor中,您可以获得EnvironmentController的句柄,并用Resilience4JCicrcuitBreaking逻辑环绕其实现/方法。

基本上,这种方法类似于:

    null

如果这还不能完全清楚,我可以添加一些示例代码来让您开始,只要让我知道就行了。请记住,这可能只是解决这个问题的许多方法之一。

编辑:

有些代码(不确定它是否有效,没有经过测试,spring-boot在MVC映射autoconfig中使用了大量AOP是出了名的烦人,因此您可能不得不使用方面或代理配置)看起来像(请记住,为了后代,我会使用lombok来避免所有的样板):

@Configuration
@Slf4j
public class MyConfig {

    // or however the heck you get your breaker config
    private final CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().build();
    private final CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.of(circuitBreakerConfig);
    private final CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("suchBreakerMuchWow");

    @Bean
    public CircuitBreakerAwarePostProcessor circuitBreakerAwarePostProcessor() {
        return new CircuitBreakerAwarePostProcessor();
    }

    public class CircuitBreakerAwarePostProcessor implements BeanPostProcessor {

        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof EnvironmentController) {
                return new CircuitBreakerFriendlyEnvironmentController((EnvironmentController) bean);
            }
            return bean;
        }
    }

    private interface Exclude {
        Environment labelled (String name, String profiles, String label);
    }

    @RequiredArgsConstructor
    private class CircuitBreakerFriendlyEnvironmentController implements Exclude {

        @Delegate(types = EnvironmentController.class, excludes = Exclude.class)
        @NonNull private final EnvironmentController environmentController;

        @Override
        public Environment labelled(String name, String profiles, String label) {
            return circuitBreaker.executeSupplier(() -> {
                log.info("such wow");
                return environmentController.labelled(name, profiles, label);
            });
        }
    }
}
 类似资料:
  • 外部服务器通常封装了外部数据封装器(foreign-data wrapper)用来访问一个外部数据源所需的连接信息。在主窗口中,点击 “其他”->“外部服务器”来打开外部服务器的对象列表。 若要访问外部 PostgreSQL 服务器的数据,你可以安装 postgres_fdw 扩展。右击外部服务器对象列表的任意位置并选择“安装 postgres_fdw 扩展”。 外部服务器设计器 “外部服务器设计

  • 外部服务器通常封装了外部数据封装器(foreign-data wrapper)用来访问一个外部数据源所需的连接信息。在主窗口中,点击 “其他”-> “外部服务器”来打开外部服务器的对象列表。 若要访问外部 PostgreSQL 服务器的数据,你可以安装 postgres_fdw 扩展。按住 Control 键并点按外部服务器对象列表的任意位置,然后选择“安装 postgres_fdw 扩展”。 外

  • 外部服务器通常封装了外部数据封装器(foreign-data wrapper)用来访问一个外部数据源所需的连接信息。在主窗口中,点击 “其他”->“外部服务器”来打开外部服务器的对象列表。 若要访问外部 PostgreSQL 服务器的数据,你可以安装 postgres_fdw 扩展。右击外部服务器对象列表的任意位置并选择“安装 postgres_fdw 扩展”。 外部服务器设计器 “外部服务器设计

  • 我们在产品中使用Spring引导微服务,我们有多达10个应用程序。为了记录,我们使用Log4j MDC来生成事务标识,并使用拦截器和过滤器将其传递给服务[超文本传输协议标头]。问题是我们必须在我们所有的应用程序(比如10个)中添加拦截器和过滤器来跟踪这个事务。有没有办法在我们的微服务应用程序中创建jar并注入。 我们能否在所有应用程序中使用最少的代码更改来实现这一点?

  • 我知道如果我们想在外部服务器上部署Spring boot Web应用程序,我们应该排除嵌入式服务器,但如果我们不这样做会发生什么?假设我在jboss外部服务器上部署Spring boot war,但我没有排除tomcat服务器?在这种情况下,Spring boot使用jboss外部服务器,还是仍然使用嵌入式tomcat服务器?

  • 我使用Swagger生成了JAX-RS服务器代码,该代码使用以下命令运行: 现在,服务器的目的之一是在ElasticSearch中索引POST请求。但是,在pom中添加弹性搜索高级rest客户端会使服务器在启动时中断。请参阅底部的错误消息。 我还会在底部附上POM文件的内容。 底部附加的Maven依赖项树。 根据Joakim Erdfelt的建议,我尝试将javax-servlet更改为3.1版和