Я недавно написал небольшой проект, используя микросервисную архитектуру, конечно без openfeign и hystrix. В процессе использования можно сказать, что возникают частые проблемы, и решить возникшие проблемы непросто.
- Новая версия hystrix не работает.Прежде
всего обнаружено, что не работает фолбэк в процессе использования openfeign. Подумав, я проверил различные материалы, в большинстве из которых говорилось, что openfeign не включает hystrix по умолчанию. Необходимо установить
feign:
hystrix:
enabled: true
Но после настройки все равно не работает. Последнее, что следует учитывать, это изменение версии openfeign.Я использовал последнюю версию 3.0.3, а затем вернулся к версии 2.2.6.RELEASE, и она вернулась в норму.
Я не хочу жаловаться на обратную совместимость Spring Cloud локально здесь, после обновления версии некоторые библиотеки классов будут перемещены или удалены. Таким образом, вы можете ознакомиться с версией springcloud только на определенном этапе, а затем использовать ее в течение длительного времени.Даже если есть ошибки или серьезные дефекты, сложно легко обновиться до новой версии. С одной стороны, стоимость обучения высока, а с другой стороны, как проапгрейдить старые проекты. Напротив, .net core намного лучше.
2. Добавьте заголовок запроса токена к запросу openfeign.
Это относительно просто, просто настройте шаблон запроса openfeign.
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
var token = getToken();
requestTemplate.header("X-Token",getToken());
}
private String getToken(){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(servletRequestAttributes != null) {
HttpServletRequest request = servletRequestAttributes.getRequest();
if(request != null) {
return request.getHeader("X-Token");
}
}
return "";
}
}
Но в процессе реального использования обнаружилась четвертая проблема. Не удалось получить HttpServletRequest
3. RequestContextHolder.getRequestAttributes(); пусто
Распространенное объяснение в Интернете — добавить конфигурацию RequestContextListner
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
Однако это не яйцо, и увеличивать его бесполезно.
Наконец, в углу, я узнал, что это проблема стратегии изоляции hystrix после включения hystrix.
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
Решить эту проблему относительно просто, и это решение не рекомендуется правительством.Официальная рекомендация - настроить стратегию параллелизма. Вам нужно написать класс самостоятельно, позволить ему наследовать класс HystrixConcurrencyStrategy и переписать метод wrapCallable
. Ради экономии времени сначала поставьте проект «Начать», а потом попробуйте что-нибудь другое.
Справочная статья:
https://blog.csdn.net/amosjob/article/details/97400347