续上篇,这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中使用服务发现。

服务发现 - 微服务开发不可缺少的部件

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。《深入了解服务注册与发现》 https://zhuanlan.zhihu.com/p/161277955

我们在调用微服务的过程中, 假设在调用某个 REST API 或者 Thrift API, 为了完成某次调用请求, 代码里面需要指定服务所在的 IP 地址和端口, 在传统的应用中, 网络地址和端口是静态的,一般不会改变, 我们只需要把它们配到配置文件中, 就可以通过读取配置文件来完成调用.但是, 在现代基于 Cloud 的微服务架构中, 这种方式将失效, 因为服务的实例是动态分配的地址, 网络地址也是动态的, 这样做的好处是便于服务的自动伸缩, 失败处理和升级. 《微服务架构中的服务发现机制》 https://www.imooc.com/article/details/id/291255

简单来说,通过服务发现,服务之间可以使用名称来代替具体的地址和端口甚至访问细节。这样可以使得服务更加容易适用于云原生这种应用程序实例多变的环境。

首先,我们需要两个服务

和前篇一样,我们使用命令行来创建两个服务。

dotnet new sln -n TyeTest
dotnet new webapi -n TyeTest
dotnet sln .\TyeTest.sln add .\TyeTest\TyeTest.csproj
dotnet new webapi -n TyeTest2
dotnet sln .\TyeTest.sln add .\TyeTest2\TyeTest2.csproj

然后使用tye init创建tye.yml

便可以在 tye.yml 中得到如下内容:

name: tyetest
services:- name: tyetestproject: TyeTest/TyeTest.csproj- name: tyetest2project: TyeTest2/TyeTest2.csproj

这样我们就可以在本地使用tye run启动着两个服务。

接下来,我们会改造其中的 TyeTest 服务,使其调用 TyeTest2 作为其下游服务。

这样我们便可以验证服务发现的效果。

然后,使用 Tye.Configuration

添加包

运行以下命令,为 TyeTest 项目添加包:

dotnet add ./TyeTest/TyeTest.csproj package Microsoft.Tye.Extensions.Configuration --version 0.6.0-alpha.21070.5

添加 HttpClientFactory

由于我们需要使用 HttpClient 调用下游服务,因此需要使用到 HttpClientFactory。故而,在 TyeTest 项目的 Startup.cs 增加对 HttpClientFactory 的注册。

  public void ConfigureServices(IServiceCollection services){
+     services.AddHttpClient();services.AddControllers();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "TyeTest", Version = "v1" });});}

使用 HttpClient 调用服务

进入 WeatherForecastController, 我们使用 HttpClient 来调用下游服务,并且将得到的数据返回:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;namespace TyeTest.Controllers
{[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;private readonly IConfiguration _configuration;private readonly HttpClient _httpClient;public WeatherForecastController(ILogger<WeatherForecastController> logger,IConfiguration configuration,HttpClient httpClient){_logger = logger;_configuration = configuration;_httpClient = httpClient;}[HttpGet]public async Task<string> Get(){var serviceUri = _configuration.GetServiceUri("tyetest2");Console.WriteLine(serviceUri);var httpResponseMessage = await _httpClient.GetAsync($"{serviceUri}WeatherForecast");var json = await httpResponseMessage.Content.ReadAsStringAsync();return json;}}
}

值得注意的是:

  1. 构造函数中注入的IConfiguration是 Aspnet Core 的内在机制,无需特殊注册。

  2. _configuration.GetServiceUri("tyetest2")是本示例的关键点。其通过一个服务名称来获取服务的具体 Uri 地址,这样便可以屏蔽部署时,服务地址的细节。

这样,就结束了。

接下来只要使用tye run便可以在本地查看已经改造好的服务。调用第一个服务的接口,并可以得到预期的从第二个服务返回的数据。

关于 Tye 中服务发现的真实运作机制可以前往官方文库进行了解:https://github.com/dotnet/tye/blob/master/docs/reference/service_discovery.md#how-it-works-uris-in-development

最后,发到 K8S 里面试一下

若要发布到 k8s 进行测试,只要按照前篇的内容,设置到 docker registry 和 ingress 便可以进行验证了。

开发者可以自行配置并尝试。

小结

本篇,我们已经顺利完成了使用 Tye 来完成服务发现机制的使用。通过这种方式,我们便可以使用服务名对服务之间进行相互调用,从而屏蔽具体的部署细节,简化开发。

不过,在实际生产实际中,服务之间并非仅仅只有主机和端口两个信息。有时还需要进行用户名、密码和额外参数的设置。典型的就是对数据库连接字符串的管理。

下一篇,我们将进一步在 Tye 中如何对数据库进行链接。

本文作者:newbe36524

本文链接:https://www.newbe.pro/Newbe.Claptrap/Try-Tye-2/

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

使用 Tye 辅助开发 k8s 应用竟如此简单(二)相关推荐

  1. 使用 Tye 辅助开发 k8s 应用竟如此简单(五)

    使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye 辅助开发 k8s 应用竟如此简单(三) 使用 Tye 辅助开发 k8s 应用竟 ...

  2. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)

    使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye 辅助开发 k8s 应用竟如此简单(三) 续上篇,这篇我们来进一步探索 Tye ...

  3. 使用 Tye 辅助开发 k8s 应用竟如此简单(三)

    使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中如 ...

  4. 使用 Tye 辅助开发 k8s 应用竟如此简单(一)

    最近正巧在进行 Newbe.Claptrap 新版本的开发,其中使用到了 Tye 来辅助 k8s 应用的开发.该系列我们就来简单了解一下其用法. 安装 Tye 首先,确保已经正确安装了 netcore ...

  5. 使用 Tye 辅助开发 k8s 应用竟如此简单(六)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花. 巧了,巧了,真是巧了 今天正值 dapr 1.0 发布的 ...

  6. 使用 Tye 辅助开发 dotnet 应用程序

    newbe.pro 已经给我们写了系列文章介绍Tye 辅助开发k8s 应用: 使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye ...

  7. 70后游戏辅助开发程序猿的人生路(二)

    回到家乡省会后一个做通信设备代理商的朋友,通过社会关系结识了省移动公司管理设备采购招标的高层,和移动公司签署了3年供货合同.于是我就去他公司上班了,主要工作内容就是负责带领公司技术团队,在全省移动公司 ...

  8. 从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的

    整理 | 夕颜 出品 | AI科技大本营(ID:rgznai100) [导读]人工智能时代,机器学习已经渗透进每个领域,改变了这些领域的业务模式.技术架构以及方法论.随着深度学习技术近年来快速发展,高 ...

  9. 微软推出VS Code新特性,为TypeScript和JavaScript用户提供AI辅助开发功能

    除了开发人员非常喜欢的IntelliSense和代码完成之外,今年早些时候,微软还发布了IntelliCode,提供了一组AI辅助开发功能.VS Code团队现在宣布了一项新的实验性扩展,将Intel ...

最新文章

  1. java qq ui界面,java UI之QQ登录
  2. UI_UITableView_搭建
  3. pycharm 报错 IndentationError: unexpected unindent 解决办法
  4. MyBatis延迟加载和缓存(4)
  5. 使用jdk 自带的jarsigner 签名工具签名的apk 和android规范有区别
  6. 作为一个码农,必须知道的 Web 协议有哪些?
  7. c 获得java数据,获得jar中数据,获得jar数据,// example c
  8. MVC HtmlHelper扩展——实现分页功能
  9. 虚拟机中编译代码死机,加大内存解决
  10. 2020-08-18 每日一句
  11. C语言总结(一维数组、二维数组、字符数组和字符串)
  12. C. Make it Increasing
  13. OpenGL绘制旋转六面体并纹理贴图
  14. Magnet:即将随 Apache Spark 3.2 发布的高性能外部 Shuffle 服务
  15. 基于色彩恒常( color constancy)特性的Frankle-McCann Retinex图像增强
  16. 超详细解决office2016和visio2016同时安装出错问题
  17. 大学计算机实验六文件管理与磁盘恢复,做“文件管理与磁盘恢复”实验完成以下实验报告表并提交...
  18. Day23(CopyFile,InputStreamReader,OutputStreamWruiter,Buffered,BufferedInputStream,BufferedOutputStr)
  19. 2017年,我要怎么学前端
  20. OSChina 周二乱弹 ——喷子:我想追 @巴拉迪维

热门文章

  1. 暑假集训-8.06总结
  2. Python -bs4介绍
  3. 一 流程控制之if判断
  4. Android 4.X 系统加载 so 失败的原因分析
  5. C#中'??'符的使用
  6. VS2010插件之NuGet
  7. 计算机英语课程背景,专家讲座第十五讲:信息化背景下高质量大学英语课程建设与教学设计...
  8. Mac OS使用技巧十八:Safari碉堡功能之一制作Widget
  9. 初学者java学习计划_初学者:计划在Windows 7 Media Center中录制直播电视的时间
  10. java复合赋值运算符_Java 之复合赋值运算符