大佬教程收集整理的这篇文章主要介绍了HttpClientFactory与Steeltoe结合来完成服务发现,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<h2 id="前言">前言
说了一下用HttpClientFactory实现了简单的熔断降级。
这篇就来简单说说用HttpClientFactory来实现服务发现。由于标题已经好明显的说了
因此这里会要求有Spring Clound的相关环境,本文也默认各位对这里有些许了解,所以不会涉及搭建过程的。
下面就开始正文了。
这里的service,其实可以比较简单的理解成对注册到Eureka的服务进行调用,然后进行后续处理。
public interface IMyservice { TaskGetTextAsync(); } public class Myservice : IMyservice
{
private readonly ILogger _logger;
private readonly httpClient _httpClient;
private const String MY_URL = "";public Myservice(httpClient httpClient,ILoggerFactory logFactory) { _logger = logFactory.CreateLogger<Myservice>(); _httpClient = httpClient; } public async Task<String> GetTextAsync() { httprequestmessage requestmessage = new httprequestmessage(httpR_317_11845@ethod.Get,MY_URL); var responsemessage = await _httpClient.SendAsync(requestmessagE); var result = await responsemessage.Content.ReadAsStringAsync(); _logger.LogInformation("GetTextAsync: {0}",result); return result; }@H_675_22@
}@H_675_22@
在上面的service中,都是常规的不能再常规的httpClient的用法!似乎也没有看到任何和服务发现相关的东西呀。
确实,就上面的代码,完成不了服务发现,因为我们的主角,httpClientFactory还没有出场!
先定义好这个service,是因为我们这里要用另一种client方式(Typed Client)。
下面就去Startup进行相关的配置了。
在进行配置之前,我们要先添加Steeltoe.Discovery.ClientCore的引用。
@H_675_22@
再按照Steeltoe的配置说明,在appsetTings.json@H_675_22@中添加下面的配置
{ "Logging": { "LogLevel": { "Default": "Information","Microsoft": "Error" } },"AllowedHosts": "*","spring": { "application": { "name": "clienttest" } },"eureka": { "client": { "serviceUrl": "http://192.168.1.133:7070/eureka/","shouldFetchRegistry": true,"ValidateCertificates": false },"instance": { "port": 7788,"instancEID": "192.168.1.116:7788","hostName": "192.168.1.116" } } }@H_675_22@
最后就是在Configureservices@H_675_22@方法里面进行操作了。
public void Configureservices(IserviceCollection services) { //服务发现客户端 services.AddDiscoveryClient(Configuration); //服务发现的Handler services.AddTransient(); //httpClient services.AddhttpClient("my",c => { c.baseAddress = new Uri("http://bserviCETest/api/values/"); }) .AddhttpmessageHandler () .AddTypedClient (); //2.1 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }@H_675_22@
这里注册httpClient,涉及到了两个点。一个是Typed Client,另一个是outgoing request middleware。
Typed Client 主要是AddTypedClient
DiscoveryhttpmessageHandler表明,使用这个httpClient的时候,会使用这个Handler.
另外,这里指定的BaseAddress是http://bserviCETest/api/values/。
这个是已经注册到Eureka的另外一个测试服务,我们就是要发现它,然后从这个服务里面取到结果。
然后,自然就是控制器了。
Controller就是很简单的了,不需要多说。
[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { // GET api/values/text [httpGet("text")] public async TaskGetTextAsync([Fromservices]services.IMyservice servicE) { return await service.GetTextAsync(); } }@H_675_22@
这里还加了一个日志,是为了方便发布后查看日志,所以添加了NLog来输出日志。
添加一个nlog.config@H_675_22@,内容大致如下。
http://www.nlog-project.org/scheR_317_11845@as/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLscheR_317_11845@a-instance" autoReload="true" throwConfigExceptions="true"> @H_675_22@<target xsi:type="File" name="archive" archiveEvery="Day" archiveFilename = "test-{########}.log" archivenumbering = "Date" archiveDateFormat = "yyyymMdd" maxArchiveFiles = "4" filename="logs/test.log" layout="${longdatE}|${level:uppercase=truE}|${logger}|${messagE}" />@H_675_22@
然后在Program@H_675_22@添一行使用NLog的代码。
public class Program { public static void Main(String[] args) { CreateWebHostBuilder(args).build().Run(); }public static IWebHostBuilder CreateWebHostBuilder(String[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .UseNLog();@H_675_22@
}@H_675_22@
发布之后,可以看到Eureka上面已经成功注册了我们的这个ClientTest服务
title="httpClientFactory与Steeltoe结合来完成服务发现" alt="httpClientFactory与Steeltoe结合来完成服务发现" src="https://cn.js-code.com/res/2019/02-08/23/85de9fbcc6d6da284eb201a3627a964c.png">
其中,上图两个箭头的地方就是我们用到的服务,CLIENTTEST就是我们刚才发布的。BserviCETEST是另一个测试服务。
CLIENTTEST就是会调用BserviCETEST这个测试服务拿数据。
下面请求看看效果。
title="httpClientFactory与Steeltoe结合来完成服务发现" alt="httpClientFactory与Steeltoe结合来完成服务发现" src="https://cn.js-code.com/res/2019/02-08/23/fa09580425f383bb1c49838af0d7df17.gif">
从动图来看,是已经达到预期了,由于BserviCETEST有两个实例,所以也可以看到上面的结果是,两个实例在随机返回结果。
最后看看日志
title="httpClientFactory与Steeltoe结合来完成服务发现" alt="httpClientFactory与Steeltoe结合来完成服务发现" src="https://cn.js-code.com/res/2019/02-08/23/df45a28b737251710299f5351ca991f0.png">
请求也确实是到了我们的BserviCETEST,而不是直接通过这个service的直接地址去访问的。
Outgoing request middleware这个功能对httpClientFactoty来说,用途似乎不少,就看各位怎么发挥了。
Steeltoe团队似乎也在尝试将HyStrix以httpClientFactoty的形式来调用。对比Polly,就个人而言,还是觉得Polly好用一点。
最后附上本文的示例代码
https://github.com/catcherwong/Demos/tree/master/src/SteeltoeWithhttpClientFactory">SteeltoeWithhttpClientFactory
以上是大佬教程为你收集整理的HttpClientFactory与Steeltoe结合来完成服务发现全部内容,希望文章能够帮你解决HttpClientFactory与Steeltoe结合来完成服务发现所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。