基于to C 电商业务的高并发高可用微服务架构设计

前言

最近一直在研究微服务的架构设计, 在研究技术的同时, 从免不了带入业务需求进行考虑, 否则仅凭性能也无法全面的评估这些设计的好坏, 想得多了, 自己都快记不住了, 觉得应该再开一篇博客记录下来, 说不定在记录的时候再次反思又能想到更多更深入更好玩儿的东西.
当然, 如果能够帮助到其他为此困扰的人, 那也是极好的.

第一节 说明

近期主要是拿to C 电商业务做为观察视角来研究架构设计, 那么核心的设计观点自然也主要围绕此展开.

另外需要提前强调, 直到本文结束宣布结果前, 都只是思维推导的过程, 切勿片面取之.

第二节 了解过去

Mycat数据库中间件上手实践及分布式事务和读写分离实现

前言

现在微服务真是火得不行不行的, 最近开始找工作, 打开Boss直聘一看, 乖乖, 整页整页全是要求会整微服务的, 其中不乏很多小微企业, 搞得好像微服务就是万能的似的, 真不知道是中了谁的毒. 微服务肯定是个好东西, 优点很多, 百度一下一大把, 这里我们就不说了, 先讨论讨论微服务必然会带来几个问题.

  • 通信问题, 微服务间是肯定需要通信的, 不能像以前一样调个方法搞定了.
  • 分布式事务问题暨数据一致性问题, 微服务之间DB操作无法放在一个数据库事务中了.
  • 维护问题, 微服务的维护难度必然是远超过单服务, 如果涉及垂直和水平分库分片更甚.

首先通信问题, 目前主流的做法是RPC和REST, 无论哪种都必然需要目前主流的做法是RPC和REST, 无论哪种都必然需要增加一个接口层的编码, 这带来的工作量增加是无解的.
维护问题亦然, 只要拆分了, 特别是数据库, 那么不仅仅是维护难度成倍增加, 连开发难度都会成倍增加.
这两点是无法逃避的, 但时间能解决, 唯独分布式事务这块是硬伤, 不能解决或解决不好都是会影响到数据健壮性的致命问题, 而本文要讨论的就是如何使用Mycat省时省力且优雅的解决它.

开始正题

第一步 准备工作

老规矩先上传送门

官网传送门
GitHub传送门

MySQL主从同步和读写分离配置及理解

前言

刚刚写这货写一半的时候觉得有必要再写一篇MySQL主从同步配置来辅助, 所有才有了现在这货.😂
关于读写分离实现的部分在这里: 传送门

MySQL主从同步主要目的是为了负载均衡, 一般主要两种使用场景, 读写分离或双主.

读写分离顾名思义, 就是把CRUD中占用资源最多的R独立到从库上, 避免因为查询引起的性能耗尽导致宕机, 从库可以有多个, 所以可以把查询分散到多个从库进一步提升高可用.
双主就是两台服务器相互同步, 不分读写, 简单粗暴实现一定程度上的高可用, 不过切记主键使用基于时间戳的UUID, 否则你可能会被各种主键冲突烦到想死.
Ps: 基于时间戳我着重标记了一下, 是因为我知道很多人以为JavaSDK里提供的UUID获取API就是基于时间戳的, 那你可就想多了, 并不是.
默认只支持V3和V4(基于伪随机数)两种版本的实现, 而V1才是包含时间戳的.
支持UUID V1的第三方库

开始正题

第一步 准备工作

官方下载传送门

必须选择5.1.4之后的版本, 最好使用5.7之后的版本, 5.7之后支持了json字段类型、虚拟字段和虚拟索引, 非常好用.

本地学习测试的话, 可在本地安装多个实例来测试, 具体方法自行百度, 基本上就时改个端口号而已.

Go语言ORM框架XORM上手实战及全自动事务托管实现(类似Spring)

前言

前几天开始寻找适合自己的ORM框架, 因为自己是本命Java, Mybatis用了十年了, 就尝试搜索XMLMqpper风格的XML, 找到了GoMybatis, 经过两天的学习, 发现GoMybatis在事务方面的表现确实不尽人意, 所有事务都必须纯手工操作并且不支持嵌套事务, 这导致在数据操作层的功能代码将变得非常冗长且难以阅读, 所以我不得不重新寻找, 终于我找到了xorm plus, 这是一个基于老外开发ORM框架xorm, 国人自己魔改的独立开源ORM, 作者在简洁中解释了, 因为老外比较轴, 坚持零依赖做xorm的开发, 便导致作者只能起一个项目, 不过作者也提到会跟随xorm更新, Issues的处理也挺及时. 不过遗憾的是xorm plus也不支持类似Spring那样的全自动事务托管, 让我们可以专注于业务, 同时让代码变得简洁, 不过不要紧, 生命不止, 折腾不息, 大不了自己实现嘛.

Ps: 使用过程中发现两处Bug, 已更正.

  • DBEngine struct里的隐式变量xorm.Engine没有使用指针, 导致高并发时被GC回收.
  • cmd.Exec里会新开Session的事务类型开启的Session缺失关闭操作.

开始正题

第一步 了解功能

原版xorm传送门
原版xorm功能并不复杂, 标准的类hibernameORM, 就是用代码自动构造SQL的那种.
加强版xorm传送门

Go语言的ORM框架GoMybatis的学习经历

前言

最近开始学习Google爸爸的Go语言,经过两天的学习,准备尝试搭建一个Web开发框架,折腾到数据库这一块时,了解到Go的orm框架目前用的最多的是xorm,是一种类Hibernate的orm框架,做Java的相信都感受过被Hibernate统治的恐惧,生成SQL的代码都写在Java类里,导致后期优化SQL极其痛苦。不过万幸的是,经过搜索发现了一个名叫GoMyBatis的orm框架,相信大家从名字上看就已经了然了,这是一个类似于Mybatis的orm框架,进入Github自己查看后,了解到在XML解析上已经最大限度上兼容了Mybatis的语法结构,这对无论是已有的项目做迁移,还是新的项目开发都是极大的助力。

开始正题

第一步 安装

官网传送门
GitHub传送门

如何在arm板(cubieboard)上编译安装tensorflow

历经三天四夜,睡眠不超过10小时,终于把tensorflow在arm架构cpu的cubieboard上成功run起来了。不得不吐槽cubieboard的资料实在太少,搜出来的相关资料全是树莓派的,但是还是给予了我不少启发作用。

作为全(zhen)宇(bu)宙(yao)第(B)一(lian)个成功把tensorflow移植到cubieboard的人(google翻100页都搜索不到),特此记录全过程,方便后来者乘凉。

开始正题

第一步 准备工作

如果没有JDK8,先安装JDK8,编译tensorflow需要用到bazel,而bazel依赖JDK8(必须是JDK8),必须配置环境变量。编辑完/etc/profile文件后,记得source /etc/profile,让环境变量生效。

1
2
3
4
export JAVA_HOME="/home/lib/jdk1.8.0_151"
export PATH="$PATH:$JAVA_HOME/bin"
export JRE_HOME="$JAVA_HOME/jre"
export CLASSPATH=".:$JAVA_HOME/lib:$JRE_HOME/lib"

接着安装bazel,我使用的是版本是0.6.1,是否选用更高版本自己看着办,跳坑我不管。
这里有个坑,吐槽bazel打包人员,居然没有在外层目录打包,unzip出来一堆东西,害我又去删掉。所以先mkdir

如何整合Flowable-modeler到自己的项目中

几年没做工作流了,时过进迁,时不时忆起当年,还时那般激情热血。牢骚完,感慨闭,几年后的今天又要开始做自定义工作流的开发,今天首先分享一下我的第一步,整合Web流程设计器官方demo自带的modeler。这里要说几句题外话,本身原计划还时打算继续使用activiti的,想当年我还是基于5.13实现过自定义工作流,现在几年过去了怎么也该6.0了吧,结果不了解不知道一了解吓一跳,activiti核心成员全部出走以Activiti5.22为基础另外创立了Flowable,并且已经发布了6.0 releace,而Activiti这边的6.0依然还在beta版本。了解到这里自不用多讲,肯定选择Flowable咯。

当年我在5.13的时候整合modeler的时候,那可是相当的简单啊,整个过程也就几十分钟的事儿,从官方demo里扣出editor文件夹,然后给自己的系统添加rest框架支持同时添加modeler需要的几个rest路由就搞定。但是这次整合Flowable的modeler着实把我恶心了一把,首先官方demo就搞得无比复杂,使用了太多前沿技术,例如Spring security、angularJs、freemarker等,另外正因为大量使用freemarker导致页面极度碎片化,对于新人研究demo代码带了极大的困难。当然,这些还难不倒我。

开始正题

第一步

观察官方demo,发现现在的demo分成了多个项目,其中关键的就是flowable-idm、flowable-modeler,实际使用发现idm主要负责人员和权限管理,modeler里包含的流程模型管理、app管理和form管理,其中app管理是一个新的概念,实际意义其实就是对流程模型进行了一个分类,和流程模型属于一对多的关系。
大致关系明白之后,开始阅读源码,过程有多坑爹就不多说了,没注释,页面极度碎片化,反正挺痛苦,最后总结是modeler项目可独立使用,可配置jdbc访问指定数据库,但是因为使用了Spring security权限框架做了统一的权限管理和单点登录,故而想要不做修改直接放入自己项目则必须同时使用idm和modeler两个项目,而且idm里面使用的还是ACT_ID_*系列表,无法使用自己系统的用户体系。那么我们可以得出一个结论,要么修改idm让其使用我们自己的用户体系,要么修改modeler取消使用Spring security,不依赖idm,从而使用我们的用户体系。权衡利弊后,我选择了后者。

linux/centos中配置vsftp

用过yum安装vsftp就不用说了.

不过得记得配置防火墙和关闭Selinux

配置vsftp.config

1
2
3
4
5
6
7
8
9
10
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

增加用户组和用户

一个Map泛型的问题

今天遇到一个神奇的问题. 直接上代码.

1
2
3
4
5
6
7
//首先有一个泛型比较复杂的Map, 里面套了一个Key泛型为Integer的Map
Map<String, Map<Integer, CategoriesContainer>> fieldCategoriesMap;

//初始化 复制等操作.

//第一个get获取到Key泛型为Integer的Map, 然后在get, 这里为了讲述方便直接传入一个常量3,
fieldCategoriesMap.get("xxxxx").get(3).getName())

执行上述代码后, 居然空指针了!! 确认都有值, 绝对不可能, debug一看, 居然.get(3)返回的是null在.getName()肯定空指针了…

可是为什么呢?

继续debug检查, 看到如下情况

,