2

我正在尝试使用 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) 中的控制器请求类列表

4

2 回答 2

1

我不清楚您的场景中流量流向哪个方向,但我认为您是在说 .NET 应用程序正在尝试调用 Java 应用程序。您使用的代码来自HttpClientFactory引入之前,并且比现在一般可能的代码有点笨拙。Steeltoe可以与 HttpClientFactory 一起使用以获得更好的整体体验。

如果您在应用程序配置中设置logging:loglevel:Steeltoe.Common.Discovery= , Steeltoe 有调试日志记录可用于确认服务查找的结果。true

你没有具体提到什么不起作用,但我猜你得到了 404,因为看起来你的代码会创建一个看起来像的请求路径https://fortuneService/api/fortunes/random/api/v1/classes

如果你在 .NET 中寻找类似 Feign 的东西,你可以试试DHaven.Faux

于 2020-05-21T16:04:19.447 回答
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;
        }
    }
}
于 2020-05-25T22:47:17.123 回答