Web-Business-Application-Solution
项目地址 : https://github.com/kelin-xycs/Web-Business-Application-Solution
Web-Business-Application-Solution
大家好,这个项目的目的,是 为 企业应用 + 互联网商业应用 提供一个 开源 解决方案。
这个项目 设计 为 组件 方式。不搞大包大揽。按需引用 需要的模块 就行,就像组件一样。^ ^ 这样避免了 侵入性,铁板一块,难理解,难维护。
企业应用 + 互联网商业应用,要 解决 的 第一个问题是 Web 大规模 使用。
我简单的画了个 架构图:
我本来画了一个架构图的,但是又不知道怎么把图片贴进来,所以就文字描述一下了。如下:
架构
Web
缓存
数据库
这个架构里只有 水平伸缩。这样比较简单。当 访问量 增大时,水平扩展 Web层,缓存层 就行。 数据库的话,现在 分布式数据库 用的还不普遍。对于 单主机 的 数据库,扩展CPU 核心数,内存;使用SSD硬盘就行。 比如 SqlServer 2017,配置了 足够的 CPU 核心数,内存,SSD,在 大数据量 高并发 时 的 表现很好。
缓存层 的 使用方法,可谓 各家各派,各种方法方式。^ ^ 我的想法比较简单,就是 避免频繁的对数据库的读写。 具体的说,就是,在进行 业务运算和处理 时,把数据从数据库读取到 缓存,然后 运算处理。运算处理完成后,再把结果批量更新回数据库。运算过程中,对于数据的读写都是在缓存进行。 这样可以解决数据库成为瓶颈的问题。
这个架构,我把它叫做“3.5层架构”。因为 缓存层 算 0.5层 嘛。 ^ ^
上面是 架构。
下面我们说说 部署。我们希望做出一套 虚拟机(云服务器) + 容器编排 + 负载均衡 + Redis 来构建 Web 集群 的 解决方案。 有个网友提供了一套方案,可以参考: centos 下docker 一键部署php和tomcat环境 https://github.com/kingkoo1985/docker_lnmtp
接下来是 运维。根据 DevOps 的 理论,我再发展一下,就是: 开发 = 运维 。大家都是 开发人员,只不过这段时间我做 开发,你做 运维;下个月 我做 运维,你做 开发。 对不对? ^ ^ 这样就好玩了。
这套解决方案的 关键词 是 架构 部署 运维。
其实我不太赞同 微服务。但 SOA 倒是可能成为 趋势。因为 平台 与 平台 之间的 交互 应该会是一个 趋势。 微服务 的 第一个 课题 就是 实现 数据一致性。SOA 也需要 解决 这个问题。 但实际上,数据不一致 并不可怕,关键在于 清晰的 记录Log,及 提示出来, 让 用户 和 各方 能够清楚的看到 这一笔交易 是 失败 的,问题出在了哪里,接下来要怎么处理。 我们为此提供了一个 组件 SOALog。 SOALog 的功能就是 记录 Log 到 数据库 里。 见 https://github.com/kelin-xycs/SOALog 。 所以,在 调用服务失败 的时候,可以用 SOALog 记录 Log 到 数据库 里。 Log 记录到 数据库 的 优点 是 便于 查询 分析,还可以用 报表 呈现出来。 报表 也可以呈现给 用户和相关各方 看,作为问题处理追踪 的 一个 报表。 总的来说,这是一种 松耦合 乐观 的 数据一致性 解决方案。
在 服务 调用中,会 涉及 “熔断” “重试” 等概念。我写了一个 熔断 重试 的 例子,见 https://github.com/kelin-xycs/FusingAndReTrySample
这里想表达的一些理念是:
少搞一点 封装, 少搞一点 控制反转(Ioc), 少搞一点 AOP, 少搞一些 “声明式”。
不要隐藏太多代码,让 代码 回归 代码。
是 找回 80 年代 写 Basic 的 那种感觉 的 时候了。 ^ ^
负载均衡 方面,公有云可以使用 云 提供的 负载均衡 服务,比如 阿里云 的 弹性计算 负载均衡。 企业内部私有云,可以使用 Nginx。Nginx 是一个 反向代理服务器。可以实现 基于 Http 转发 的 负载均衡。 是一个 使用广泛,高效,稳定 的 负载均衡 服务器。 据说 使用 Nginx 可以 支持 每分钟 1 万笔 的 交易量。当然,也可能更多。 ^ ^
参考上文。 我觉得,我们可以用手头的一些技术,来 搭建 可靠的 “高并发 分布式 业务系统” 架构。 用于 企业应用 + 互联网应用。 手头 的 技术, 包括 RPC MQ 缓存(Redis) 网关。 可以 通过 集群 (负载均衡) 来 实现 水平伸缩, 以 满足 吞吐量 的 需求。 同步 服务 使用 RPC, 异步 服务 使用 MQ。
这个 架构 到 目前为止 看起来 很美好, 但 有一个 技术 难点 或者说 重点 是 热扩展。 实际上, 应用层 很 容易 实现 热扩展。 比如 , Http 可以使用 Nginx, MQ 可以使用 RabbitMQ 集群, 缓存 可以使用 Redis 集群。 而 网络层 的 热扩展 则 需要 一些 底层 的 技术 ,,或者说 专业 的 产品。 比如 F5 HAProxy LVS , 或者 阿里云 弹性计算。 不过 刚刚 看了一下资料, Nginx 也 支持 http tcp udp 的 负载均衡 了。 热扩展 的 问题 解决 了, 基本上 就 没什么 问题 了。 接下来 就是 整个架构 运作 流程 的 监控, 用 上文 《聚合支付系统演讲》 里 文章 最后的话说, 就是 “全链路监控”。 这个 部分 说白了 其实 就是 记录 Log 到 数据库,用 NLog 可以 实现。 现在有一款 性能监控 工具 Apache Sky Walking, 据说 “开箱即用”, 提供了 仪表盘,各种报表, 可以 来 分析 和 呈现 Log, 也就是 整个 系统 运作流程 监控。 要 使用 Apache Sky Walk 可能 要 实现 它 的 “探针”, 或者 使用 它 现成 的 “探针”,,,这跟 NLog 原理上 也是一样的。
O 了。
其实 我 还有 一套 架构, 叫做 “ 1 Binary ” 架构。 1 Binary 开箱即用。
怎么实现 扩展 呢 ? n Deploy
合起来 就是 1 Binary + n Deploy 。
顶多 再 加 一个 缓存层,
O 了 。
关于 ORM 和 数据操作, 我 比较 喜欢 一个 超轻量 的 Entity 库(Active Record) + Sql 查询 DataTable 。
一个 超轻量 的 Entity 库, 只需要 实现 将 单笔资料 映射 到 Entity 对象, 并 实现 单笔资料 的 增删改查 就行。 Sql 查询 DataTable 的 方式 会 很 灵活 高效, 直观, 简单明了。 ORM 的 缓存, 在 集群(负载均衡) 的 情况 下, 会 有点 鸡肋, 因为 服务器 的 缓存 之间 不能 达到 数据一致。 所以,在 集群(负载均衡) 的 情况 下, 缓存 通常 会采用 分布式缓存,如 Redis。 LinQ 的 数据查询筛选 功能, 可以说是 好东东, 在 业务逻辑 里, 有时候 需要对 少量资料 作 distinct group by order by sum 等 时, 会 很方便, 自己 写 循环 会 比较 麻烦。 但 LinQ 对于 2 个 超过 1000笔 资料 的 集合 join 时, 性能 会 变慢, 因为 LinQ 没有 索引 的 观念。 所以,对于 资料量 比较 大的 join, 或者说 广义 的 数据关系运算 ,, 交给 数据库 来 完成, 会比较好。 因为 这是 数据库 的 专业。 现在 硬盘 都是 SSD , 不用 怕 伤 硬盘 嘛 。 ^^
在 索引 和 临时索引 的 机制 下, 数据库 可以 轻松 的 完成 数据 查询 任务。 实际上, 真正 造成 数据库 负担 和 瓶颈 的, 是 大数据量 表 频繁 Insert 索引排序 。
排序 会 造成 很大 的 时间复杂度。 在 SSD 硬盘 普及 的 今天, 查询 是 健康操作。 说到这里, 我 产生 了 一个 小想法, 我 打算 写一个 对 DataTable 使用 Sql 来 进行 数据 查询 的 小 库 。 主要 是 支持 distinct goup by order by sum 。 还有 就是 上面说的 一个超轻量 的 Entity 库。
解决方案组件 和 参考资料 如下:
解决方案组件:
WebApiClient ,一款基于HttpClient封装,只需要定义c#接口并修饰相关特性,即可异步调用远程http接口的客户端库
https://github.com/dotnetcore/WebApiClient
MultiThreadFileScanner,一个 多线程 检索 文件内容 的 小程序
https://github.com/kelin-xycs/MultiThreadFileScanner
SOALog,为 SOA 架构 提供一种 松耦合 乐观 的 数据一致性 解决方案,说白了这个组件的功能就是 记录 Log 到 数据库 里,详细介绍 见 上文。
https://github.com/kelin-xycs/SOALoghttps://github.com/kelin-xycs/SOALog
FusingAndReTrySample, 熔断 重试 的 例子。
https://github.com/kelin-xycs/FusingAndReTrySample
阿里云弹性计算
https://www.aliyun.com/?utm_medium=text&utm_source=bdbrand&utm_campaign=bdbrand&utm_content=se_32492
centos 下docker 一键部署php和tomcat环境
https://github.com/kingkoo1985/docker_lnmtp
参考资料:
《后端架构师技术图谱》
https://github.com/xingshaocheng/architect-awesome
日访问量百亿级的应用如何做缓存架构设计
DevOps老司机如何兼顾运维与开发?(附脑图)
蚂蚁金服CTO程立:金融级分布式交易的技术路径
Oracle, Red Hat等大厂近期密集发布,加强支持Kubernetes
Netty——基本使用介绍
https://blog.csdn.net/haoyuyang/article/details/53243785
小白科普:Netty有什么用?
https://blog.csdn.net/bjweimengshu/article/details/78786315
Cef ,CEF:给客户端内嵌一个Chrome吧
https://www.itsvse.com/thread-4102-1-1.html
Polly.net 待更新
log4net Nlog
https://www.cnblogs.com/qinjin/p/5134982.html https://blog.csdn.net/lx520aa/article/details/77950057http://www.cnblogs.com/Terrylee/archive/2006/12/03/opensource_framework_and_resource_recommendation_Log.html
基于.NET Core 2.0 开发的跨平台支付SDK集。目前支持:支付宝(Alipay)、微信支付(WeChatPay)、QQ钱包(QPay)、京东支付(JDPay)、连连支付(LianLianPay)、银联支付(UnionPay)
https://github.com/Essensoft/Payment
支付宝(Alipay)服务端SDK,采用.NET Standard 2.0,支持.NET Core 2.0,与官方SDK接口完全相同。完全可以按照官方文档进行开发。除了支持支付以外,官方SDK支持的功能本SDK全部支持,比如生活号、服务窗、行业合作等,且用法几乎一样,代码都可参考官方文档代码。
https://github.com/dotnetcore/Alipay.AopSdk.Core
之后会慢慢更新。 ^ ^