Конфигурация FeignClient в ASP.Net

Я пытаюсь создать микросервисы, используя Spring-boot Java и SteelToe ASP.NET.

Шаг 1: Я создал полный сервис с использованием Java (сервис с пользовательским интерфейсом и API. Он размещен на PCF). Внутри API определен ClassesControler.

Шаг 2. Создайте микросервис с помощью ASP.NET, SteelToe. Зарегистрируйте службу в Eureka и сделайте ее доступной для обнаружения с помощью Zuul.

Шаг 3. Используйте подход «Интерфейс, сервис» для доступа к микросервису (ам) JAVA.

namespace employee-client.Service
{
    public interface IRelayService
    {
        Task<HttpResponseMessage> getClassesList(string relativeUrl = "/api/v1/classes");
    }
}

Сервис с реализацией для интерфейса:

namespace employee-client.Service
{
    public class RelayService : IRelayService
    {
        DiscoveryHttpClientHandler _handler;
        string _accessToken;

        private const string BASE_URL = "https://www.example.com";

        public QortaService(IDiscoveryClient client, string accessToken)
        {
            _handler = new DiscoveryHttpClientHandler(client);
            _accessToken = accessToken;
        }

        public async Task<HttpResponseMessage> getClassesList(string relativeUrl)
        {
            string classesUrl= BASE_URL + relativeUrl;

            HttpClient client = GetClient();
            HttpRequestMessage request = new HttpRequestMessage();
            request.RequestUri = new Uri(classesUrl);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);

            return await client.SendAsync(request, HttpCompletionOption.ResponseContentRead);
        }

        private HttpClient GetClient()
        {
            var client = new HttpClient(_handler, false);
            return client;
        }
    }
}

Я придумал этот подход на основе примера в SteelToe, но я ненавижу жестко кодировать BASE_URL. Вопрос: Мне очень нравится подход к аннотации @FeignClient, используемый в Java. Любые идеи о том, как я могу лучше получить доступ к существующему микросервису. Если да, то пример был бы очень признателен

Изменить: я изменил вопрос, чтобы сделать его более понятным. Поток трафика идет от службы Java к службе .NET. Служба .NET запрашивает список классов из контроллера в службе JAVA (ClassesController.java)


person Jop.pop    schedule 20.05.2020    source источник


Ответы (2)


Мне неясно, в каком направлении движется трафик в вашем сценарии, но я думаю, вы говорите, что приложение .NET пытается вызвать приложение Java. Используемый вами код взят из предыдущего HttpClientFactory был введен и немного неуклюже, чем то, что возможно сейчас в целом. Steeltoe можно использовать с HttpClientFactory для улучшения общего опыта.

У Steeltoe есть журнал отладки, доступный для подтверждения результатов поиска службы, если вы установите logging:loglevel:Steeltoe.Common.Discovery = true в конфигурации вашего приложения.

Вы не упомянули конкретно, что не работает, но я предполагаю, что вы получаете 404, поскольку похоже, что ваш код создаст путь запроса, похожий на https://fortuneService/api/fortunes/random/api/v1/classes

Если вы ищете что-то вроде Feign в .NET, вы можете попробовать DHaven.Faux

person Tim    schedule 21.05.2020
comment
Я отредактировал свой вопрос. Надеюсь, это поможет лучше понять, что я собираюсь делать. К сожалению, DHaven.Faux не выглядит очень активным и не соответствует стандартам нашей организации. - person Jop.pop; 22.05.2020
comment
У SteelToe HttpClientFactory есть ответы. Спасибо - person Jop.pop; 26.05.2020

Для тех, кто ищет то же самое:

namespace employee-client.Service
{
    public class RelayService : IRelayService
    {
        private const string CLASSES_API_SERVICEID = "classes-api";
        IDiscoveryClient _discoveryClient;
        DiscoveryHttpClientHandler _handler;
        string _accessToken;

        public RelayService(IDiscoveryClient discoveryClient, string accessToken)
        {
            _discoveryClient = discoveryClient;
            _handler = new DiscoveryHttpClientHandler(client);
            _accessToken = accessToken;
        }

        public async Task<HttpResponseMessage> getClassesList()
        {
             var classesApiInstances = _discoveryClient.GetInstances(CLASSES_API_SERVICEID);
             Uri classesApiUri = classesApiInstances[0].Uri;
             string classesUrl= classesApiUri.AbsoluteUri + relativeUrl;

             HttpClient httpClient = GetClient();
             HttpRequestMessage request = new HttpRequestMessage();
             request.RequestUri = new Uri(classesUrl);
             request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);

             return await httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
        }

        private HttpClient GetClient()
        {
            var client = new HttpClient(_handler, false);
            return client;
        }
    }
}
person Jop.pop    schedule 25.05.2020