续上篇,这篇咱们来进一步探索 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。