Как вручную вызвать микросервис из репозитория или службы JHIPSTER gateway

#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, но все остальное работает.