#spring #jhipster #resttemplate #netflix-ribbon
#spring #jhipster #resttemplate #netflix-лента
Вопрос:
Я новичок в Jhipster, и мне интересно, можно ли вручную вызвать микросервисы из кода шлюза, используя RestTemplate или что-то еще.
Моей первой идеей было вызвать сам шлюз… но я не уверен, что это хорошая идея. Моей второй идеей было попытаться вызвать службу по ее URL. Меня беспокоит то, что я не хочу жестко кодировать порт данного узла. Вместо этого я хочу использовать правильную балансировку нагрузки.
Я прочитал эту статью https://dzone.com/articles/spring-cloud-rest-client-with-netflix-ribbon-basic , но инъекция не удалась.
Я где-то еще читал, что теперь вам нужно вручную добавить объявление компонента
@LoadBalanced
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
Но теперь я борюсь с фактическим URI: что я должен указать в качестве корня? (xxxxx)
final HcpVersionedhcp hcpVersionedhcp =
restTemplate.exchange("http://xxxxx/api/user-data/byLogin/", UserData.class);
Единственная конфигурация, которая у меня есть в моем приложении gateway.yml — это
ribbon:
eureka:
enabled: true
Ответ №1:
«xxxxx» необходимо заменить именем вашей службы. Если ваш сервис «foo», вы должны написать http://foo/api/user...
.
Если вы используете JWT в качестве аутентификации, вам необходимо выполнить авторизацию с использованием пользователя a в JHipster или передать токен JWT из запроса, когда это возможно. Однако это не лучшая практика для аутентификации JWT, поэтому я бы посоветовал пойти по пути JHipster UAA. В нескольких словах у вас есть еще одна служба, отвечающая за аутентификацию и авторизацию. Чтобы получить доступ к вашей службе из другой службы, вы можете использовать @AuthorizedFeignClient
интерфейсы on, похожие на JPA.
Итак, вы определяете:
@AuthorizedFeignClient(name = "xxxx")
interface XxxClient {
@RequestMapping(value = "/api/some-entities/{id}")
SomeEntity getSomeEntityById(Long @Path("id") id);
}
И внедрить его в любой spring service / rest-контроллер следующим образом:
@Inject
private XxxClient xxxClient;
//...
public void someAction() {
//...
xxxClient.getEntityById(id);
//..
}
Которые внутренне реализуют потоки авторизации клиентов …
Комментарии:
1. Хорошо, кажется, это работает. Мне также пришлось добавить @EnableFeignClients, но все остальное работает.