使用 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

------ 本文结束 ------
相关文章
相关标签/搜索