續上篇,這篇咱們來進一步探索 Tye 更多的使用方法。本篇咱們來了解一下如何在 Tye 中如何對數據庫進行連接。git
Newbe.Claptrap 是一個用於輕鬆應對併發問題的分佈式開發框架。若是您是首次閱讀本系列文章。建議能夠先從本文末尾的入門文章開始瞭解。github
絕大多數服務都須要用到外部中間件來支持應用程序的正常運行,一般來講,就包含有數據庫、緩存中間件、消息隊列和文件系統等等。web
所以,在開發過程當中須要在應用程序中管理對這些中間件的連接字符串。面試
Tye 提供了一種方式以便更加容易的管理這些連接字符串。mongodb
首先,咱們使用 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
實際上就是使用 Tye 控制 docker desktop 啓動 mongo。所以須要提早在本地安裝好 docker desktop,以便啓動。編程
固然,這實際上和使用 docker-compose
沒有什麼實質性的區別。
下面,咱們建立一個應用,而且將應用與 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 的鏈接字符串:
mongo
實際上就是定義在 tye 中的服務名稱。GetConnectionString
是來自於 Microsoft.Tye.Extensions.Configuration
的擴展方法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
放置到 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 |
對比以前,一共有兩處修改:
tyetest
服務配置的節點,以便可以啓動測試應用mongo
服務上增長了 bindings
。這是 tye
中組織服務之間相互鏈接的一種方式。其中的 connectionString
即是其餘服務鏈接 mongo
所使用的連接串。修改完畢以後。使用 tye run
啓動應用。
打開 swagger
頁面,並訪問 API,即可以在 mongo express 中查看到數據已經成功完成了寫入:
查看效果以後可使用 Ctrl
+C
中止 tye
以移除相關容器。
此次的樣例,並非直接使用 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://github.com/dotnet/tye/blob/master/docs/reference/service_discovery.md
下一篇,咱們將進一步在 Tye 中實現對紛繁複雜的日誌進行統一管理。
若是讀者對該內容感興趣,歡迎轉發、評論、收藏文章以及項目。
最近做者正在構建以 Actor 模式 和 事件溯源 爲理論基礎的一套服務端開發框架。但願爲開發者提供可以便於開發出 「分佈式」、「可水平擴展」、「可測試性高」 的應用系統 ——Newbe.Claptrap
本篇文章是該框架的一篇技術選文,屬於技術構成的一部分。
項目文檔庫:claptrap.newbe.pro
聯繫方式: QQ 羣 610394020
您還能夠查閱本系列的其餘選文:
理論入門篇
術語介紹篇
樣例實踐篇
開發工具篇
其餘番外篇
GitHub 項目地址:https://github.com/newbe36524/Newbe.Claptrap
Gitee 項目地址:https://gitee.com/yks/Newbe.Claptrap
您當前查看的是先行發佈於 www.newbe.pro 上的博客文章,實際開發文檔隨版本而迭代。若要查看最新的開發文檔,須要移步 claptrap.newbe.pro。