使用 Tye 輔助開發 k8s 應用竟如此簡單(三)

續上篇,這篇咱們來進一步探索 Tye 更多的使用方法。本篇咱們來了解一下如何在 Tye 中如何對數據庫進行連接。git

Newbe.Claptrap 是一個用於輕鬆應對併發問題的分佈式開發框架。若是您是首次閱讀本系列文章。建議能夠先從本文末尾的入門文章開始瞭解。github

中間件連接

絕大多數服務都須要用到外部中間件來支持應用程序的正常運行,一般來講,就包含有數據庫、緩存中間件、消息隊列和文件系統等等。web

所以,在開發過程當中須要在應用程序中管理對這些中間件的連接字符串。面試

Tye 提供了一種方式以便更加容易的管理這些連接字符串。mongodb

使用 Tye 啓動 mongo

首先,咱們使用 Tye 來啓動一個 mongo。docker

手動建立一個 tye.yml:typescript

tye.yml數據庫

name: mongo-sample services: - name: mongo image: mongo env: - name: ME_CONFIG_MONGODB_ADMINUSERNAME value: root - name: ME_CONFIG_MONGODB_ADMINPASSWORD value: example - name: mongo-express image: mongo-express bindings: - port: 8081 containerPort: 8081 protocol: http env: - name: ME_CONFIG_MONGODB_ADMINUSERNAME value: root - name: ME_CONFIG_MONGODB_ADMINPASSWORD value: example

使用 tye run 即可以在本地啓動一個 mongo 而且在 http://localhost:8081 經過 ui 查看 mongo 中的數據狀況:express

mongo express

實際上就是使用 Tye 控制 docker desktop 啓動 mongo。所以須要提早在本地安裝好 docker desktop,以便啓動。編程

固然,這實際上和使用 docker-compose 沒有什麼實質性的區別。

建立應用程序鏈接 mongo

下面,咱們建立一個應用,而且將應用與 mongo 進行鏈接。

建立測試應用,並安裝必要的包:

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

進入 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; }); }

值得注意的是,這裏使用了一個擴展方法從 IConfiguration 中讀取 mongo 的鏈接字符串:

  1. mongo 實際上就是定義在 tye 中的服務名稱。
  2. GetConnectionString 是來自於 Microsoft.Tye.Extensions.Configuration 的擴展方法
  3. MongoClient 應該全局單例仍是 Scope 其實筆者也沒查過資料。實際項目開發者注意按照需求調整。

打開 WeatherForecastController,讓咱們在每次接受請求時,都寫入一些數據到 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; } } }

至此,測試應用就建立完畢了。預期的效果是,當接受到請求時,就會向 mongo 中的 WeatherForecast collection 寫入一些數據。能夠經過 mongo express UI 進行查看。

修改 tye.yml 以配置連接串

因爲前面,咱們是手動建立過了 tye.yml。所以,咱們如今直接在原來的基礎上進行修改,以便加入測試應用。

首先,將以前建立好的 tye.yml 放置到 TyeTest.sln 的根目錄。

而後修改成以下形式:

tye.yml

name: mongo-sample services: - name: mongo image: mongo env: - name: ME_CONFIG_MONGODB_ADMINUSERNAME value: root - name: ME_CONFIG_MONGODB_ADMINPASSWORD value: example bindings: - containerPort: 27017 connectionString: 'mongodb://${host}:${port}' - name: mongo-express image: mongo-express bindings: - port: 8081 containerPort: 8081 protocol: http env: - name: ME_CONFIG_MONGODB_ADMINUSERNAME value: root - name: ME_CONFIG_MONGODB_ADMINPASSWORD value: example - name: tyetest project: TyeTest/TyeTest.csproj

對比以前,一共有兩處修改:

  1. 增長了 tyetest 服務配置的節點,以便可以啓動測試應用
  2. 在 mongo 服務上增長了 bindings。這是 tye 中組織服務之間相互鏈接的一種方式。其中的 connectionString 即是其餘服務鏈接 mongo 所使用的連接串。

修改完畢以後。使用 tye run 啓動應用。

打開 swagger 頁面,並訪問 API,即可以在 mongo express 中查看到數據已經成功完成了寫入:

mongo express 2

查看效果以後可使用 Ctrl+C 中止 tye 以移除相關容器。

最後,發到 K8S 裏面試一下

此次的樣例,並非直接使用 tye deploy 就能夠完成了。

首先,一般來講,中間件在生產環境中不太多是經過部署在容器中的方式而存在的。即使是使用容器部署,也不會每次 deploy 都但願從新部署。也就是說,一般是直接鏈接已有的中間件就能夠了。

其次,中間件鏈接字符串一般來講是以 secret 的形式存於 k8s 中。故而不太可能在 tye 腳本中進行指定。

故而,tye 僅僅會幫助開發者檢查須要部署的目標集羣中是否已經存在符合要求的 secret。當且僅當,目標集羣中存在符合要求的 secret 才能部署。

以本示例爲例,須要在目標集羣中存在 binding-production-mongo-secret 對應的 secret 才能都實現使用 tye 進行部署。

具體的名稱約定規則,能夠參照以下內容:

https://github.com/dotnet/tye/blob/master/docs/reference/deployment.md#validate-secrets

小結

本篇,咱們已經順利完成了使用 Tye 來完成應用與中間件之間的連接配置。

不過還遺留一些問題沒有細說:

  • 若是一箇中間存在多個綁定該如何處理
  • https 綁定該如何處理

詳細這些內容,請移步官方文檔進行查看:

https://github.com/dotnet/tye/blob/master/docs/reference/service_discovery.md

下一篇,咱們將進一步在 Tye 中實現對紛繁複雜的日誌進行統一管理。

最後可是最重要!

若是讀者對該內容感興趣,歡迎轉發、評論、收藏文章以及項目。

最近做者正在構建以 Actor 模式 和 事件溯源 爲理論基礎的一套服務端開發框架。但願爲開發者提供可以便於開發出 「分佈式」、「可水平擴展」、「可測試性高」 的應用系統 ——Newbe.Claptrap

本篇文章是該框架的一篇技術選文,屬於技術構成的一部分。

項目文檔庫:claptrap.newbe.pro

聯繫方式: QQ 羣 610394020

您還能夠查閱本系列的其餘選文:

理論入門篇

  1. Newbe.Claptrap - 一套以 「事件溯源」 和 「Actor 模式」 做爲基本理論的服務端開發框架

術語介紹篇

  1. Actor 模式
  2. 事件溯源(Event Sourcing)
  3. Claptrap
  4. Minion
  5. 事件 (Event)
  6. 狀態 (State)
  7. 狀態快照 (State Snapshot)
  8. Claptrap 設計圖 (Claptrap Design)
  9. Claptrap 工廠 (Claptrap Factory)
  10. Claptrap Identity
  11. Claptrap Box
  12. Claptrap 生命週期(Claptrap Lifetime Scope)
  13. 序列化(Serialization)
  14. 最小競爭資源 (Minimal Competing Resources)

樣例實踐篇

  1. 設計一個火車票銷售系統

開發工具篇

  1. 使用 Tye 輔助開發 k8s 應用竟如此簡單(一)
  2. 使用 Tye 輔助開發 k8s 應用竟如此簡單(二)
  3. 使用 Tye 輔助開發 k8s 應用竟如此簡單(三)
  4. 使用 Tye 輔助開發 k8s 應用竟如此簡單(四)
  5. 使用 Tye 輔助開發 k8s 應用竟如此簡單(五)
  6. 使用 Tye 輔助開發 k8s 應用竟如此簡單(六)

其餘番外篇

  1. 談反應式編程在服務端中的應用,數據庫操做優化,從 20 秒到 0.5 秒
  2. 談反應式編程在服務端中的應用,數據庫操做優化,提速 Upsert
  3. 十萬同時在線用戶,須要多少內存?——Newbe.Claptrap 框架水平擴展實驗
  4. docker-mcr 助您全速下載 dotnet 鏡像
  5. 十多位全球技術專家,爲你獻上近十個小時的.Net 微服務介紹
  6. 年輕的樵夫喲,你掉的是這個免費 8 核 4G 公網服務器,仍是這個隨時可用的 Docker 實驗平臺?
  7. 如何使用 dotTrace 來診斷 netcore 應用的性能問題
  8. 只要十步,你就能夠應用表達式樹來優化動態調用

GitHub 項目地址:https://github.com/newbe36524/Newbe.Claptrap

Gitee 項目地址:https://gitee.com/yks/Newbe.Claptrap

您當前查看的是先行發佈於 www.newbe.pro 上的博客文章,實際開發文檔隨版本而迭代。若要查看最新的開發文檔,須要移步 claptrap.newbe.pro

Newbe.Claptrap

------ 本文結束 ------
相關文章
相關標籤/搜索