springMVC实现多版本接口

发布在 java, spring

最近的一个需求,在现有的系统上实现同一接口的多版本访问,便于以后的接口升级,客户端不改变请求地址,在参数中传递一个version字段指定访问哪个版本的接口。

在前一篇博文 springMVC修改接口注册映射逻辑 中,用修改springMVC注册和映射接口的逻辑实现了该功能,但缺点也很明显,客户端传入的版本号必须在服务端存在,如传入v2.0,则服务端必须存在v2.0版本的接口,否则会抛出404,无法实现降级调用最新接口或默认接口的功能。
阅读全文

最近的一个需求,在现有的系统上实现同一接口的多版本访问,便于以后的接口升级,客户端不改变请求地址,在参数中传递一个version字段指定访问哪个版本的接口。

因为现系统已经在运行,所以改造不能影响已在使用的接口,最开始的设想是建立一个新接口,然后用拦截器拦截请求,组装请求地址+版本号,重定向到新接口,如下:
阅读全文

Goolge-Guava Concurrent中的Service,一般翻译作服务,个人感觉这个太宽泛了,我在学习中就直接把它当做一种特殊的线程托管对象来理解的。

一个服务正常生命周期有:

  • Service.State.NEW
  • Service.State.STARTING
  • Service.State.RUNNING
  • Service.State.STOPPING
  • Service.State.TERMINATED

服务一旦被停止就无法再重新启动了。如果服务在starting、running、stopping状态出现问题、会进入Service.State.FAILED.状态。调用startAsync()方法可以异步开启一个服务,同时返回this对象形成方法调用链。注意:只有在当前服务的状态是NEW时才能调用startAsync()方法,因此最好在应用中有一个统一的地方初始化相关服务。停止一个服务也是类似的、使用异步方法stopAsync()。但是不像startAsync(),多次调用这个方法是安全的。这是为了方便处理关闭服务时候的锁竞争问题。
阅读全文

ListenableFuture

ListenableFuture是可以监听的Future,它是对java原生Future的扩展增强。Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果希望计算完成时马上就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做会使得代码复杂,且效率低下。如果使用ListenableFuture,Guava会帮助检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。
阅读全文

java线程有两个重要的特性,可见性有序性,多个线程之间是不能直接传递数据的,它们之间的交互只能通过共享变量实现。例如,对一堆数据进行求和运算,多个线程共享一个Sum类的对象,这个对象是被创建在主内存(堆)中,每个线程都有自己的工作内存(线程栈),工作内存存储了Sum对象的一个副本,当线程操作Sum对象时,首先从主内存中复制Sum对象到工作内存中,然后执行方法求和,改变sum值,最后用工作内存的Sum对象刷新主内存的Sum对象,当一个对象在多个线程中都有Sum对象的副本时,如果其中一个线程修改了共享变量,其它线程也应该能看见到,这是可见性。因为CPU对线程的调度是随机性的,在处理一些业务如银行转账时,必须保证先取款后汇款或先汇款后取款的有序操作,这是有序性
阅读全文

JDK1.5以后java加入了一个并发包java.util.concurrent用于替换传统的多线程使用场景。其中包含几个重要的接口Executor,ExecutorService,Future,Callable等。

Executor接口只定义了一个方法void execute(Runnable command),它用来执行提交的任务,用户只需提交任务,不必关心任务何时执行以及任务的调度情况。用户不需要明确的像传统方式那样定义一个线程,如:new Thread(new(RunnableTask())).start()。可以通过如下方式提交一个任务
阅读全文

log4j2相对于log4j1.x有了相当大的变换,官方称相对于log4j,在多线程下高达10多倍的吞吐量。在之前的项目中一直使用的是log4j1.x,这次需要升级到log4j2,以前的自定义的日志级别如输出接口访问信息到指定文件就需要更改。

阅读全文

最近的一个需求,需要记录接口访问的详情,如请求入参、出参、请求上下文、路径、消耗时间以及成功失败等信息,将这些信息以结构化的形式输出到单独的日志文件中,方便以后入库到elasticsearch中做分析。

百度搜索自定义日志级别的文章一大把,基本上都是使用Filter和xml配置的方式,这种方式能行,但我感觉写的代码略多,而且我的工程中用的properties的方式配置的,个人也比较懒也就不想改动,就没有采用这种方式。

log4j中每个appenders都有一个threshold,这个值默认是null,它对应的是配置文件中log4j.appender.errorfile.Threshold = debug|info|error|...项,如果不配置,会将所有级别日志打印到这个appender中,如果是debug则会将debug及以上的级别日志打印到这个appender中。
阅读全文

DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。

datax-elasticsearch是datax的一个支持elasticsearch的插件,包含elasticsearchreaderelasticsearchwriter两部分。借助于datax体系,能够高效的在elasticsearch与oracle、mysql、HDFS等异构数据源间同步数据。
阅读全文

忘语

热爱生活,享受code


一名虔诚的程序猿