Как создать динамический прокси уже прокси-класса весной

Я относительно новичок в весенне-весенних ботинках.

В настоящий момент я использую приложение Spring Boot Rest, которое предоставляет FeignClient для включения в другие проекты. Теперь я хочу, чтобы эти FeignClients были обернуты CircuitBreaker.

Лучшее решение, которое я придумал, заключается в том, что я динамически создаю прокси, который включает реализацию CircuitBreaker, которая сама вызывает созданный FeignClient.

Итак, предположим, что у меня есть следующий интерфейс, описывающий RestController:

@RequestMapping("/")
public interface MyWebService {

    @GetMapping("name")
    public String getName();
}

Теперь у меня есть интерфейс для FeignClient:

@FeignClient("app")
public interface WebServiceClient extends WebService {
}

Итак .. Моей целью было бы добиться чего-то вроде того, что у меня есть еще одна аннотация e. грамм. @WithCircuitBreaker, который затем будет сканироваться, и я буду динамически создавать прокси-компонент, который будет внедрен вместо bean-компонента FeignClient.

На данный момент мой код выглядит так:

@FeignClient("app")
@WithCircuitBreaker
public interface WebServiceClient extends WebService {
}

Насколько мне известно, теперь я могу создать класс @Configuration, который будет выглядеть так:

@Configuration
public class WithCircuitBreakerConfiguration implements ImportAware {

    private AnnotationMetadata annotationMetadata;
    private AnnotationAttributes annotationAttributes;

    @Override
    public void setImportMetadata(AnnotationMetadata importMetadata) {
        this.annotationMetadata = importMetadata;
        Map<String, Object> annotatedClasses = importMetadata.getAnnotationAttributes(WithCircuitBreaker.class.getName());
        this.annotationAttributes = AnnotationAttributes.fromMap(annotatedClasses);
    }

    What else to import to create the proxy and inject it?
}

Теперь я в той точке, которую не знаю, как продолжить. Как динамически создать прокси-класс, который делает что-то вроде этого:

public class PorxyedWebService {

    private WebService feignClientProxy;

    @Autowired
    public ProxyedWebService(WebService feignClientProxy) {
        this.feignClientProxy = feignClientProxy;
    }

    public String getName() {
        ...
        <some circuitbreaker stuff>
        ....
        return this.feignClientProxy.getName();
    }
}

а затем вернуть этот прокси вместо прокси, созданного из Feign, как только кто-то автоматически подключит интерфейс WebService.


person Michael    schedule 11.09.2019    source источник


Ответы (2)


Я не являюсь пользователем Spring, но знаю, что Spring не рекурсивно создает прокси, если, например, несколько аспектов Spring AOP применяются к одному и тому же объекту. Вместо этого дополнительные перехватчики (или сообщения на языке АОП) регистрируются на том же прокси. Я думаю, вы хотите использовать эту инфраструктуру для достижения своей цели.

person kriegaex    schedule 20.09.2019

Вы можете просто использовать стартер resilience4j Spring Boot2. Вы можете комбинировать аннотацию @CircuitBreaker с аннотацией @FeignClient на уровне интерфейса.

Затем вы можете использовать его следующим образом:

@FeignClient(name = DUMMY_FEIGN_CLIENT_NAME)
@CircuitBreaker(name = DUMMY_FEIGN_CLIENT_NAME)
public interface DummyFeignClient {

    String DUMMY_FEIGN_CLIENT_NAME = "dummyFeignClient";

    @GetMapping(path = "/api/{param}")
    void doSomething(@PathVariable(name = "param") String param);
} 

person Robert Winkler    schedule 25.09.2019