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

续上篇,这篇我们来进一步探索 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 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序猿的双十一最佳攻略

讲个恐怖故事 一年一度虐汪“光棍节”又来了 小天拍拍&#xff08;不存在的&#xff09;胸脯告诉大家 这个节日 我陪你们 买买买&#xff01; 限时特惠专场 1 welcome 7天教你学会数学建模及Matlab编程 数学建模涉及的内容比较广泛&#xff0c;比如碎纸片问题中所涉及的图像识…

傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动

本篇教程探讨了HTML5如何实现音频可视化频谱跳动&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家HTML5CSS3从入门到精通 。<html>HTML5音频可视化频谱跳动代码* {margin: 0;padding: 0;}#canvas {display: block;background: linear-gradient(135deg,…

android websocket封装,Android WebSocket 方案选型OkHttp

目前Android WebSocket 框架 主要包括:SocketIOJava-WebSocketOkHttp WebSocket一开始我首选的是采用SocketIO方案&#xff0c;因为考虑该方案封装接口好&#xff0c;提供异步回调机制&#xff0c;但和后端同事沟通发现目前客户端的SocketIO不支持ws wss协议, 所以无奈只能放弃…

关于Word中审阅的一个问题!

前两天&#xff0c;在帮一个杂志撰稿的过程中&#xff0c;有一个关于Word审阅的问题。&#xff08;以下内容以Word2007为例&#xff09; 本身&#xff0c;审阅的应用不算困难。 我们可以为文章添加“批注”&#xff0c;或是你的上级对文章进行修改&#xff0c;他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的&#xff0c;所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题&#xff0c;还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导&#xff0c;所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述&#xff0c;早期的许多数学家&#xff0c;包括高斯&#xff0c;都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示&#xff1a;问&#xff1a;HonmToolBar是一款什么样的插件&#xff1f;答&#xff1a;HonmToolBar是一款高度自由化的插件&#xff0c;用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏&#xff0c;有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题&#xff1a;变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了&#xff0c;不过该系统目前仍旧属于内测阶段&#xff0c;短时间内仍难以迅速推广。另外也正是由于Android N正式…

唐骏的商业模式

唐骏曾把商业模式比作谈恋爱&#xff0c;其要抓住三个要点&#xff1a; 1、简单&#xff1a; 太多的环节很难让人接受&#xff0c;并且容易潜藏缺陷&#xff0c;一目了然最好不过&#xff01; 2、有创意&#xff1a; 一定要有自己独特的创意&#xff0c;一位跟随别人&#xff0…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性&#xff0c;成员变量&#xff0c;字段 def sayhi() #方法&#xff0c;动态属性 公有属性 在类中直接定义的属性&#xff0c;大家都可以用 私有属性 __两个下划线定义&#xff0c;外部不可以访问&#xff0c;内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能&#xff0c;审计日志可以方便地查看每次请求接口所耗的时间&#xff0c;能够帮助我们快速定位到某些性能有问题的接口。除此之外&#xff0c;审计日志信息还包含有每次调用接口时客户端请求的参数信息&#xff0c;…

我的老公是枚码农

前两天看到一篇写程序员的爆文&#xff0c;虽然略显夸张&#xff0c;但也着实有趣。忽然想到身边人也是一枚码农&#xff0c;浑身上下也是浓厚的码农气息&#xff0c;遂也胡乱写了几笔&#xff0c;博君一笑&#xff0c;为了方便起见&#xff0c;就称其为“码农哥”。 1 码农哥还…

如何修复硬盘坏道?

首先需要先确认硬盘的坏道是逻辑坏道还是物理坏道。 方法很简单&#xff0c;在电脑刚启动时按“F8”键&#xff0c;选择“Command Prompt only”进入DOS模式。这种方法的操作系统必须为Windows95/98&#xff0c;若为Windows2000/XP/2003&#xff0c;请使用DOS启动盘启动。然后执…

c++11 string u8_深入理解C++11:C++11新

一.数据对齐在了解为什么数据需要对齐之前&#xff0c;我们可以回顾一下打印结构体的大小这个C/C中的经典案例。先看代码&#xff1a;#include using namespace std;struct HowManyBytes{char a;int b;};int main(){cout<>endl;cout<>endl;cout<>endl;cout&l…

harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架

HarmonyOS开源至今已经一个多月&#xff0c;源码托管在国内知名开源平台码云上&#xff0c;https://gitee.com/openharmony 。我最感兴趣的就是JS 框架 ace_lite_jsfwk&#xff0c;从名字中可以看出来这是一个非常轻量级的框架&#xff0c;官方介绍说是“轻量级 JS 核心开发框架…

python公式_Python读取excel文件中带公式的值的实现

在进行excel文件读取的时候&#xff0c;我自己设置了部分直接从公式获取单元格的值 但是用之前的读取方法进行读取的时候&#xff0c;返回值为空 import os import xlrd from xlutils.copy import copy file_path os.path.abspath(os.path.dirname(__file__)) # 获取当前文件目…

.NET工资低?那肯定是你打开的方式不正确

点击上方蓝字关注我们因为工作的关系&#xff0c;本人总是会接触到一些刚踏入社会没多久的.NET开发小伙伴。尤其是年关将近&#xff0c;这时候想要跳槽的人特别多&#xff0c;所以收到一些小伙伴的迷茫求解。今天就拿其中一个来说&#xff0c;我们暂且称他为A同学吧。A同学是一…

10分钟读懂人工智能、机器学习到底有什么关系

文末彩蛋&#xff0c;错过哭一年。。。。 人工智能的浪潮正在席卷全球&#xff0c;诸多词汇时刻萦绕在我们耳边&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09;、机器学习&#xff08;Machine Learning&#xff09;。不少人对这些高频词汇的含义及其背后…

复制Oracle表的结构

概述&#xff1a; 复制表的结构(只复制表结构,源表名&#xff1a;b_Jkpt_Oaxt_Trafficaccident 新表名&#xff1a;Test_OAXT_TrafficAccident) Oralce语句: create table Test_OAXT_TrafficAccident as select * from b_Jkpt_Oaxt_Trafficaccident where 12

Web API实现微信公众平台开发-接收数据Post

介绍当普通微信用户向公众账号发消息时&#xff0c;微信服务器将POST消息的XML数据包到开发者填写的URL上。在微信用户和公众号产生交互的过程中&#xff0c;用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址&#xff0c;从而开发…