![](https://img-blog.csdnimg.cn/20190221102543655.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
架构师之路
文章平均质量分 87
架构设计思路,常见架构设计方案
hanruikai
aaa
展开
-
六边形架构落地代码分析
前言学习过DDD的朋友们都知道核心有个六边形架构,对于研发人员来说,理解之后如何落地很重要,talk is cheap,show me the code。从网上看到一个原创 2021-06-03 10:26:27 · 1054 阅读 · 3 评论 -
Clean Architecture
两个价值维度对于每个软件系统,我们都对以通过行为和架构两个维度来休现它的实际价值。软件研发人员应该确保自己的系统在这两个维度上的实际价值都能长时间维持在很高的状态。不幸的是,他们往往只关注一个维度,而忽视了另外一个维度。更不幸的是,他们常常关注的还是错误的维度,这导致了系统的价值最终趋降为零。行为价值软件系统的行为是其最直观的价值维度。程序员的工作就是让机器按照某种指定方式运转,给系统的使用者创造或者提高利润。大部分程序员认为这就是他们的全部工作。他们的工作是且仅是:按照需求文档编写代码,并原创 2021-05-31 15:16:12 · 430 阅读 · 0 评论 -
DDD课程学习思考
领域驱动设计软件复杂度成因:规模:分解结构:边界变化:顺应变化方向隔离业务复杂度与技术复杂度;业务与技术是正交的。如果不用DDD,我们基本是数据建模,然后数据驱动设计。数据仅仅提供信息,实体是协作关系。 事务模型和贫血脚本根据模块划分的架构,对变化响应能力不足。全局分析阶段统一语言领域和子领域根据业务流程,梳理领域和子领域架构映射阶段识别BC,限界上下文,每一个BC其实就是一个业务单元。...原创 2021-05-27 13:28:14 · 1989 阅读 · 1 评论 -
架构思维第四篇
什么是技术架构系统架构 = 解决特定问题 + 要素 + 连接,结合这个公式,给技术架构下一个定义:技术架构 = 解决业务上的技术问题 + 技术方案 + 技术组件高并发技术架构本质问题有限的资源处理大量的请求系统性思考根据我们的思维,我们可以大致从以下几个角度来思考: 资源能力强弱:之前资源处理能力弱,能不能变强呢? 资源少的问题:能不能增加资源呢? 请求多的问题:能不能减少请求呢? 处理速度:如果能处理得更快,处理的请求就会更多。 注.转载 2021-05-27 10:08:44 · 203 阅读 · 0 评论 -
架构思维第三篇
技术架构-高扩展可扩展的意思是在面对变化时,用最少的代价去实现,平时我们听得最多的是面向抽象(接口)编程,如果只是把这里的抽象理解成接口,那么就有些狭隘了,抽象是通式通法,而接口只是其中一个,所以在谈可扩展实现之前一定要讲清楚可扩展的本质是什么,连本质都不知道,怎么提出系统性解决方案。扩展本质扩展的本质就是占位符,凡是可以表达变化的就是占位符。应对扩展的方法先给出应对可扩展的方法:规范、识别、注册、使用,这 4 点都是从上面可推导出来的,下面一一进行详细说明。 规...转载 2021-05-26 14:59:49 · 210 阅读 · 0 评论 -
架构思维第二篇
业务架构业务架构的特性,通过特性基本上就知道业务架构的大体框架。笔者通过 x、y 数轴加以说明,因为业务要体现出业务流程的流动性和业务的层次性,下面就说明这两个特性: 业务的流动性:其实这是业务生命周期的体现,从产生、拥用、使用可以看出业务的流动,这是横向的。 业务的层次性:笔者一般习惯用场景层、产品功能层、领域模型层、依赖层来画业务架构图,这是纵向的。场景层依赖下面的产品功能层,多个场景很有可能对应一个产品功能,产品的功能又是由领域模型来支撑的。 业务架...转载 2021-05-26 14:03:00 · 291 阅读 · 1 评论 -
架构思维第一篇
定义与实现解耦,运行时加载实现代表性实现方式就是java里面的SPI机制。比如mysql的驱动mysql-connector-java里面有个MATA-INF/services目录,里面定义具体驱动类,这些驱动类都实现Driver类接口。如下图所示:驱动加载类如下:系统的可扩展性可以遵循标准、识别、注册、运行总的法则去演化不同的具体的实现,可以根据实际的场景选择合适的方法,不再是 SPI,思维就会打开很多。如 Spring 通过 PostProcessor 开放了用户自定..原创 2021-05-26 11:21:28 · 434 阅读 · 2 评论 -
OceanBase存储引擎核心-LSM Tree VS B-tree
1.什么是LSM TreeLSM Tree是一种数据结构,全称是Log Structure Merged Tree,顾名思义,基于日志结构的、可以合并的树。通过定义,我们发现三个关键点:基于日志结构 支持合并 树结构适用场景:写入量比较大的时候,为什么呢?因为LSM Tree是顺序写,避免IO寻址操作,节省时间。很多的其他NoSQL数据库核心也是这种数据结构,主要包括Cassandra,BigTable,RocksDB等。SSTablesLSM Tree持久化磁盘利用Sort.原创 2021-03-09 13:15:14 · 1251 阅读 · 1 评论 -
我们为什么采用TiDB代替MySQL
背景我们的系统最初采用mysql作为后台数据库,随着数据量的增加,采用业界主流的分库分表方案。但是,随之而来的问题是,增加了应用的复杂度,不利于多维度的数据查询,性能将来也面临挑战。所以,我们考虑采用TiDB,因为Tidb是分布式数据库,支持二级索引,能够解决多维度查询问题,并且性能很强。本文,我会介绍我们为什么选择tidb和我们的业务场景,以及tidb如何解决我们的 问题。为什么是TiDB最初,我们采用mysql作为后端数据库,随着数据量剧增,我们采用分库分表的方案,但是分库分表的方案原创 2021-03-08 11:20:48 · 4373 阅读 · 2 评论 -
HTTP 1.0 vs HTTP 1.1 vs HTTP 2.0
HTTP 1.0 vs 1.1我们先看1.1相比于1.0做了哪些改进:支持代理和Host报文头:1.0没有要求host header,但是可以添加。1.1支持,便于路由和代理 支持持久化链接:在同一个Http链接上传输多个报文,1.0要求每个请求/响应必须创建一个新的链接 支持缓存:1.0仅仅支持If-Modified-Since header,1.1增加了entity trag和If-Unmodified-Since, If-Match, If-None-Match 等条件请求头 100状.原创 2021-01-11 16:52:15 · 456 阅读 · 0 评论 -
如何利用微信登陆自己的网站
https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html理解如下:这个默认显示的二维码其实是个固定的链接地址 扫描之后,发送请求到微信开放平台,获取code 取得code之后,再加上之前在微信开放平台注册的appid和appsecret,一起发送请求获取access token 获取access token之后,就可以调用微信接口获取用户信息了,包括昵称、照片等等另.原创 2020-06-18 16:26:58 · 3125 阅读 · 0 评论 -
架构师进阶之NIO以及Netty
NIO在讲解Netty之前,我们先复习一下基础,什么是NIO?网上很多文章,枯燥的讲解了什么是NIO,大家也看的一头雾水,下面我简单而不简洁的给大家解释一下NIO。首先我们要明白一点,什么时候用多线程?多线程不是适用于所有场景,一般适用于cpu密集型任务。然后比如redis,netty,nginx这些框架的应用场景明显都是IO密集型任务。所以多线程不是适用。举个例子,看看IO密集型场景的瓶...原创 2019-03-26 18:49:57 · 684 阅读 · 0 评论 -
架构师进阶之九Nginx架构分析
Nginx概述简单复习一下什么是nginx,nginx是一个反向代理服务器,不同于我们平时为了访问某个网址设置对代理,那个是正向代理。反向代理,请求访问反向代理地址,反向代码寻址目的地址然后返回给请求方,但是请求方并不知道请求对处理方。这样设计的好处在于:保护服务器隐私 实现负载均衡 集中控制请求 缓存资源,减少真是服务器的压力 节省ip资源 解决Ajax跨域问题 区分动态资源...原创 2019-03-24 16:51:21 · 421 阅读 · 0 评论 -
架构师进阶之Hibernate和Mybatis比较
Hibernate架构Mybatis架构分析架构Hibernate 是一个ORM工具,java对象是mapping到数据库到一条记录,对java对象对修改,hibernate会在适当对时机flush到数据库,可以commit事务,也可以调用flush方法。Mybatis仅仅是方法和sql语句到映射,不是ORM映射框架。 Mybatis具有一级缓存和二级缓存,默认一级缓...原创 2019-03-22 18:42:03 · 363 阅读 · 0 评论 -
架构师进阶之九Consul+Openresty作为api gateway
什么是API gateway确保客户端无法察觉应用程序是如何被拆分为多项微服务的。 确保客户端不受服务实例的位置的影响。 为每套客户端提供最优API。 降低请求/往返次数。举例来说,API网关能够确保客户端在单次往返中就从多项服务中检索出数据。请求数量更少意味着运行负担更低且用户体验更好。API网关对于移动应用而言是必不可少的。 将从客户端调用多项服务的逻辑转换为从API网关处调用...原创 2019-03-12 11:36:30 · 2300 阅读 · 0 评论 -
架构师进阶之八一些问题
目录1.jvm相关问题1.1 JVM内存结构1.2 JVM内存模型1.3 类加载机制1.4GC算法1.5 垃圾回收器1.6 调优命令1.5 JDK1.8在jvm有什么优化新增的 JVM 参数2.并发与锁2.1 countdownlatch和cyclic barrier2.2 Synchronize和lock1. Synchronized...原创 2019-03-10 14:37:37 · 653 阅读 · 0 评论 -
架构师进阶之七Mysql数据库原理题
Redo UndoMysql 非常重要的三个日志文件。我们一一分析讲解。Redo log:顾名思义,防止操作丢失,记录数据的变动。为了保证数据持久化到磁盘。redo log记录的是新变更的操作语句。数据修改写入data buffer之前,先持久化redo log到磁盘。Undo log: 顾名思义,撤销操作变更。回滚数据,为了保持数据的事务性。 undo log记录的是变更之前的s...原创 2019-03-08 11:36:15 · 396 阅读 · 0 评论 -
架构师进阶之六消息可靠性投递架构
消息可靠性投递背景消息可靠性投递方案两个重要监听:ConfirmCallback:1. 判断消息是否到达exchange,exchange之后不负责。2. 成功到达exchange并且持久化之后回调。或者没有到达exchange,持久化失败都会回调。ack为true或者false表示ReturnCallback:1. 判断exchange之后,比如到达excha...原创 2019-03-05 19:01:44 · 469 阅读 · 0 评论 -
架构师进阶之五常用的策略模式,太多if ese语句优化方案
引入以前在编码中,遇到过下面的情况,根据设备类型,调用不同的Converter转换类。最初代码如下:if(type1){ convert1();}else if(type2){ convert2();}else if(type3){ convert3();}如果增加类型,需要修改代码,增加if else逻辑。我当时感觉代码ugly,所以用了一个map,映射...原创 2019-02-27 13:27:27 · 800 阅读 · 0 评论 -
架构师进阶之四redis实现分布式锁redission
1. setNX实现方式一般的setNX实现方式,在设置key之后,需要设置超时时间,防止死锁。另外设置key和设置超时必须是一个原子操作。这种方式缺点:1.1 Fail over 因为是把key写到master 节点,无论是主从结构还是cluster集群模式,存在failover的时候,key丢失的问题。1.2 不可重入如果业务多个地方需要用一个key,可能死锁,尤其是一...原创 2019-02-25 16:33:08 · 2152 阅读 · 0 评论 -
架构师进阶之三Zookeeper,Mesos以及Marathon
1.MesosApache Mesos是一个集群管理器,可跨分布式应用程序或框架提供有效的资源隔离和共享。它位于应用程序层和操作系统之间,可以更加轻松地在大规模集群环境中更有效地部署和管理应用程序。它可以在动态共享节点池上运行许多应用程序Apache Mesos将CPU,内存,存储和其他计算资源从机器(物理或虚拟)中抽象出来,使容错和弹性分布式系统能够轻松构建并有效运行。ZookerKe...原创 2019-02-20 18:09:36 · 1622 阅读 · 0 评论 -
架构师进阶之二函数式编程和面向对象编程
什么是函数式编程简单来说:面向对象编程各个模块之间相互依赖,好比流水线生产模式,互相依赖状态,共享数据等等。而FP编程则互相独立,没有任何依赖。因此:FP编程,模块化程度更高,更容易测试,代码也更简洁,比如下面数组遍历的例子。因为模块化程度高,所以FP编程往往是声明式编程,调用现有的函数,你只是需要声明你要做什么,不需要编写具体的step代码。由于FP编程模块化程度高,所以适用于并行编...原创 2019-02-20 11:47:11 · 487 阅读 · 0 评论 -
架构师进阶之一消息中间件RabbitMQ和Kafka比较
为什么需要消息中间件异步任务处理 系统解构,微服务直接解耦通信的一种方式,不关心系统语言编码实现 流量削峰常用的MQ技术1. RabbitMQ1. 1 基于Erlang语言开发。Erlang是一种面向并发(Concurrency Oriented),面向消息(Message Oriented)的函数式(Functional)编程语言。面向并发技术关键点意味着线程切换成本要低。...原创 2019-02-15 12:11:58 · 659 阅读 · 0 评论