ASP.Net中的FeignClient配置
FeignClient configuration in ASP.Net
我正在尝试使用 Spring-boot Java 和 SteelToe ASP.NET
创建微服务
第 1 步:我使用 Java 创建了完整服务(具有 UI 和 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 进行硬编码。
问题:我非常喜欢 Java 中使用的 @FeignClient 注释方法。关于如何以更好的方式访问现有微服务的任何想法。如果是这样,将不胜感激
编辑:
我修改了问题以使其更清楚。
流量从 Java 服务流向 .NET 服务。 .NET 服务从 JAVA 服务 (ClassesController.java)
中的控制器请求 类 列表
我不清楚在您的方案中流量流向哪个方向,但我认为您是在说 .NET 应用程序正在尝试调用 Java 应用程序。您使用的代码来自 HttpClientFactory was introduced and is a bit clunkier than what's possible now in general. Steeltoe can be used with HttpClientFactory 之前的代码,以获得更好的整体体验。
如果您在应用程序配置中设置 logging:loglevel:Steeltoe.Common.Discovery
= true
,Steeltoe 有可用的调试日志记录来确认服务查找的结果。
你没有具体提到什么不起作用,但我猜你得到了 404,因为看起来你的代码将创建一个请求路径,看起来像 https://fortuneService/api/fortunes/random/api/v1/classes
如果您正在寻找 .NET 中的 Feign 之类的东西,您可以试试 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;
}
}
}
我正在尝试使用 Spring-boot Java 和 SteelToe ASP.NET
创建微服务第 1 步:我使用 Java 创建了完整服务(具有 UI 和 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 进行硬编码。 问题:我非常喜欢 Java 中使用的 @FeignClient 注释方法。关于如何以更好的方式访问现有微服务的任何想法。如果是这样,将不胜感激
编辑: 我修改了问题以使其更清楚。 流量从 Java 服务流向 .NET 服务。 .NET 服务从 JAVA 服务 (ClassesController.java)
中的控制器请求 类 列表我不清楚在您的方案中流量流向哪个方向,但我认为您是在说 .NET 应用程序正在尝试调用 Java 应用程序。您使用的代码来自 HttpClientFactory was introduced and is a bit clunkier than what's possible now in general. Steeltoe can be used with HttpClientFactory 之前的代码,以获得更好的整体体验。
如果您在应用程序配置中设置 logging:loglevel:Steeltoe.Common.Discovery
= true
,Steeltoe 有可用的调试日志记录来确认服务查找的结果。
你没有具体提到什么不起作用,但我猜你得到了 404,因为看起来你的代码将创建一个请求路径,看起来像 https://fortuneService/api/fortunes/random/api/v1/classes
如果您正在寻找 .NET 中的 Feign 之类的东西,您可以试试 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;
}
}
}