- 博客(25)
- 收藏
- 关注
原创 【从零开始搭建后端微服务架构】-01-系统架构总体概述
我很热爱技术,但确没有机会去梦想的地方证明自己。工作快两年了,现在在一个二线城市,基本没有技术提升路线可言,仅仅拿着一份不高不低的工资。看着曾经的同学都去了自己梦想的地方大展拳脚,我很羡慕。虽然客观条件有所限制,但我还是想以一个技术人的身份继续努力下去,找回对技术的热爱与追求,为本就短暂的职业生涯留下点什么。由此初衷我准备开始我的【从零开始搭建后端微服务架构】系列。虽然接触不到互联网,但我还是想证明,我是一名优秀的技术人。本系列着重记录搭建的点滴历程,我会尽可能深挖用到的每项技术,但可能并不能作为某项技
2020-06-04 15:50:59 1601 1
原创 千万级常规saas系统架构精讲(干货)
什么是saas系统saas这个概念来源于云计算领域,其本质是软件即服务。要理解这个概念需要从历史说起,对于早期的软件行业,一般是A公司需要一套进销存系统则软件公司就会针对A的需求开发一套进销存系统,B公司也需要一套那软件公司就会针对B公司的需求再为B开发一套系统,以此类推每个公司需要进销存系统都需要软件公司为其开发一套并私有化部署到其公司。随着云计算时代的到来,云平台的概念逐渐深入人心,那是否可以将各种软件搬到云上,也就是建立一个集中式的由软件公司来维护的系统,其他公司需要使用系统,只需要到该系统注
2021-07-14 12:20:38 16217 3
原创 rocketmq架构解析
1.设计目标RocketMq被设计用来做一个消息中间件,这点与kafka不一样,kafka最初是用来做日志处理的(所以kafka允许丢消息,日志丢失是可以允许的,可以允许消 息堆积,日志很多,可能处理不及时),RocketMq由于设计初衷是作为一个消息中间件,所以他的事务机制做的特别好,并且支持消息的分类等功能。2. 特性经历过双十一的考验 支持集群 支持持久化(零拷贝/随机顺序存储/页缓存) 真正支持事务消息 Netty Nio NameServer(自己开发的,类似与ZK用来实现服
2021-06-22 23:36:20 1360
原创 支付系统架构设计
项目介绍本结算系统的目的是为大平台提供支付能力,打通支付渠道,以及支付后续的记账抛帐支持。业务场景:1.付款2.收款3.对账4.记账抛帐针对上面四个业务场景,我们将系统设计为如下架构其中订单服务和账单服务是两个基础的服务,订单数据和账单数据的持久化都要调用这两个服务的接口。第三方接入模块里面封装了调用第三方接口的代码产品执行器是执行不同支付产品的代码技术支撑模块里面包含了我们用到的所有数据存储介质和中间件api层包含了我们请求接收层面的所有组件,请求在该层
2021-02-27 14:29:42 3360 2
原创 下一代软件架构【软件架构发展历程】【service mesh】
最近二十年,随着信息技术的飞速发展,互联网用户的爆发式增长,软件架构和软件开发模式也在不断变革。从单体应用到分布式应用,再到微服务,云原生,并从中衍生出了一系列软件生命周期概念,如devops,持续交付等。这点在一线大厂中应该会感触颇多,下面我们以java语言体系为基础,分阶段介绍下软件架构和软件开发流程的演进,以及未来软件架构的走向和发展。单体架构时期在互联网应用的早期,大多数都是采用的这种架构。项目所有代码打包在一个jar包中,并部署在价格昂贵的小型机上面。一个项目的服务器基本就只有一台小型机,
2021-02-22 17:05:29 493
原创 docker容器运行的jvm内存不会被回收?
问题表现近期k8s平台上监控到java容器占用内存一直上升,直到超过容器本身分配的大小,导致容器挂掉且自动重启。如此循环往复。系统稳定性差,经常失去响应。(paas平台内存监控图)(dockerfile内容)问题分析程序运行过程中,jvm内存一直上涨,在排除代码问题后,很明显是gc没有起作用。该问题主要是要找到什么原因使得gc没有触发。问题原因经过一系列jvm监控,我们发现,该jvm的最大堆内存被设置成了90G(与当前docker容器的宿主机内存相同)!至此豁然.
2021-02-21 22:48:26 4543
原创 springboot+maven多模块项目打包时找不到类(找不到符号)
当我们在使用springboot+maven构建多模块项目时,经常会用到两个插件:maven-compiler-plugin和spring-boot-maven-plugin当我们使用阿里云镜像构建springboot的时候默认在pom文件中这两个插件都会引入。但是如果多模块项目中同时使用这两个插件,则会产生找不到类的问题。如果这两个插件同时存在会发生什么?spring-boot-maven-plugin的执行在maven-compiler-plugin之后,我们执行打包命令后,会先由mav
2020-10-13 21:07:38 9204 1
原创 你真的选对了主键了吗
前言你是否创建过下面结构的表userid 用户id(主键列) username 张三 用唯一的用户id作为主键。而为了业务需要,你的userid可能是由一个组件根据某种规则生成的,生成后再存入数据库。看起来并没有什么问题,当一个需求要维护所有的用户信息时百分之90的人都会这样建表。假如在原来表结构的基础上,需求变更为:每个用户在不同的场景下被视为不同的用户,既用户现在又多了一个场景的概念,在场景1中他可能是张三,但是在场景2中他就是李四了。在此需求下,用户id+场景id才是唯
2020-07-31 18:12:45 545
原创 MQ产品选型
如今市面上有非常多的MQ产品,如比较老牌的activemq,阿里出品双十一功臣rocketmq,社区火爆功能丰富的rabbitmq,大数据领域专属kafka,超速度的zeromq等等等。但是在实际选型中难免还是比较纠结,下面我们就一起来看一下各个mq的优缺点以及如何来选择MQ产品。产品介绍以下产品都支持mq的基本使用场景,如消息点对点发送/消费,发布订阅,流量肖锋,异步处理。active这是一款比较老牌的mq产品,现阶段使用的人群已经不是很多了,大多出现在一些老项目中。如果是考虑选型的话可以
2020-07-23 17:33:09 515
原创 【从零开始搭建后端微服务架构】-03-mysql集群方案最全总结
前言对于整个系统的mysql设计我在最开始的时候就陷入了困惑之中,下面我会介绍我从困惑到明朗再到最终mysql架构成型的过程,本人才疏学浅,希望大家可以不吝赐教。思考过程由于今年一直在看mq,nosql相关的开源项目,所以在一开始要设计mysql集群的时候我总想将我的mysql打造成为可以横向扩展的大型集群,但在查阅相关资料之后我发现在mysql集群方面呈现百花齐放的场面,他不像mongodb,redis等有一个或少数几个经典的解决方案。mysql拥有类似主从复制,MGR,innodb-clus
2020-06-29 01:03:34 982
原创 centos7安装mysql8.0.20单机版详细教程
mysql8.0之后与5.7存在着很大的差异,这些差异不仅仅表现在功能和性能上,还表现在基础操作和设置上。这给一些熟悉mysql5.7的小伙伴带来了很多困扰,下面我们就来详细介绍下8.0的安装和配置过程。mysql在linux上的多种安装方式:1.yum安装由于centos默认的yum源中没有mysql,所以我们要使用yum安装mysql就必须自己指定mysql的yum源。在官网下载mysql的yum源包,这个源包是一个rpm包,我们先使用rpm的方式安装这个源包,安装完之后yum就多了一个my
2020-06-22 16:32:33 968
原创 【从零开始搭建后端微服务架构】-04-mongodb4.2生产环境集群方案部署
前言相较于mysql,mongodb的集群方案要明朗的很多(现在无法直视mysql了),其官方就提供了两种集群方式:高可用方案-复制集高性能方案-分片集下面我们就介绍下这两种集群方案并根据项目需求进行选型。在此之前推荐下mongodb的学习网站:mongodb中文网,里面有官方文档的中文版,对学习mongodb非常用帮助!集群方案介绍高可用方案-复制集它与mysql的主从差不多,但是增加了故障迁移,自动选举的机制。primary就是我们平常意义上的主节点,可以接受读和写请
2020-06-11 17:42:56 708
原创 【从零开始搭建后端微服务架构】-02-系统的入口
每一个系统都需要有一个供用户进入的入口,这个入口一般是用来接通公网和内网的通道。它是系统流量的总入口也是系统最前端的哨兵。本篇主要介绍从用户发起请求到负载均衡层的设计。背景系统入口的业务当前系统与外部交互的场景有两个:1.与终端的交互当前系统终端有app端(andriod,ios)web端。所有终端主要都通过http协议与服务端交互。2.与外部系统的交互当前系统从某种意义上讲也是一个大的数据中台,有可能是提供接口由外部系统调我们接口灌输进来,也可能是我们需要提供接口供外部系统取用
2020-06-07 17:41:03 2325
原创 java NIO深度讲解
1.NIO概述由于java需要跑在JVM之上,JVM又为了java可以在不同的平台上运行,做了很多适配的工作,最明显的就是在IO领域。jvm采用的是流这种在各个平台通用的形式,虽然适用面广可以满足不同的平台,但是在操作大量数据的时候,由于不能发挥各个操作系统在IO上的特性,所以效率会又致命的缺陷。在nio出现之后,对原来的bio做了一些列改进,由于IO可以分为网络的IO和磁盘的IO,所以我...
2019-08-19 14:32:11 414
原创 IDEA中的git分支操作(二)
前一篇文章介绍了git分支迭代的第一步,下面就来讲下一步2.在新建的本地分支上开发我在之前的基础上加了一句打印语句System.out.println("我是branch1")来模拟我们的代码改动可以看到左侧目录中MyController变成了蓝色,证明我们已经修改过这个文件并且还没有提交到本地仓库在我们会遇到很多情况,下面我就来介绍一下可能的情况及解决办法:1.很顺利,我...
2019-08-15 14:39:13 1515
原创 IDEA中的git分支操作(一)
分支的作用众所周知,git可以允许我们在本地仓库建很多个分支来满足我们的开发需求。比如你正在写一个版本的需求,这时候又突然让你修改一个bug,且bug需要优先于版本需求提交。如果在写了一半的代码之上再修改bug,提交bug修复代码的时候我们要小心的将修改bug的代码和版本需求的代码分开提交,如果两部分代码耦合比较紧密的话,这是一个很考验细心程度的工作,一不小心就会提交错代码。类似于上面的情...
2019-08-15 11:05:11 2073 1
原创 java中的Lock深度解析
1.概述java中的加锁方式,除了有synchronized之外,还有Lock。可重入机制我们对比一下可重入和不可重入的概念,这样就可以更形象的理解可重入。所谓不可重入就是说所有访问这个锁的代码块都需要先获取锁标记才可以进入,锁标记被释放之后,其他的访问才可以重新竞争锁标记然后竞争成功进入(代码块拿到了锁标记)。所谓可重入就是说一个获得锁标记的线程可以多次访问这个锁,既这个线程...
2019-06-19 18:09:45 636
原创 Synchronized原理解析
1.Synchronize的使用示例1.静态方法使用synchronized修饰,表示锁住的是当前类的class对象(this.class)由于class对象会一直存在,所以这种形式可以用在两个代码块的同步,而不用担心所对象被回收;2.普通方法用synchronized修饰,表示锁住的是当前对象(this);3.synchronize代码,块锁住的是在括号里指定的对象。2...
2019-06-19 17:33:01 367
原创 java并发基础概念扫盲
1.计算机指令的执行计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内 存写入数据的过程跟CPU 执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和主存的交互来进行,会大大降低指令执 行的速度。因...
2019-06-19 17:25:21 174
原创 类加载时类各部分的加载顺序
public class TestStatic9{public static void main(String[] args){B bb = new B();}}class A{public A(){System.out.println("A类构造1");//1}{System.out.println("A类普通代码块2");//2}stat
2018-02-07 20:22:56 448
原创 使用String类操作字符串的实战练习
今天搜集了许多关于操作字符串的练习,这里列举出来并附上答案。1. String str = "北京今天气温:-9℃到-3℃"; 要求根据str输出:北京今天的最高气温:-3℃ 北京今天的最低气温:-9℃法一:public class Exec1{public static void main(String [] args){String
2018-02-06 19:38:06 472
原创 String类归纳
String类中的常用方法和长度有关的方法:返回类型 方法签名 作用int length() 得到一个字符串的字符个数和数组有关的方法:返回类型 方法签名 作用byte[] getBytes() 将一个字符串转换成字节数组char[] toCharArray() 将一个字符串转换成字符数组/copyValueOf(char a[],i
2018-02-06 19:14:48 153
原创 Tomcat配置环境变量
之前环境变量配置一直出错,下面列出我的错误在配置Tomcat之前没有配置jdk的环境变量,因为无论用Eclipse还是Netbeans都不需要配置环境变量就可以直接运行java程序,所以之前就忽略了这一步 配置方法:设置系统变量名为JAVA_HOME,变量值为jdk的安装目录,点击“确定”,然后打开“系统变量”区域的Path,将这条语 句;%JAVA_HOME%\bin追加到Path变量值的最
2018-01-02 13:16:46 158
原创 安装Eclipse失败
一开始我修改了Eclipse的安装路径,并且把JDK和jre放到了D盘的不同文件夹下,安装开始前提示找不到JDK,我手动选择jdk之后安装开始,但始终安装不成功。具体解决方法是不要修改Eclipse的安装路径,jdk和jre也都使用了默认路径,最终安装成功!
2018-01-01 21:29:30 2262
原创 jdk与jre的区别
JRE: Java Runtime EnvironmentJDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的
2018-01-01 21:06:28 138
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人