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;
        }
    }
}