CURD系统怎么做出技术含量--怎样引导面试

简介: 很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信。但是很多公司面试的时候是可以接受面试者之前岗位的并发量、交易量低一些的。比如我们要招聘和我们交易量同等级或者以上的出来的人才,业界本来就没有多少,但我们还是要招人的。所以很多时候更偏向于考察面试者的设计底蕴、思考和解决问题的能力。

引子

很多朋友可能会因为自己做的工作不是特别核心或者业务简单而引起面试中没有自信。但是很多公司面试的时候是可以接受面试者之前岗位的并发量、交易量低一些的。比如我们要招聘和我们交易量同等级或者以上的出来的人才,业界本来就没有多少,但我们还是要招人的。所以很多时候更偏向于考察面试者的设计底蕴、思考和解决问题的能力。

我建议面试时,面试者要争取主动权,主动引导面试。一般作为面试官也很乐意被面试者引导。因为面试官的职责是发现面试者的技术特长,为此我们绞尽脑汁的从简历中、自我介绍中去发掘。如果面试者可以自己有完整清晰的思路,是面试官求之不得的事情。

假设我是一个面试者,近几年做的都是XX后台管理系统。后台管理系统嘛,没有高并发、没有高可用需求、没有复杂架构,属于三无系统。要是我的话,会把自己的以下知识技能放到项目介绍里展示给面试官:

可测试性设计

谦卑对象模式

RESTful风格

领域驱动设计DDD

充血模型

CQRS

可测试性设计

谦卑对象模式

作为一个后台管理系统,一般场景下微服务化的价值不大。DDD领域驱动设计这种专门用于复杂问题的解决办法在这里多半也是杀鸡用牛刀。后面会讲到一些DDD技巧还是可以用的。实际中大多是采用前后端分离的架构,这种架构实践一方面是动静分离,便于缓存优化等性能考虑,另一方面也是一个出于可测试性的考虑。分离出可自动化测试的接口层和测试难度高的展现层。

展现层对象等测试难度高的对象在整洁架构中被称为谦卑对象。通过拆分不同的类或者模块,来区分容易测试的行为和不容易测试的行为,这种设计上的隔离模式被称为谦卑对象模型。

现在的很多设计对程序的可测试性提供了友好的改进和支持。比如:程序调用数据库执行操作,mybatis等持久层框架将把sql以接口的形式对外提供服务,接口有成熟的工具来做mock打桩,这是比较典型的谦卑对象模式。

另外一个比较典型的比较典型的谦卑对象模式是feign。netflix的feign把原本需要手写的httpClient(或者OKHttp)代码使用接口调用的的形式,实现了命令式到声明式的转换。同时,谦卑对象和非谦卑对象之间有很好的隔离层,也对测试更友好。对feign想做进一步了解的可参考我之前的文章《Java&Spring过时的经典语录》,这里简单举个例子:

public interface TestHttpService {

}

RESTful

说起后台管理系统的接口层,RESTful风格的接口是比较流行的最佳实践。虽然这个被提了很多年了,实际严格按照这种风格设计的接口并不多。大多数系统的接口风格像是跟着江南七怪学武的郭靖一般,武功路数驳杂不成体系。

来做个判断题:

下面的代码,类上用了RestController的注解,这是RESTful风格的代码吗?

}

}

REST(英文:Representational State Transfer,简称REST) 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

理论上REST架构风格并不是绑定在HTTP上,但是REST本身受Web技术的影响很深, 目前HTTP是唯一与REST相关的实例。
咱们来看看需要满足哪些约束条件和原则。

资源设计规则:

1>不用大写;
2>用中杠-不用下杠_;
3>用名词不用动词;
4>URI中的名词表示资源集合,使用复数形式。

动作设计规则:

1>GET(SELECT):从服务器取出资源(一项或多项)。

2>POST(CREATE):在服务器新建一个资源。

3>PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。

4>PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。

5>DELETE(DELETE):从服务器删除资源。

返回结果规则:

与HTTP协议标准基本没有新的约束。要注意content-type的accept,包含accept-encoding。之前出个我在测试环境出个一个问题,我们自动化测试回归平台不支持gzip,但是请求时带了gzip,其实平台并不支持导致乱码。

通过上面的约束条件和原则咱们来总结一下为什么叫REST:"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。

互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

如果大家都理解,那上面判断题的答案也呼之欲出了:因为不满足相应的约束条件和原则,所以不是RESTful风格。@RestController 只是让资源返回结果是RESTful风格的。但不管是不是RESTful风格,都是URI。统一资源标识符(Uniform Resource Identifier,URI)是一个用于标识某一互联网资源名称的字符串。 只要定位到资源了,都是URI。

领域驱动设计DDD

充血模型

贫血模型是指实体对象或者说是POJO只包含简单的set、get方法,充血模型认为一个对象是拥有状态和行为的。什么叫状态和行为呢?举个例子:

@Setter
@Getter
@ToString
@EqualsAndHashCode
public class Pojo {
private String name ;
private String status;
public int getStatus() {
return NumberUtils.toInt(status);
}
}

上面类代码上用了lombok的@Setter、@Getter注解之外,还用了@ToString、@EqualsAndHashCode,这两个虽然是Object对象的基本方法,实际上也是做了状态和行为的事情,而不只是@Setter、@Getter的数据存取。与之类似的还有上面的int getStatus,实际上进行了类型转换这个行为。

现在针对到底使用贫血模型还是充血模型更好说法不一。我个人更倾向于使用充血模型,因为这种方法从领域上更内聚。但是很多人不建议使用,主要是因为充血模型对个人能力有更高的要求。充血模型开发者需要自己去识别哪些是实体领域中的。对于一般的spring开发者来说,个人经验上有个简单的办法:凡是要引用@Service、@Component的都不要放到里面,之前本来要放到XXUtils的建议看看更符合哪个实体领域,不要一股脑放到util包下面,看看是否可以划分到实体领域中。

CQRS

CQRS — Command Query Responsibility Segregation,顾名思义是将 command 与 query 分离的一种模式。CQRS 将系统中的操作分为两类,即「命令」(Command) 与「查询」(Query)。命令则是对会引起数据发生变化操作的总称,即我们常说的新增,更新,删除这些操作,都是命令。而查询则和字面意思一样,即不会对数据产生变化的操作,只是按照某些条件查找数据。

在后台系统中,某些查询操作可能会过于频繁,比如页面定时刷新获取数据。这些查询操作不需要保证每次都成功。而命令操作如果失败则涉及到事务回滚等操作,需要保证操作的成功率。这时候可以使用CQRS隔离,比如将检查流量和命令流量使用hystrix隔离,架构清晰了,还可以画出下面这样清晰的架构图:

总结

上面都是后台管理系统中常用的一些技术,其实还有ACL(防腐层),批量操作的隔离、熔断、分片,数据异步转同步等限于篇幅这里就不介绍了。只要面试中能够引导面试官提问这方面的技术并且可以讲的明明白白,已经可以超过大部分的面试者。

推荐阅读

服务设计要解决的问题

分布式存储系统的一致性-可见性差异

代码荣辱观-以运用风格为荣,以随意编码为耻

程序员如何破局前行

相关文章
|
2月前
|
人工智能 容灾 架构师
简历上每个名词,都是一张发给面试官的提问许可证
简历上每个名词,都是一张发给面试官的提问许可证:名词越炫,他下钻的落点越深。落差一旦暴露,连你真做过的部分也会被连带怀疑。包装的正确方向不是把小事说大,是把真事说清——数字、边界、决策理由。 头条标题:你写「熟练 RRF 召回」,面试官就敢问 k 值取多少
|
2月前
|
Dubbo Java 应用服务中间件
Dubbo 还是 Spring Cloud?从架构本质到落地选型
本文深度对比Spring Cloud与Dubbo两大微服务治理体系:前者基于HTTP REST,强调跨语言兼容与灵活组装;后者依托强契约RPC,专注内网高性能调用。从连接模型、协议设计、序列化、线程模型到调用链路,六层拆解RPC高性能本质,提出“对外REST求兼容、对内RPC求性能”的企业级分层架构实践。(239字)
262 8
|
2月前
|
存储 OLAP OLTP
从OLTP到OLAP到HTAP:数据库负载分类的技术演进与选型指南
OLTP和OLAP是数据库最常被混淆的一对概念。很多人知道“OLTP是交易,OLAP是分析”,但不清楚它们在存储结构、索引设计、执行引擎上的根本差异。本文从数据组织方式、查询模式、优化目标三个层面,拆解OLTP和OLAP的本质区别,并结合实际使用场景给出选型建议。
|
2月前
|
运维 API C++
香港云服务器vs美国云服务器,2026跨境商用选型指南
本文以“用户地域分布”为核心,深度解析香港与美国云服务器选型逻辑:亚太用户首选香港(低延迟、双向稳定、免备案);欧美用户优选美国(本地极速、大带宽、高性价比);混合流量可按占比决策或双节点分流。避开常见误区,兼顾线路、带宽、IP、运维四大商用维度,助跨境业务精准匹配最优节点。
|
23天前
|
人工智能 开发者
AI一人公司深度拆解:0员工管8500家公司,年入千万美金、估值18亿
本文是「OPC一人公司通关手册」第29篇,深度拆解硅谷一家0员工AI公司:创始人单人驱动,AI全自动建公司、运营、融资,平台托管8500+家付费公司,年化收入千万美元,估值18亿人民币。核心启示:AI接管执行,人专注判断——一人公司的天花板不在人力,而在决策力。(239字)
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
1006 113
|
3月前
|
JSON 安全 Java
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
Sa-Token 是一款开源免费的轻量级 Java 权限认证框架,支持登录/权限认证、单点登录、OAuth2.0及微服务网关鉴权。v1.46.0 版本新增 Fory JSON、RestClient、独立 Redisson 等插件,修复多处安全漏洞与兼容性问题,全面提升安全性与扩展性。
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
|
7月前
|
消息中间件 监控 Kafka
【消息队列MQ】消息丢失:全链路原因、解决方案、消息可靠性保证
消息队列MQ全链路防丢失体系:覆盖生产→Broker→消费三阶段,直击6大关键节点风险;涵盖确认机制、同步刷盘、主从复制、手动提交Offset、事务消息、死信兜底等核心方案,兼顾可靠性与性能折中。
|
开发框架 人工智能 Java
破茧成蝶:阿里云应用服务器让传统 J2EE 应用无缝升级 AI 原生时代
本文详细介绍了阿里云应用服务器如何助力传统J2EE应用实现智能化升级。文章分为三部分:第一部分阐述了传统J2EE应用在智能化转型中的痛点,如协议鸿沟、资源冲突和观测失明;第二部分展示了阿里云应用服务器的解决方案,包括兼容传统EJB容器与微服务架构、支持大模型即插即用及全景可观测性;第三部分则通过具体步骤说明如何基于EDAS开启J2EE应用的智能化进程,确保十年代码无需重写,轻松实现智能化跃迁。
1188 42