Я относительно новичок в весенне-весенних ботинках.
В настоящий момент я использую приложение 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
.