续上篇,这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中如何对数据库进行链接。

Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架。如果您是首次阅读本系列文章。建议可以先从本文末尾的入门文章开始了解。

中间件链接

绝大多数服务都需要用到外部中间件来支持应用程序的正常运行,通常来说,就包含有数据库、缓存中间件、消息队列和文件系统等等。

因此,在开发过程中需要在应用程序中管理对这些中间件的链接字符串。

Tye 提供了一种方式以便更加容易的管理这些链接字符串。

使用 Tye 启动 mongo

首先,我们使用 Tye 来启动一个 mongo。

手动创建一个 tye.yml:

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 进行连接。

创建测试应用,并安装必要的包:

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 中查看到数据已经成功完成了写入:

查看效果之后可以使用 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

------ 本文结束 ------

使用 Tye 辅助开发 k8s 应用竟如此简单(三)的更多相关文章

  1. 使用 Tye 辅助开发 k8s 应用竟如此简单(一)

    最近正巧在进行 Newbe.Claptrap 新版本的开发,其中使用到了 Tye 来辅助 k8s 应用的开发.该系列我们就来简单了解一下其用法. Newbe.Claptrap 是一个用于轻松应对并发问 ...

  2. 使用 Tye 辅助开发 k8s 应用竟如此简单(二)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中使用服务发现. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次阅读本系 ...

  3. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中如何进行日志的统一管理. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首 ...

  4. 使用 Tye 辅助开发 k8s 应用竟如此简单(五)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中实现对分布式链路追踪. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次 ...

  5. 使用 Tye 辅助开发 k8s 应用竟如此简单(六)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花. Newbe.Claptrap 是一个用于轻松应对并发问题 ...

  6. 使用 Tye 辅助开发 dotnet 应用程序

    newbe.pro 已经给我们写了系列文章介绍Tye 辅助开发k8s 应用: 使用 Tye 辅助开发 k8s 应用竟如此简单(一) 使用 Tye 辅助开发 k8s 应用竟如此简单(二) 使用 Tye ...

  7. WPF 辅助开发工具

    原文:WPF 辅助开发工具 以下介绍的工具均为免费版,有些是源代码开放,希望对大家有用. Kaxaml 轻量级XAML 编辑器,可以同时进行图像和XAML 代码的编辑.最终生成开发人员想要的XAML ...

  8. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd

    官方文档 只是支持win32, 不支持win64 所以很麻烦 民间高人,集中做了一堆辅助库,下载后,用python安装目录下的scripts中,pip和easy_install就可以安装了 pytho ...

  9. Android辅助开发工具合集

    https://github.com/389273716/android-skill-summary/blob/master/开发工具使用指南/辅助开发工具.md

随机推荐

  1. js部分知识整理,google浏览器的代码调试

    整理一些学过的js知识点,包括js中3个括号的含义,this的使用,递归,google浏览器的代码调试.Location的属性及常用方法,window对象常用方法,open方法等. js括号 在js中 ...

  2. Memcached 缓存系统简介

    memcached官网:http://memcached.org/ What is Memcached? Memcached是一个自由开源的,高性能,高并发,分布式内存对象缓存系统. Memcache ...

  3. dedecms织梦搜索页错乱的解决方法

    在使用DEDE程序所架设的网站时,使用搜索结果页展示的问题上,由于font样式飘红问题,导致页面错乱,今天来解决这个问题. 织梦程序的搜索结果原理很简单,利用font加入颜色样式赋予搜索结果,所以显示 ...

  4. Flink-v1.12官方网站翻译-P011-Concepts-Overview

    概念-概览 实践培训解释了作为Flink的API基础的有状态和及时流处理的基本概念,并提供了这些机制如何在应用中使用的例子.有状态的流处理是在数据管道和ETL的背景下介绍的,并在容错部分进一步发展.在 ...

  5. 【noi 2.6_4978】宠物小精灵之收服(DP)

    题意:小智有N个精灵球,皮卡丘有M的初始体力,有K个野生小精灵.要收服尽可能多的野生小精灵,并使皮卡丘的剩余体力最大. 解法:01背包问题,增多一维来存第二个条件.f[i][j][k]表示抓前i个野生 ...

  6. python try异常处理

    什么是异常 python异常捕获,在刚开始学的时候,经常会遇到两种报错信息:语法错误和执行的异常. 语法错误在执行的时候就会报错,同时控制端会告诉你错误所在的行: 但即便python程序语法是正确的, ...

  7. [备忘] DevOps 工具上的准备清单(不断补充中……)

    目录 概念 发展历程 工具清单 规划 概念 从字面上来看,"DevOps"一词是由英文 Development(开发)和 Operations (运维)组合而成,但它所代表的理念和 ...

  8. ES索引Index相关操作&ES数据类型、字符串类型text和keyword区别

    1.查看索引以及删除之前的测试索引 1. 查看索引以及索引数量信息 liqiang@root MINGW64 ~/Desktop $ curl -X GET http://127.0.0.1:9200 ...

  9. C++程序代码优化的方法

    1.选择合适的算法和数据结构 选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多.数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组 ...

  10. Leetcode(104)-二叉树的最大深度

    给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7], ...