在ASP.Net中配置FeignClient

问题描述 投票:1回答:1

我正在尝试使用Spring-boot Java和SteelToe ASP.NET创建微服务。

步骤-1:我用Java创建了一个完整的服务(一个包含UI和API的服务,它被托管在PCF上)。API里面定义了ClassesControler。

第二步:使用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中使用的@FeignClient注解方法。有什么办法可以让我以更好的方式访问现有的微服务。如果有,请提供一个例子,谢谢

编辑:我修改了问题,使之更加清晰。流量是从Java服务到.NET服务的。.NET服务向JAVA服务中的控制器(ClassesController.java)请求一个类的列表。

asp.net microservices pivotal-cloud-foundry feign steeltoe
1个回答
0
投票

我不清楚在你的方案中,流量流向哪个方向,但我认为你说的是.NET应用程序正在尝试调用Java应用程序。你所使用的代码来自于之前 HttpClientFactory 的介绍,比现在一般的可能要笨拙一些。钢脚趾 可以与HttpClientFactory 以获得更好的整体体验。

Steeltoe有调试日志功能,如果您设置了 logging:loglevel:Steeltoe.Common.Discovery = true 在你的应用程序配置中。

你没有具体提到什么地方没有工作,但我猜你得到的是404,因为看起来你的代码会创建一个类似于 https://fortuneService/api/fortunes/random/api/v1/classes

如果你正在寻找类似于.NET中的Feign,你可以尝试一下。DHaven.Faux


0
投票

对于其他有相同需求的人来说。

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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.