Конфигурация 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)
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.
Для тех, кто ищет то же самое:
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;
}
}
}