使用 Tye 辅助开发 k8s 应用竟如此简单(三)
续上篇,这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中如何对数据库进行链接。
中间件链接
绝大多数服务都需要用到外部中间件来支持应用程序的正常运行,通常来说,就包含有数据库、缓存中间件、消息队列和文件系统等等。
因此,在开发过程中需要在应用程序中管理对这些中间件的链接字符串。
Tye 提供了一种方式以便更加容易的管理这些链接字符串。
使用 Tye 启动 mongo
首先,我们使用 Tye 来启动一个 mongo。
手动创建一个 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 中的数据情况:

实际上就是使用 Tye 控制 docker desktop 启动 mongo。因此需要提前在本地安装好 docker desktop,以便启动。
当然,这实际上和使用 docker-compose 没有什么实质性的区别。
创建应用程序连接 mongo
下面,我们创建一个应用,并且将应用与 mongo 进行连接。
创建测试应用,并安装必要的包:
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 :
// 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 中以验证效果。
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 进行查看。