我正在尝试使用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)请求一个类的列表。
我不清楚在你的方案中,流量流向哪个方向,但我认为你说的是.NET应用程序正在尝试调用Java应用程序。你所使用的代码来自于之前 HttpClientFactory 的介绍,比现在一般的可能要笨拙一些。钢脚趾 可以与HttpClientFactory 以获得更好的整体体验。
Steeltoe有调试日志功能,如果您设置了 logging:loglevel:Steeltoe.Common.Discovery
= true
在你的应用程序配置中。
你没有具体提到什么地方没有工作,但我猜你得到的是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;
}
}
}