使用 Tye 辅助开发 k8s 应用竟如此简单(三)
使用 Tye 輔助開發(fā) k8s 應(yīng)用竟如此簡單(一)
使用 Tye 輔助開發(fā) k8s 應(yīng)用竟如此簡單(二)
續(xù)上篇,這篇我們來進(jìn)一步探索 Tye 更多的使用方法。本篇我們來了解一下如何在 Tye 中如何對數(shù)據(jù)庫進(jìn)行鏈接。
Newbe.Claptrap 是一個用于輕松應(yīng)對并發(fā)問題的分布式開發(fā)框架。如果您是首次閱讀本系列文章。建議可以先從本文末尾的入門文章開始了解。
中間件鏈接
絕大多數(shù)服務(wù)都需要用到外部中間件來支持應(yīng)用程序的正常運行,通常來說,就包含有數(shù)據(jù)庫、緩存中間件、消息隊列和文件系統(tǒng)等等。
因此,在開發(fā)過程中需要在應(yīng)用程序中管理對這些中間件的鏈接字符串。
Tye 提供了一種方式以便更加容易的管理這些鏈接字符串。
使用 Tye 啟動 mongo
首先,我們使用 Tye 來啟動一個 mongo。
手動創(chuàng)建一個 tye.yml:
tye.yml| name: mongo-sample services:- name: mongoimage: mongoenv:- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalue: root- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalue: example- name: mongo-expressimage: mongo-expressbindings:- port: 8081containerPort: 8081protocol: httpenv:- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalue: root- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalue: example |
使用 tye run 便可以在本地啟動一個 mongo 并且在 http://localhost:8081 通過 ui 查看 mongo 中的數(shù)據(jù)情況:
實際上就是使用 Tye 控制 docker desktop 啟動 mongo。因此需要提前在本地安裝好 docker desktop,以便啟動。
當(dāng)然,這實際上和使用?docker-compose?沒有什么實質(zhì)性的區(qū)別。
創(chuàng)建應(yīng)用程序連接 mongo
下面,我們創(chuàng)建一個應(yīng)用,并且將應(yīng)用與 mongo 進(jìn)行連接。
創(chuàng)建測試引用,并安裝必要的包:
create-tye-mongo-test.sh| dotnet new sln -n TyeTest dotnet new webapi -n TyeTest dotnet sln ./TyeTest.sln add ./TyeTest/TyeTest.csproj dotnet add ./TyeTest/TyeTest.csproj package Microsoft.Tye.Extensions.Configuration --version 0.6.0-alpha.21070.5 dotnet add ./TyeTest/TyeTest.csproj package MongoDB.Driver |
進(jìn)入 Startup,向容器中注冊 MongoClient :
Startup.cs| // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) {services.AddControllers();services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "TyeTest", Version = "v1"}); });services.AddScoped(p =>{var config = p.GetRequiredService<IConfiguration>();var connectionString = config.GetConnectionString("mongo");Console.WriteLine(connectionString);var client = new MongoClient(connectionString);return client;}); } |
值得注意的是,這里使用了一個擴(kuò)展方法從?IConfiguration?中讀取 mongo 的連接字符串:
mongo?實際上就是定義在 tye 中的服務(wù)名稱。
GetConnectionString?是來自于?Microsoft.Tye.Extensions.Configuration?的擴(kuò)展方法
MongoClient?應(yīng)該全局單例還是?Scope?其實筆者也沒查過資料。實際項目開發(fā)者注意按照需求調(diào)整。
打開?WeatherForecastController,讓我們在每次接受請求時,都寫入一些數(shù)據(jù)到?mongo?中以驗證效果。
WeatherForecastController.cs| using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using MongoDB.Driver;namespace TyeTest.Controllers {[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;private readonly MongoClient _mongoClient;public WeatherForecastController(ILogger<WeatherForecastController> logger,MongoClient mongoClient){_logger = logger;_mongoClient = mongoClient;}[HttpGet]public IEnumerable<WeatherForecast> Get(){var rng = new Random();var result = Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = rng.Next(-20, 55),Summary = Summaries[rng.Next(Summaries.Length)]}).ToArray();var mongoCollection = _mongoClient.GetDatabase(nameof(WeatherForecast)).GetCollection<WeatherForecast>(nameof(WeatherForecast));mongoCollection.InsertMany(result);return result;}} } |
至此,測試引用就創(chuàng)建完畢了。預(yù)期的效果是,當(dāng)接受到請求時,就會想?mongo?中的?WeatherForecast?collection?寫入一些數(shù)據(jù)。可以通過 mongo express UI 進(jìn)行查看。
修改 tye.yml 以配置鏈接串
由于前面,我們是手動創(chuàng)建過了 tye.yml。因此,我們現(xiàn)在直接在原來的基礎(chǔ)上進(jìn)行修改,以便加入測試應(yīng)用。
首先,將之前創(chuàng)建好的 tye.yml 放置到?TyeTest.sln?的根目錄。
然后修改為如下形式:
tye.yml| name: mongo-sample services:- name: mongoimage: mongoenv:- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalue: root- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalue: examplebindings:- containerPort: 27017connectionString: 'mongodb://${host}:${port}'- name: mongo-expressimage: mongo-expressbindings:- port: 8081containerPort: 8081protocol: httpenv:- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalue: root- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalue: example- name: tyetestproject: TyeTest/TyeTest.csproj |
對比之前,一共有兩處修改:
增加了?tyetest?服務(wù)配置的節(jié)點,以便能夠啟動測試應(yīng)用
在?mongo?服務(wù)上增加了?bindings。這是?tye?中組織服務(wù)之間相互連接的一種方式。其中的?connectionString?便是其他服務(wù)連接?mongo?所使用的鏈接串。
修改完畢之后。使用?tye run?啟動應(yīng)用。
打開?swagger?頁面,并訪問 API,便可以在 mongo express 中查看到數(shù)據(jù)已經(jīng)成功完成了寫入:
查看效果之后可以使用?Ctrl+C?停止?tye?以移除相關(guān)容器。
最后,發(fā)到 K8S 里面試一下
這次的樣例,并不是直接使用?tye deploy?就可以完成了。
首先,通常來說,中間件在生成環(huán)境中不太可能是通過部署在容器中的方式而存在的。即便是使用容器部署,也不會每次 deploy 都希望重新部署。也就是說,通常是直接連接已有的中間件就可以了。
其次,中間件連接字符串通常來說是以?secret?的形式存在在?k8s?中。故而不太可能在 tye 腳本中進(jìn)行指定。
故而,tye?僅僅會幫助開發(fā)者檢查需要部署的目標(biāo)集群中是否已經(jīng)存在符合要求的?secret。當(dāng)且僅當(dāng),目標(biāo)集群中存在符合要求的?secret?才能部署。
以本示例為例,需要在目標(biāo)集群中存在?binding-production-mongo-secret?對應(yīng)的?secret?才能都實現(xiàn)使用?tye?進(jìn)行部署。
具體的名稱約定規(guī)則,可以參照如下內(nèi)容:
https://github.com/dotnet/tye/blob/master/docs/reference/deployment.md#validate-secrets
小結(jié)
本篇,我們已經(jīng)順利完成了使用 Tye 來完成應(yīng)用與中間件之間的鏈接配置。
不過還遺留一些問題沒有細(xì)說:
如果一個中間存在多個綁定該如何處理
https 綁定該如何處理
詳細(xì)這些內(nèi)容,請移步官方文檔進(jìn)行查看:
https://github.com/dotnet/tye/blob/master/docs/reference/service_discovery.md
下一篇,我們將進(jìn)一步在 Tye 中實現(xiàn)對紛繁復(fù)雜的日志進(jìn)行統(tǒng)一管理。
總結(jié)
以上是生活随笔為你收集整理的使用 Tye 辅助开发 k8s 应用竟如此简单(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#如何识别一张图片的格式
- 下一篇: C# Lambda表达式详解,及Lamb