麻雀虽小,五脏俱全

入职三年, 除了参与公司核心产品研发外,另外负责了一个2C的小项目:调用API拿到解析结果 & 计费。

项目最初是.NetCore 1.0-Preview+sqlite部署在IIS上,闲来没事,这个项目已经被我完全重写,在此记录一些自认为还比较切合项目实际且平衡成本的开发实践。

用例图如下:

改造历程

改造是个持续迭代的过程,期间深刻思考并应用了ASP.NET Core框架、TPL Dataflow、 Redis支撑消息队列、容器化、CI相关的知识点;
与此同时,为了适应更现代化的部署方式,项目历经单体程序-->容器化-->DockerCompose部署-->DockerSwarm部署。

当前部署图如下:

业务重写

业务1

核心业务: C端请求--->请求百度云API---->记录解析结果,并发布到Redis订阅, 我使用Actor模型来达成目的。
数据流图:

  1. TPL Dataflow 流水线组件应对高并发,低延迟场景 相当巴适

  2. HttpClientFactory的套路,你知多少?

业务2:

利用redis hash存储白名单租户的配额、记录配额消费,每次消费使用redis HINCRBY myhash field -1命令;
间隔30s将消费次数同步到sqlite.

  1. [同步租户白名单] ASP.NET Core+Quartz.Net实现web定时任务

  2. [C# Redis客户端] DotNetCore三大Redis客户端对比和使用心得

  3. [数据持久化] EFCore批量操作,你真的清楚吗?

业务3:认证和安全

解析结果以ASP.NET Core静态文件服务器的形式提供给Etl访问, 这里给这个静态文件服务器访问地址加上了基础身份验证;
项目后期添加了HTTPS证书、HTHS安全策略

  1. ASP.NET Core 实现基本认证

  2. 白话文解读HTTPS原理, 结合.NET Core聊一聊HTTPS应用方式

  3. HTTP Strict Transport Security (HSTS) in ASP.NET Core

技术改造

分布式

在早期以单体程序部署的瞬间(服务不可用)会有少量流量无法处理;更糟糕的情况下,迭代部署的这个版本有问题,上线后无法运作, 更多的流量没有得到处理。
引入Redis List数据结构实现了一个简易版的消息队列,解耦数据接收和 数据处理。

  1. ASP.Net Core结合Redis实践消息队列,从此放心安全迭代

  2. Quartz.NET对集群的支持

面向Linux的部署

底层的技术栈是ASP.NET Core,推动项目从windows平台迁移到Linux平台部署

1. ASP.NTE Core跨平台技术内幕

2. ASP.NET Core在Centos上的最小化部署实践

容器化部署

  1. Docker-compose是个好东西,越用越香

  2. 谁说docker-compose不能水平扩展容器、服务多实例?

  3. ASP.NET Core暴露端点对接Docker健康检查

  4. Gitlab CI/CD的实践

  5. 深度解读Docker Swarm

总结

重写是个演进的过程,引入了很多先进的轮子,也付诸了一些思考实践。
在写公号的过程中,偶尔会发现之前写的文章有勘误,所以这对「认知」而言,也是一个持续演进的过程。

这驾马车随着我的改造,已经最大化压缩公司成本,SLA越来越高,我也不知道这架马车什么时候会被公司战略放弃,但是只要还在,定会进化不止。

关注我们
更多干货及潮流技术

请关注Dotnet Plus公众号

“阅读全文,体验更佳”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[PAT乙级]1016 部分A+B

正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​。例如:给定 A3862767,D​A​​6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 2 个 6。 现给定 A、D​A​​…

java循环语句_java中循环语句

java中的循环语句主要包括while (){}语句,for(){}语句,do{}while()语句一、while语句:while语句的使用情况是不知道循环次数的是使用。格式:while(判断条件){循环体;}解读:当条件为真时,会执行循…

内存迟迟下不去,可能你就差一个GC.Collect

一:背景1. 讲故事我们有一家top级的淘品牌店铺,为了后续的加速计算,在程序启动的时候灌入她家的核心数据到内存中,灌入完成后内存高达100G,虽然云上的机器内存有256G,然被这么划掉一半看着还是有一点心疼的…

Mayor's posters POJ - 2528 (离散化+线段树)

题意: 在1~10000000这个区间中读取n个海报的区间信息,后面的海报会覆 盖前面的海报,问最后能看到几张海报.(本题是一道bug题下面会提) 题目: The citizens of Bytetown, AB, could not stand that the c…

[PAT乙级]1017 A除以B

本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 ABQR 成立。 输入格式: 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。 输出格式: 在一行中依次…

服务器程序的Xamarin-Java.Interop体验(一)

这几天需要写一个用到Java模块的程序,但是Java是不可能写的,这辈子都不可能写的,只能搞搞interop了。目前市面上已有的基本上是IKVM.NET和JNBridgePro,后者没太了解技术细节,前者看起来是只有单向的互操作(…

A Walk Through the Forest HDU - 1142(dijkstra+动态规划)

题目大意: 给你一个图,找最短路。但是有个非一般的的条件:如果a,b之间有路, 且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的 一条路。问满足这样的路径条数 有多少。。。 解题思路 : 1.…

[PAT乙级]1018 锤子剪刀布

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。 输入格式: 输入第 1 行给出正整数 …

java 开源控件_一些好用的开源控件

工作两年,一直都在做些编码方面的表面功夫,实现了很多很炫的功能,在此写下一些体验。有些比较小的dll文件我会发上来,如果是开源组织的代码我会把地址附上,毕竟人家是会更新的。大家还有什么好用的开源控件欢迎补充。一…

揭秘 .NET 5 和Java 互操作

早早的.NET团队就立下了.NET和Java互操作的flag,如果你去翻一翻dotnet/runtime库,丝毫看不出来仓库内在搞支持。xamarin/java.interop库一直有Mono和Java互操作的实现,那么100%的实现.NET和Java互操作就是它,这两篇文章就是和你一…

[PAT乙级]1019 数字黑洞

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174&…

Ice_cream's world I HDU - 2120(并查集判环)

题意:问给出的望塔之间的建造了围墙,将土地分成了几份 思路:用并查集判环,若有围墙相接的瞭望塔,有相同的父根,则存在环 ice_creams world is a rich country, it has many fertile lands. Today, the qu…

java 普通类获取session_如何在Java的普通类中获取Session以及request对象

展开全部你是指你的 web 项目中使用到一个工具性的类,它的e69da5e6ba9062616964757a686964616f31333337613865形参中没有 HttpRequest 或 HttpSession 参数?如果是这样的话,我们需要使用一个 ThreadLocal 变量,我们把当前 reques…

[PAT乙级]1020 月饼

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。 注意:销售时允许取出一部分库存。样例给出的情形是这样的&#…

java中的asList_Java Arrays.AsList原理及用法实例

java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意:一. 如果对集合使用增加或删除元素的操作将会报错如下代码:List l…

为什么顶尖高手,都是长期主义者?

点击蓝字关注,回复“职场进阶”获取职场进阶精品资料一份在当下这个浮躁的社会,很多人都认为“快”才是真理,“慢”就是原罪。大家都对一夜腾飞的故事津津乐道,却觉得坚守一生最终获得大成的故事不够性感。但事实是怎么样的呢&…

Invitation Cards POJ - 1511 SPFA(dijkstra+反向建图+邻接表(下标过大)+输入输出用stdio(iostream超时))

题目大意: 有编号1~P的站点, 有Q条公交车路线,公交车路线只从一个起点站直接 到达终点站,是单向的,每条路线有它自己的车费。有P个人早上从1出发 ,他们要到达每一个公交站点, 然后到…

Asp.Net Boilerplate微服务实战(一)概述

ABP目前分为两个主版本:原版ABP框架,以及新版本也就是大家通常说的AbpvNext,官方后将ABP原版本框架命名为Asp.Net Boilerplate,新版本ABPvNext称为ABP框架。为方便阅读,本系列将原版本ABP框架统一称为Asp.Net Boilerpl…

[PAT乙级]1022 D进制的A+B

输入两个非负 10 进制整数 A 和 B (≤2​30​​−1)&#xff0c;输出 AB 的 D (1<D≤10)进制数。 输入格式&#xff1a; 输入在一行中依次给出 3 个整数 A、B 和 D。 输出格式&#xff1a; 输出 AB 的 D 进制数。 输入样例&#xff1a; 123 456 8输出样例&#xff1a; 1…

Tree Recovery(二叉树递归遍历+求后序遍历模板)

题意&#xff1a;已知先序和中序&#xff0c;将后序求出来 Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her creati…