自定义rest代理(一)
引言在项目中可能我们会调用其他的rest接口,我们会写一个HttpClientSender工具类,返回后然后一大堆的条件判断,既繁琐又不直观。我们可以运用所学的FactoryBean手写一个rest代理,使用时可以像Mybatis那样注入接口就可以,方便又简洁。
此工具类是依据HttpClient编写的。灵活性比较高,代码量也是比较多,还是有一些局限性,比如请求方法只支持GET、POST、PUT、DELETE等。
FactoryBean使用FactoryBean来动态获取代理对象,这里我们定义一个RestServiceProxyFactoryBean<T>实现FactoryBean接口。
12345678910111213141516171819202122232425262728293031/** * @param <T> * @author max */@Datapublic class RestServiceProxyFactoryBean<T> implements FactoryBean<T> { /** ...
Spring之FactoryBean
引言FactoryBean 与 BeanFactory名字很像,很容易搞混。但其实它们两个是完全不一样的东东。
BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂。BeanFactory是 IOC 容器的核心接口。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:实现了FactoryBean接口的Bean,根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。
实例需要在调用dubbo接口时加一层自己的逻辑,实现不同的功能。例如判断直接调用别人接口还是调用HTTP接口。
原本有两个dubbo接口,通讯录员工、通讯录企业接口,如下所示:
1234567891011121314151617181920<beans xmlns="http://w ...
MongoDB索引管理(二)
引言在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程。MongoDB也不例外。MongoDB索引的创建有两个选择:一个是前台方式,一个是后台方式。
创建索引索引创建方式前台方式(缺省)
12缺省情况下,当为一个集合创建索引时,这个操作将阻塞其他的所有操作。即该集合上的无法正常读写,直到索引创建完毕任意基于所有数据库申请读或写锁都将等待直到前台完成索引创建操作。
后台方式
12345将索引创建置于到后台,适用于那些需要长时间创建索引的情形这样在创建索引期间,MongoDB依旧可以正常的提供读写操作服务等同于关系型数据库在创建索引的时候指定online,而MongoDB则是指定background,其目的都是相同的即在索引创建期间,尽可能的以一种占用较少的资源方式来实现,同时又可以提供读写服务。后台创建方式的代价:索引创建时间变长。
语法结构MongoDB创建索引使用ensureIndex()方法。
1db.COLLECTION_NAME.ensureIndex(keys[,options])
Keys : 要创建的索引字段
1 按升序创建索引
-1 按降序来创 ...
浅谈设计文档
引言经常听到调侃程序员的一句话”程序员最烦写文档,也最烦别人不写文档”。文档在项目开发中非常重要,首先是自己对产品和设计要非常熟悉才能写出一篇好的设计文档,其次文档可以让别人快速理解技术架构,快速上手。这里总结下自己这几年写概要设计文档的经验。
产品文档产品文档虽然是产品经理编写,但是我们还是要去了解其中详细的信息,尤其是开发背景和整体原型。这样才能开发出符合产品设计的产品。
环境信息记录开发及测试环境的数据库用户名/密码,部署的服务信息及服务部署的主机信息。生产环境的主机信息等。
技术架构技术架构也可设计为整理模型,说明的是后台技术大的框架。
模块设计,可以写以下内容:
1、模块描述:说明哪些模块实现了哪些功能;
2、模块层次结构:可以使用某个视角的软件框架图来表达;
3、模块间的关系:模块间依赖关系的描述,通信机制描述;
4、模块的核心接口:说明模块传递的信息、信息的结构;
5、处理方式设计:说一些满足功能和性能的算法。
下面是个简单的例子:
整体流程图 描述的是整个流程时序图,当然可附带些描述性文字
ER图实体-联系图,描述实体类型、属性和联 ...
MongoDB中的索引(一)
引言在 MongoDB 典型的数据库查询场景中,索引 index 扮演着非常重要的作用,如果没有索引,MongoDB 需要为了找到一个匹配的文档而扫描整个 collection,代价非常高昂。
实例MongoDB 的索引使用的 B-tree 这一特殊的数据结构,借助索引 MongoDB 可以高效的匹配到需要查询的数据,以下图来为例(来自官方):
score 索引不但可以高效的支持 range 查询,此外也可以让 MongoDB 高效地返回排序之后的数据,MongoDB 的索引同其它数据库系统很相似,MongoDB 的索引是定义在 collection 级别的,支持对任何单个 field 以及任何 sub-field 建立索引。
默认的 _id indexMongoDB 在 collection 创建时会默认建立一个基于_id的唯一性索引作为 document 的 primary key,这个 index 无法被删除。
Mongodb 支持多种方式创建索引,具体创建方式见官方文档 https://docs.mongodb.com/manual/indexes/#create-an-i ...
protostuff序列化
引言HTTP通信离不开对象的序列化和反序列化。通过序列化技术,可以跨语言实现数据的传输,将对象转换为字节序列,然后在网络上传送;通过反序列化,可以将字节序列转换为对象。 基本原理和网络通信是一致的,通过特殊的编码方式,写入数据将对象以及其内部数据编码,存在在数组或者文件里面然后发送到目的地后,在进行解码,读出数据。
protostuffprotostuff是Google出品的一种轻量并且高效的结构化数据存储格式,性能比 JSON、XML 要高很多。
之所以性能如此好,主要得益于两个:第一,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 XML 和 JSON 快上了 20~100 倍;第二,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。
详细效率对比可参考:java序列化/反序列化之xstream、protobuf、protostuff 的比较与使用例子
maven依赖12345678910<dependency> <groupId>io.protostuff</group ...
自定义StopWatch
引言在平时的开发调试工作或线上中,有时会遇到程序执行效率非常慢,通过一般的经验只能判断出部分逻辑有问题,但判断并不直观且效率较低,不知道方法中哪个阶段比较耗时。目前spring-framework提供了一个StopWatch类可以做类似任务执行时间控制,于是利用此思想重新实现了一套自己的逻辑。
Spring中StopWatch12345678910111213141516171819202122232425262728293031@Slf4jpublic class TestStopWatch { private void test() throws InterruptedException { StopWatch sw = new StopWatch(); sw.start("起床"); Thread.sleep(1000); sw.stop(); sw.start("洗漱"); Thread.sleep(2000); s ...
谈谈日志
引言日志用来记录用户操作、系统运行状态等,是一个系统的重要组成部分。 然而,由于日志通常不属于系统的核心功能,所以常常不被团队成员所重视。对于一些简单的小程序,可能并不需要在如何记录日志的问题上花费太多精力。但是对于作为基础平台为很多产品提供服务的后端程序,就必须要考虑如何依靠良好的日志来保证系统可靠的运行了。
工程配置使用slf4j作为日志门面,logback作为日志实现,把其他日志组件的调用转换到slf4j。
pom.xml
123456789101112131415161718192021222324// 可到https://mvnrepository.com获取最新version版本<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId></dependency><dependency> <groupId>ch.qos.logback</groupId> <ar ...