
架构设计专栏
文章平均质量分 66
分享各种架构设计
zollty
这个作者很懒,什么都没留下…
展开
-
前端MockServer及API管理平台设计
2018-12-29相信很多人用过阿里的Mock平台:RPM、RPM2但其功能和易用性还是有待提高,对于业务稳定的中小型公司,建议在开源平台的基础上自研。先看一下日常研发流程举例:做一个工作任务管理系统(有UI的情况)流程如下:1、产品人员:定功能,定原型2、设计人员:定UI设计3、前端和移动端架构:分析功能,整理出接口,然后再和后端一起讨论,就接口名称、字段命名、接口粒度等达成一致意见,形成接口文档v1版本,然后前端或移动端立即在MockServer平台上编写接口的原创 2021-10-16 19:22:43 · 516 阅读 · 0 评论 -
自动化测试的思考及其工具的设计
一方面是接口单元测试。所有Rest/Dubbo等API都要做单元测试,输入、输出,标准化。输入示例: { "m": "put", "t": 1, "u": "http://localhost:6680/test/nodepd/a003", "b": "{\"a\":12,\"b\":2}" }, { "m": "get", "t": 0, "u": "http://localhos...原创 2021-01-18 09:40:12 · 409 阅读 · 0 评论 -
通用API数据结构及错误码设计规范
一、前言1、设计“标准错误信息结构”的背景和意义考虑到如下几个方面:1)便于使用方(大众用户)知道错误的原因2)便于使用方(程序 或 程序员)知道错误的原因3)便于知道错误的原因,以及可能的排查和恢复措施4)知道错误的类型,便于对其进行监控(分类和统计)或者 触发特定动作设计策略:首先考虑2)3)4)。针对于 面向 程序处理 或者 程序员使用的数据,跟 面向于 普通大众用户的数据,其错误码(code)和错误信息(msg)的设计可能是有...原创 2021-01-18 09:31:44 · 3087 阅读 · 0 评论 -
正确采取Xss攻击防御措施
灵魂拷问:到底怎么做防XSS攻击才是最佳方案?网上那些拦截器方案靠谱吗?Xss攻击说明:1、攻击者准备 恶意html/javascript代码片段,该代码最终会被嵌入到被攻击服务器加载的页面上。2、恶意html/js代码,在用户不知情的情况下被执行,以该登录用户的身份执行敏感操作或获取敏感数据后发送给攻击者。举例如下: 有个文章编辑页面,可以编写任意html/js代码。攻击者在里面嵌入了恶意js。 文章被提交保存后,下次显示出来时,执行该恶意js,从而获...原创 2021-01-13 11:28:37 · 2217 阅读 · 1 评论 -
开发环境设计
前言: 程序员的测试环境和生产环境,都已经从物理机、虚拟机,进化到了自动化部署、容器云平台。 那开发环境,是否也应该改善一下呢?一、背景开发环境怎么能做到一次搭建,永久使用,一劳永逸?甚至还可以快速复制和分享。包括几个方面问题:1、更换电脑或重装系统时,如何快速拥有全面的办公能力、开发能力?通常情况: 各种软件(常用的、不常用的)都得重新安装,包括各种插件、补丁等; 系统配置,软件配置,都得重新来过; 某些软件中的资料、历...原创 2020-12-29 17:51:42 · 612 阅读 · 0 评论 -
跨域请求Access-Control问题及相关理论大全
本文涉及三个核心知识: CORS 及 HTTP的Access-Control 浏览器的preflight request HTTP的OPTIONS方法的作用 及一个故事(我为什么三个小时没查出CORS失败)先别急,必须来弄懂上面的三个知识。第一个,CORS 及 HTTP的 Access-Control,推荐看下面这两篇文章:CORS:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORSAcc...原创 2020-12-29 17:45:59 · 1494 阅读 · 0 评论 -
中间件客户端配置中的域名与IP
问题说明及其背景某些中间件的客户端配置中,会有集群的地址列表(数组),典型的如zookeeper的地址列表:192.168.0.1:2181,192.168.0.2:2181聪明的运维同学,喜欢把它弄成域名,第一种是一个域名解析为多个IP(起到负载均衡作用):zk.if.zollty.com:2181第二种是一个域名解析为一个IP(可以方便修改IP),例如:zk01.if.zollty.com:2181,zk02.if.zollty.com:2181...原创 2020-12-21 16:49:03 · 794 阅读 · 0 评论 -
数据库IP网络切换问题
方案1:使用域名,解析到IP1,当IP1不可用时切换域名解析到IP2缺点:域名解析有缓存,需要及时更新(参见Java DNS缓存),数据库连接池(包括Redis连接池)需要及时检测连接的有效性。随便说一案例,前不久我们遇到一个Redis客户端Lettuce的一个问题:Redis物理机挂了一个,但是集群节点没有及时同步(Lettuce默认没有启用拓扑刷新),参见:https://blog.youkuaiyun.com/qq_45401061/article/details/104263967。方案...原创 2020-12-21 16:46:16 · 606 阅读 · 0 评论 -
架构师必须懂的设计原则
KISS设计原则:(Keep It Simple,Stupid) 首选简单的代码和体系结构。 避免复杂的抽象。 避免使用魔术代码和奇特的算法。 避免大的外部依赖性。 减少分布式系统中活动部件的数量。 避免自动决策,这可能会损害群集的可用性,一致性或性能。 附:另外,还有 KISS编码原则,参见:https://www.cnblogs.com/yutiansanshou/archive/2012/12/05/2802653.html...原创 2020-12-21 16:38:19 · 485 阅读 · 0 评论 -
深入理解分布式事务的二阶段提交和三阶段提交
一、“两阶段提交”的架构对于分布式系统,在两阶段提交的架构中,有两种类型的节点:事务的协调者,事务的参与者。两阶段提交的程序执行流程如下:1.请求阶段(commit-request phase,或称 预提交阶段,prepare phase)在请求阶段,协调者将通知事务参与者 “执行本地事务,并做好提交的准备”,然后参与者答复协调者自己的决策:OK(事务参与者本地作业执行成功)或 Fail 取消(本地作业执行故障)。2.提交阶段(commit phase)在该阶段,协调者将综合第...原创 2020-12-17 15:08:00 · 1530 阅读 · 1 评论 -
中间件及基础组件交接维护规范
一、说明Ø提交方[研发]:软件开发部Ø维护方[运维]:运维部二、基本交接流程1.交接之前Ø中间件的选型获得包括数据中心在内的评审通过;Ø中间件经过一段时间生产环境的运行和正常流量的使用(至少1个月),表现稳定无较大的问题。在此阶段,主要由研发自己来维护,运维提供协助。2.交接期间Ø提供(适用于当前实际部署情况的较详细的)中间件维护操作手册,以及中间件官方的相关手册或技术资料;Ø提供该中间件的监控告警方案,以...原创 2020-12-17 15:06:23 · 1334 阅读 · 0 评论 -
解决AJAX在用户登录失效后返回登录页面的问题
后端AJAX API,Session过期,登录失效,直接跳转(redirect)到登录页。(后端Shiro、Spring Security等都支持这个功能) 对于全站AJAX的应用,当然不存在redirect重定向到登录页面的做法(建议直接返回HTTP Code 401),但是对于某些前后端没有分离的应用,当用户session失效时,后端可能会重定向到登录页面。那对于ajax请求,后端重定向后,返回的ajax内容是一个html页面,怎么办呢?总体的思路是在ajax工具的拦截...原创 2020-12-17 14:58:56 · 1713 阅读 · 0 评论 -
Redis开发使用规范
一、键值设计1、key名设计【基本原则】 key中添加前缀,以示区分,防止key冲突; 控制key的长度,减少无意义的内存浪费; key中不要包含特殊字符(空格、引号、换行符等); 【各项目key命名规范】1、 整体格式整体分为4级:${team}+${project}+${func}+${key}。含义如下表所示: 等级 说明 必须 第一级 战队...原创 2020-12-03 15:08:53 · 607 阅读 · 0 评论 -
项目多环境配置管理方案
针对常见应用场景,可以分为以下几个方面来考虑注意:本文只针对没有接入统一配置中心、配置平台的情况一、Java服务器端项目1、对于项目的框架或者组件,如果支持编程方式配置,则编程根据不同环境读取不同配置,例如Spring框架、Logback日志库都支持; 1) 如果使用Spring Boot,直接采用官方推荐的配置切换方式:设置spring.profiles.active,可以是jvm变量、main启动参数、环境变量等(建议使用jvm变量); 2) 如果使...原创 2020-12-03 15:07:04 · 1121 阅读 · 0 评论 -
项目日志记录规范和标准
《项目日志记录规范和标准》(第二版2017年10月) 第一版(2013年3月)参见这里。一、说明日志分类如下: 1. 面向问题排查的日志 2. 面向提醒或告警的日志 3. 面向调试和测试的日志 4. 面向功能的 日志(准确的说,这是数据文件,不是日志) 5. 面向人阅读的日志 6. 面向机器解析的日志本规范v1.0,主要针对于上面的1、2、3、5点。对于第2点的告警信息,仅记录日志是不够的,建议配合实时的通知机...原创 2020-12-03 15:02:12 · 4274 阅读 · 0 评论 -
生产环境项目程序部署方式的改进和深度思考
首先,以Java项目为例,部署方式有很多,我总结如下: Tomcat等:所有文件放在war包中部署 WAS/Weblogic:通常外挂lib,每次只更新项目自身代码(ear包或war包) JBOSS/EAP:不同于其他Web Container,JBOSS自创了VFS Executable Fat Jar(自带Web Container): 所谓Fat Jar就是所有打包在一个jar中,涉及 jar:jar:file:/path问题,需要hack,一...原创 2020-10-09 11:42:06 · 785 阅读 · 0 评论 -
微服务指南和实施要素
一、什么是微服务化和组件化?为什么要做微服务?1. 什么是微服务顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务",所谓服务,就是IT系统提供的一种能力/功能,它要区别于系统,服务是一个或者一组相对较小且独立的功能单元,是用户可以感知的最小功能集。微-狭义来讲就是规模小,就是指开发单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。微服务也指由多个相对独立的、松耦合的部分组成的面向服务(SOA)的架构思想。也就是说,如果每个服务...原创 2020-08-30 16:17:04 · 521 阅读 · 0 评论 -
源码分析之Spring Security 和 Shiro 请求处理流程
一、Spring Security登录执行流程1、首先用ServletFilter拦截器(AbstractAuthenticationProcessingFilter)对应UsernamePasswordAuthenticationFilter: 拦截到登录的请求(通常是form Login,比如 /login + POST ) 解析出登录信息principal和credentials(对应username和password),封装成Authenticat...原创 2020-08-30 15:14:38 · 397 阅读 · 0 评论 -
令人崩溃的yaml(yml配置)对比properties、json、TOML
经过:原本,我一直以为,yml格式非常好用,至少比 properties要科学,比 json 要简洁、强大,然而,下面遇到的这个案例,让我意识到,yaml并不是万能,也并不是最科学、简洁的,甚至是比较糟糕的。我有这样一个 spring-boot的配置文件(原本是properties格式如下): keycloak.realm=demo keycloak.resource=fm-cache-cloud keycloak.credentials.secret=...原创 2020-08-29 16:36:56 · 8345 阅读 · 8 评论 -
Dubbo和Spring Cloud简单对比及思考
首先做一个简单的功能对比: Dubbo Spring Cloud 服务注册中心 Zookeeper Spring Cloud Netflix Eureka 服务调用方式 RPC REST API 服务监控 Dubbo-monitor Spring Boot Admin 断路器 不完善 Spring Cloud Netflix Hystrix 服务网关 无 Spring Cloud Netflix Zuul...原创 2020-08-26 14:01:55 · 460 阅读 · 0 评论 -
项目工程结构分层模型研究
常见应用框架 分层模型说明调用层次:(控制层-可选)——>业务逻辑层——>数据处理层1、控制层:非必须,可选,一般由框架层面统一处理。 此层由一系列拦截器(可以是前置、后置、环绕等类型的拦截器)组成,用于拦截请求,对请求进行统一的解析和处理,然后决定是否继续执行,决定后续应该调用哪些业务逻辑对象的业务方法来处理请求,并将业务层的处理结果,进行统一加工,再返回给请求发起方。2、业务逻辑层:真正处理业务请求,调动各种资源(mq、redis、mysql等)和子处理逻辑...原创 2020-08-26 11:01:57 · 939 阅读 · 0 评论 -
基础框架开发和维护经验
Main方法执行完之后,JVM不退出,解决方案:原因:因为Main方法执行完之后,有线程未关闭,所以JVM肯定不会退出,解决方法1(治本):使用debug方式运行main,看Eclipse的debug界面或者看jstack,找出main方法结束后还在运行的线程,将其stop即可。解决方法2(治标):在main方法的最后,加上一句 System.exit(0);...原创 2019-01-25 18:39:21 · 5536 阅读 · 0 评论