共計(jì) 2933 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。
如何使用 Tye 輔助開(kāi)發(fā) k8s 應(yīng)用,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
Newbe.Claptrap 是一個(gè)用于輕松應(yīng)對(duì)并發(fā)問(wèn)題的分布式開(kāi)發(fā)框架。如果您是首次閱讀本系列文章。建議可以先從本文末尾的入門(mén)文章開(kāi)始了解。
服務(wù)發(fā)現(xiàn) – 微服務(wù)開(kāi)發(fā)不可缺少的部件
服務(wù)發(fā)現(xiàn),就是新注冊(cè)的這個(gè)服務(wù)模塊能夠及時(shí)的被其他調(diào)用者發(fā)現(xiàn)。不管是服務(wù)新增和服務(wù)刪減都能實(shí)現(xiàn)自動(dòng)發(fā)現(xiàn)。
我們?cè)谡{(diào)用微服務(wù)的過(guò)程中,假設(shè)在調(diào)用某個(gè) REST API 或者 Thrift API, 為了完成某次調(diào)用請(qǐng)求,代碼里面需要指定服務(wù)所在的 IP 地址和端口,在傳統(tǒng)的應(yīng)用中,網(wǎng)絡(luò)地址和端口是靜態(tài)的,一般不會(huì)改變,我們只需要把它們配到配置文件中,就可以通過(guò)讀取配置文件來(lái)完成調(diào)用。但是,在現(xiàn)代基于 Cloud 的微服務(wù)架構(gòu)中,這種方式將失效,因?yàn)榉?wù)的實(shí)例是動(dòng)態(tài)分配的地址,網(wǎng)絡(luò)地址也是動(dòng)態(tài)的,這樣做的好處是便于服務(wù)的自動(dòng)伸縮,失敗處理和升級(jí).
簡(jiǎn)單來(lái)說(shuō),通過(guò)服務(wù)發(fā)現(xiàn),服務(wù)之間可以使用名稱(chēng)來(lái)代替具體的地址和端口甚至訪問(wèn)細(xì)節(jié)。這樣可以使得服務(wù)更加容易適用于云原生這種應(yīng)用程序?qū)嵗嘧兊沫h(huán)境。
首先,我們需要兩個(gè)服務(wù)
和前篇一樣,我們使用命令行來(lái)創(chuàng)建兩個(gè)服務(wù)。
dotnet new sln -n TyeTestdotnet new webapi -n TyeTestdotnet sln .\TyeTest.sln add .\TyeTest\TyeTest.csprojdotnet new webapi -n TyeTest2dotnet sln .\TyeTest.sln add .\TyeTest2\TyeTest2.csproj
然后使用 tye init 創(chuàng)建 tye.yml。
便可以在 tye.yml 中得到如下內(nèi)容:
name: tyetestservices: - name: tyetest project: TyeTest/TyeTest.csproj - name: tyetest2 project: TyeTest2/TyeTest2.csproj
這樣我們就可以在本地使用 tye run 啟動(dòng)著兩個(gè)服務(wù)。
接下來(lái),我們會(huì)改造其中的 TyeTest 服務(wù),使其調(diào)用 TyeTest2 作為其下游服務(wù)。
這樣我們便可以驗(yàn)證服務(wù)發(fā)現(xiàn)的效果。
然后,使用 Tye.Configuration 添加包
運(yùn)行以下命令,為 TyeTest 項(xiàng)目添加包:
dotnet add ./TyeTest/TyeTest.csproj package Microsoft.Tye.Extensions.Configuration --version 0.6.0-alpha.21070.5
添加 HttpClientFactory
由于我們需要使用 HttpClient 調(diào)用下游服務(wù),因此需要使用到 HttpClientFactory。故而,在 TyeTest 項(xiàng)目的 Startup.cs 增加對(duì) HttpClientFactory 的注冊(cè)。
public void ConfigureServices(IServiceCollection services) {+ services.AddHttpClient(); services.AddControllers(); services.AddSwaggerGen(c = { c.SwaggerDoc( v1 , new OpenApiInfo { Title = TyeTest , Version = v1 }); }); }
使用 HttpClient 調(diào)用服務(wù)
進(jìn)入 WeatherForecastController,我們使用 HttpClient 來(lái)調(diào)用下游服務(wù),并且將得到的數(shù)據(jù)返回:
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; } }}
值得注意的是:
構(gòu)造函數(shù)中注入的 IConfiguration 是 Aspnet Core 的內(nèi)在機(jī)制,無(wú)需特殊注冊(cè)。
_configuration.GetServiceUri(tyetest2) 是本示例的關(guān)鍵點(diǎn)。其通過(guò)一個(gè)服務(wù)名稱(chēng)來(lái)獲取服務(wù)的具體 Uri 地址,這樣便可以屏蔽部署時(shí),服務(wù)地址的細(xì)節(jié)。
這樣,就結(jié)束了。
接下來(lái)只要使用 tye run 便可以在本地查看已經(jīng)改造好的服務(wù)。調(diào)用第一個(gè)服務(wù)的接口,并可以得到預(yù)期的從第二個(gè)服務(wù)返回的數(shù)據(jù)。
最后,發(fā)到 K8S 里面試一下
若要發(fā)布到 k8s 進(jìn)行測(cè)試,只要按照前篇的內(nèi)容,設(shè)置到 docker registry 和 ingress 便可以進(jìn)行驗(yàn)證了。
開(kāi)發(fā)者可以自行配置并嘗試。
看完上述內(nèi)容,你們掌握如何使用 Tye 輔助開(kāi)發(fā) k8s 應(yīng)用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝各位的閱讀!