前言

上一篇说了一下用HttpClientFactory实现了简单的熔断降级。

这篇就来简单说说用HttpClientFactory来实现服务发现。由于标题已经好明显的说了Steeltoe

因此这里会要求有Spring Clound的相关环境,本文也默认各位对这里有些许了解,所以不会涉及搭建过程的。

下面就开始正文了。

定义Service

这里的Service,其实可以比较简单的理解成对注册到Eureka的服务进行调用,然后进行后续处理。

public interface IMyService
{
Task<string> GetTextAsync();
} 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(HttpMethod.Get, MY_URL);
var responseMessage = await _httpClient.SendAsync(requestMessage);
var result = await responseMessage.Content.ReadAsStringAsync(); _logger.LogInformation("GetTextAsync: {0}", result);
return result;
}
}

在上面的Service中,都是常规的不能再常规的HttpClient的用法!似乎也没有看到任何和服务发现相关的东西呀。

确实,就上面的代码,完成不了服务发现,因为我们的主角,HttpClientFactory还没有出场!

先定义好这个Service,是因为我们这里要用另一种client方式(Typed Client)。

下面就去Startup进行相关的配置了。

在Startup进行配置

在进行配置之前,我们要先添加Steeltoe.Discovery.ClientCore的引用。

<PackageReference Include="Steeltoe.Discovery.ClientCore" Version="2.1.0-rc1" />

再按照Steeltoe的配置说明,在appsettings.json中添加下面的配置

{
"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"
}
}
}

最后就是在ConfigureServices方法里面进行操作了。

public void ConfigureServices(IServiceCollection services)
{
//服务发现客户端
services.AddDiscoveryClient(Configuration);
//服务发现的Handler
services.AddTransient<DiscoveryHttpMessageHandler>();
//HttpClient
services.AddHttpClient("my", c =>
{
c.BaseAddress = new Uri("http://bservicetest/api/values/");
})
.AddHttpMessageHandler<DiscoveryHttpMessageHandler>()
.AddTypedClient<IMyService, MyService>();
//2.1
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

这里注册HttpClient,涉及到了两个点。一个是Typed Client,另一个是outgoing request middleware

Typed Client 主要是AddTypedClient<IMyService, MyService>(),表明注册的这个HttpClient是给这个类型用的。

DiscoveryHttpMessageHandler表明,使用这个HttpClient的时候,会使用这个Handler.

另外,这里指定的BaseAddress是http://bservicetest/api/values/。

这个是已经注册到Eureka的另外一个测试服务,我们就是要发现它,然后从这个服务里面取到结果。

然后,自然就是控制器了。

Controller和日志使用

Controller就是很简单的了,不需要多说。

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// GET api/values/text
[HttpGet("text")]
public async Task<string> GetTextAsync([FromServices]Services.IMyService service)
{
return await service.GetTextAsync();
}
}

这里还加了一个日志,是为了方便发布后查看日志,所以添加了NLog来输出日志。

添加一个nlog.config,内容大致如下。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
throwConfigExceptions="true"> <!-- the targets to write to -->
<targets> <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}" />
</targets> <!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<logger name="*" minlevel="Info" writeTo="archive" />
<logger name="Microsoft.*" minlevel="Error" writeTo="archive" final="true" />
</rules>
</nlog>

然后在Program添一行使用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();
}

运行效果

发布之后,可以看到Eureka上面已经成功注册了我们的这个ClientTest服务

其中,上图两个箭头的地方就是我们用到的服务,CLIENTTEST就是我们刚才发布的。BSERVICETEST是另一个测试服务。

CLIENTTEST就是会调用BSERVICETEST这个测试服务拿数据。

下面请求看看效果。

从动图来看,是已经达到预期了,由于BSERVICETEST有两个实例,所以也可以看到上面的结果是,两个实例在随机返回结果。

最后看看日志

请求也确实是到了我们的BSERVICETEST,而不是直接通过这个service的直接地址去访问的。

总结

Outgoing request middleware这个功能对HttpClientFactoty来说,用途似乎不少,就看各位怎么发挥了。

Steeltoe团队似乎也在尝试将Hystrix以HttpClientFactoty的形式来调用。对比Polly,就个人而言,还是觉得Polly好用一点。

最后附上本文的示例代码

SteeltoeWithHttpClientFactory

HttpClientFactory与Steeltoe结合来完成服务发现的更多相关文章

  1. .NET Core微服务之基于Steeltoe使用Eureka实现服务注册与发现

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 =>  Steeltoe目录快速导航: 1. 基于Steeltoe使用Spring Cloud Eureka 2. 基于Steelt ...

  2. .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能

    首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...

  3. .NET Core HttpClientFactory+Consul实现服务发现

    前言 上篇文章.NET Core HttpClient+Consul实现服务发现提到过,HttpClient存在套接字延迟释放的问题,高并发情况导致端口号被耗尽引起服务器拒绝服务的问题.好在微软意识到 ...

  4. Ocelot中文文档-服务发现

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  5. asp.net core microservices 架构之eureka服务发现

    一 简介 微服务将需多的功能拆分为许多的轻量级的子应用,这些子应用相互调度.好处就是轻量级,完全符合了敏捷开发的精神.我们知道ut(单元测试),不仅仅提高我们的程序的健壮性,而且可以强制将类和方法的设 ...

  6. Ocelot(十一)- 服务发现

    Ocelot允许您指定服务发现提供程序,并使用它来查找Ocelot正在将请求转发给下游服务的主机和端口.目前,这仅在GlobalConfiguration部分中受支持,这意味着所有ReRoute将使用 ...

  7. ASP.NET Core结合Nacos来完成配置管理和服务发现

    目录 前言 Nacos的简介 启动Nacos 配置管理 服务发现 写在最后 前言 今年4月份的时候,和平台组的同事一起调研了一下Nacos,也就在那个时候写了.net core版本的非官方版的SDK. ...

  8. .net core使用ocelot---第七篇 服务发现

    简介 .net core使用ocelot---第一篇 简单使用   .net core使用ocelot---第二篇 身份验证使用  .net core使用ocelot---第三篇 日志记录  .net ...

  9. .NET Core HttpClient+Consul实现服务发现

    简介 随着.NET Core的不断发展与成熟,基于.NET Core实现微服务的解决方案也越来越多.这其中必然需要注册中心,Consul成为了.NET Core实现服务注册与发现的首选.类似的解决方案 ...

随机推荐

  1. Python3-Cookbook总结 - 第二章:字符串和文本

    第二章:字符串和文本 几乎所有有用的程序都会涉及到某些文本处理,不管是解析数据还是产生输出. 这一章将重点关注文本的操作处理,比如提取字符串,搜索,替换以及解析等. 大部分的问题都能简单的调用字符串的 ...

  2. 使用 Swoole 来加速 Laravel应用

    Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...

  3. Codeforces 938D. Buy a Ticket (最短路+建图)

    <题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...

  4. Android- APP 秒开

    Android- APP 秒开 1. 启动APP 时白屏或者黑屏 现象:当启动APP 时,会有一个白屏或者黑屏一闪而过,然后才会显示出主界面. 这是因为,我们新打开一个应用,系统会为这个应用创建一个进 ...

  5. iOS 轻击、触摸和手势的检测

    一.检测捏合手势( UIPinchGestureRecognizer):  //设定一个实例变量存储手指之间的其起始距离 @property (assign, nonatomic) CGFloat i ...

  6. Python数据处理PDF

    Python数据处理(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1h8a5-iUr4mF7cVujgTSGOA 提取码:6fsl 复制这段内容后打开百度网盘手机A ...

  7. 如何查找MySQL中查询慢的SQL语句(转载)

    转载自https://www.cnblogs.com/qmfsun/p/4844472.html 如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那 ...

  8. 面试题:int和Integer的区别

    java底层源码:  -128  127之间

  9. nginx 静态目录配置规则

    1.子目录匹配 如下配置 location / { root /data/www; } 访问http://127.0.0.1/时,配匹配/data/www 访问http://127.0.0.1/ima ...

  10. Java工作原理:JVM,内存回收及其他

    JAVA虚拟机系列文章 http://developer.51cto.com/art/201001/176550.htm Java语言引入了Java虚拟机,具有跨平台运行的功能,能够很好地适应各种We ...