- 博客(43)
- 资源 (1)
- 收藏
- 关注
原创 Spring RestTemplate配置DNS解析超时
在spring中使用RestTemplate调用远程接口时往往需要设置超时时间,否则当对方接口过慢时,很容易把自己系统堵死。连接超时、发送请求超时、接收响应超时都有直接的方法可以进行调用设置,设置DNS解析超时需要通过相对复杂的方法进行处理。首先RestTemplate配置使用apache httpclient进行http接口调用,apache httpclient内部通过默认的DnsResolver进行DNS解析,我们可以通过自己实现DnsResolver方法来设置DNS解析超时时间。
2024-06-16 18:51:53
518
2
原创 spring动态控制定时任务
在spring框架中,对于简单的定时任务,可以使用 @Scheduled 注解实现,在实际项目中,经常需要动态的控制定时任务,比如通过接口增加、启动、停止、删除定时任务,动态的改变定时任务的执行时间等。
2024-01-07 21:39:57
1309
3
原创 Spring Data 灵活查询的三种方式
SpringDataJpa提供了三种灵活查询的方式,分别是:1、通过@Query注解编写查询语句;2、Example查询;3、Specification查询。下面分别介绍这三种方式的使用方法。
2023-12-27 22:27:07
590
原创 Spring Boot 3.2 新特性之 HTTP Interface
HTTP Interface 是一个类似于 openfeign 的同步接口调用方法,采用 Java interfaces 声明远程接口调用的方法,理念上类似于SpringDataRepository,可以很大程度精简代码。要使远程调用的接口可以执行,还需要通过 HttpServiceProxyFactory 指定底层的http接口调用库,支持 RestTemplate、WebClient、RestClient三种。
2023-12-24 17:22:42
1830
原创 Spring Boot 3.2 新特性之 RestClient
RestClient 是一个类似于 RestTemplate 的的同步接口调用工具。相比于 RestTemplate 采用的是 template 设计模式,RestClient 采用了 fluent API 风格,简单灵活,易于阅读和维护。
2023-12-03 22:18:23
3846
原创 Spring Boot 3.2 新特性之 JdbcClient
JdbcClient是一个轻量的数据库操作框架,采用 fluent API 风格,简单灵活,易于阅读和维护,支持编写复杂的SQL。通过上述的示例,可以看到基本的数据库操作都可以用 JdbcClient 实现,避免了复杂的ORM框架的使用,切操作要比ORM框架简单灵活的多。fluent API 的风格也更容易编写和阅读。
2023-11-26 17:43:17
1813
原创 Spring Data Envers 支持有条件变动纪录的保存和查询
可以通过 spring-data-envers 很容易的实现变动纪录的保存和查询,只需要增加几个注解就可以。但是要实现有条件的变动纪录的保存和查询就需要进行一些复杂的处理。每个监听事件都对应着特定的 Listener ,在本文实例中,我们期望当 author 的值被更新为空时,不保存变动纪录,我们可以通过自定义 PRE_UPDATE 和 POST_UPDATE 的Listener来实现。
2023-10-15 12:23:55
516
原创 Spring RestTempate 打印请求和响应内容日志
RestTemplate使用前需要先定义bean,在定义bean时可以通过指定来打印日志。RestTemplate的bean的定义在RestTemplateConfig类中实现。其中方法用来指定我们自己实现的日志打印 interceptors。
2023-05-03 17:58:39
4641
1
原创 Spring Boot集成简易规则引擎 easy-rules
通过将业务规则配置的配置文件中,可以精简代码,同时已于维护,当规则修改时,只需要修改配置文件即可。easy-rules是一个小巧的规则引擎,支持spring的SPEL表达式,同时还支持 Apache JEXL 表达式和 MVL 表达式。
2023-03-26 13:06:55
4105
原创 Spring Boot 3的AOT(GraalVM Native Image)应用开发
Spring Boot 3的AOT(GraalVM Native Image)应用开发
2022-11-26 21:58:01
7505
原创 ElasticSearch新版JavaClient使用简介
ElasticSearch在7.17版本之前使用的java客户端是Java REST Client,但是从7.17版本开始,官方将Java REST Client标记为弃用(deprecated),推荐使用新版Java Client。本文介绍新版ElasticSearch Java Client的基本用法。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/elasticsearch-javaclient一、概述Elasti
2022-04-17 19:34:44
12627
2
原创 spring-rest接口LocalDateTime转时间戳
本文介绍spring-rest接口中的LocalDateTime日期类型转时间戳的方法。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-localdatetime-epoch一、概述java程序中一般将日期类型定义为LocalDateTime,数据库中保存的时间是0时区的时间(UTC时间)。对于接口来说,为了支持全球化多时区,接口中的日期类型通常会返回UTC时间戳,简称Epoch,数据类型为long,前端程序
2022-04-04 19:07:51
1357
原创 spring缓存自定义resolver
本文介绍spring中自定义缓存resolver,通过自定义resolver,可以在spring的cache注解中增加附加处理。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-redis-resolver一、概述cache-aside模式是常用的缓存使用模式。使用流程如下图:[外链图片转存失败,源站可能有当更新数据库中的数据后,对缓存做失效处理,后续就能读取到数据库中最新的数据,使得缓存数据与数据库数据保
2022-03-13 23:00:50
2584
原创 spring使用kafka的三种方式(listener、container、stream)
spring使用kafka的三种方式(listener、container、stream)@TOC本文介绍spring中使用Kafka的三种方式,其中container方式最灵活,但是开发相对较负责,stream方式使用最简便,listener方式由于提供的最早,使用的较普遍。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-kafka一、概述在实际项目中,用到kafka的场景非常普遍,特别是事件驱动的编程模
2021-10-31 17:15:42
8940
原创 springboot集成groovy脚本
在我们的应用中引入脚本能力,可以很好的提升灵活性,我们的核心开发工作可以集中在核心平台能力的开发上,具体场景的功能可以通过脚本来实现,例如jenkins就可以通过groovy脚本来编写pipeline,可以很灵活的定制构建过程。spring本身提供了groovy集成的机制,分为两种方式,一种是用groovy开发程序,跟用java开发类似,需要经过编译。一种是将groovy作为脚本来执行,不需要编译。在此我们介绍的是第二种方式,将groovy作为脚本来使用。具体的代码参照 示例项目 https://git
2021-05-05 19:28:52
2139
2
原创 springboot单元测试技术
整个软件交付过程中,单元测试阶段是一个能够最早发现问题,并且可以重复回归问题的阶段,在单元测试阶段做的测试越充分,软件质量就越能得到保证。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-unit-test一、概述一个功能的全链路测试,往往要依赖于很多外部组件,如数据库、redis、kafka、第三方接口等,单元测试的执行环境有可能受网络限制没有办法访问这些外部服务。因此,我们希望通过一些技术手段,能够用单元测
2021-04-18 18:24:12
857
原创 spring ThreadPoolTaskExecutor使用不当导致的死锁问题
Spring自带线程池使用很方便,不过在相对复杂的并发编程场景中,使用时还是需要根据使用场景仔细考虑配置,否则可能会遇到本文中提及的坑。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-taskexecutor-block一、概述spring自带线程池有2个核心配置,一个是线程池的大小,一个是队列的大小。ThredPoolTaskExcutor的处理流程:新建线程并处理请求,直到线程数大小等于corePoo
2021-01-10 21:54:20
2309
原创 spring打印http接口请求和响应
在程序日志中打印出接口请求和响应的内容是一个基本的技术需求。如果在每个接口中实现请求响应的日志打印,程序编写会很繁琐,我们可以利用spring提供的机制,集中处理接口请求响应的日志打印。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-rest-log-request-response一、概述基于spring提供的机制,有3种方法可以实现接口请求响应日志的打印,分别是CommonsRequestLoggingF
2020-11-22 18:42:00
7104
1
原创 spring动态数据源
在实际的业务场景中,我们经常会遇到需要动态配置数据源的情况,只需要修改配置,就能增加新的数据源的接入,而不需要修改程序代码,通过动态数据源技术可以实现这个目标。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-dynamic-datasource一、概述通常在用springboot开发数据库应用时,我们会在配置文件中配置好数据源,程序中指定数据源进行数据库操作。当需要新增数据源时,就需要修改程序。通过动态数据源
2020-09-16 16:34:32
230
原创 java并发编程进阶
常用的java并发编程技术。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-currency一、概述传统的java并发能力依靠的是多线程,相比于现代的方法是Reactive编程,本文介绍多线程的实现,Reactive编程方法的介绍可参见Reactive编程。多线程并发编程有2个核心概念,原子性和可...
2020-04-25 23:54:40
358
翻译 软件定义交付宣言
原文 https://github.com/sdd-manifesto/manifesto交付是每个软件团队和组织的基础和战略能力,只有在交付时,代码才有它的价值,才能精准地塑造精彩的世界。交付是如此重要,现在是时候定义交付,并将其应用到开发工作中。宣言中表示交付工作本质上是独一无二的,应用程序、组织、部署环境和团队的每个组合都有自己的上下文,每个团队都需要理解这种独特的交付和自动化。持续交...
2018-11-25 13:16:36
616
翻译 Reactive编程(三):一个简单的HTTP服务
书接上文 Reactive编程 ,我们已经了解了基础的API,现在我们开始编写实际的应用。Reactive对并发编程进行了很好的抽象,也有很多底层的特性需要我们去关注。当使用这些特性时,我们可以对之前隐藏在容器、平台、框架中的细节进行控制。Spring MVC由阻塞转向ReactiveReactive要求我们以不同的思路来看待问题。区别于传统的request->response模...
2018-03-25 21:54:55
2187
翻译 Reactive编程(二):代码演示
书接上文 Reactive编程 ,我们继续用真实的代码来解释一些概念。我们会更进一步理解Reactive的与众不同以及它的功能。这些例子很抽象,但能够让我们更进一步理解用到的API和编程风格,真实的感受它的与众不同。我们将会看到Reactive的核心元素,学习如何控制数据流,如果需要的话还会用到后台线程进行处理。建立项目我们用Reactor库来进行演示。当然也可以用其它的工具。如果不想拷...
2018-03-18 23:42:18
2587
翻译 Reactive编程(一):Reactive编程的背景
Reactive编程很有趣,现在也有各种各样的讨论,概念上不是很容易理解。本文会以具体的形式介绍相关的概念。Reactive编程跟并发和高性能在概念上有一些重合,但在原理上完全不同。Reactive编程跟函数式编程是非常类似的。一些人认为Reactive编程并不是什么新概念,他们在日常工作中经常使用(例如javascript)。另一些人认为这是微软做出的新发明(Reactive这个名字最早来源于C...
2018-03-04 17:24:05
12019
原创 SpringBoot项目中使用AOP
1.概述将通用的逻辑用AOP技术实现可以极大的简化程序的编写,例如验签、鉴权等。Spring的声明式事务也是通过AOP技术实现的。具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-aopSpring的AOP技术主要有4个核心概念:Pointcut: 切点,用于定义哪个方法会被拦截,例如 e...
2018-02-18 23:12:18
4110
原创 如何避免java程序内存泄漏
虽然jvm有垃圾回收机制,如果程序编写不注意某些特定规则,仍然会导致java程序内存泄漏,最终可能出现OutOfMemory异常。1.Java内存泄漏的原因java中的对象从使用上分为2种类型,被引用(referenced)的和不被引用(unreferenced)的。垃圾回收只会回收不被引用的对象。被引用的对象,即使已经不再使用了,也不会被回收。因此如果程序中有大量的被引用的无用对象时
2018-01-27 13:29:01
1315
原创 SpringBoot项目中使用redis缓存
1.概述在应用中有效的利用redis缓存可以很好的提升系统性能,特别是对于查询操作,可以有效的减少数据库压力。具体的代码参照该 示例项目2.添加引用在build.gradle加入compile('org.springframework.boot:spring-boot-starter-data-redis')SpringBoot会自动引入redis相关的jar包。加入该引用后,需要在本地安装redi
2017-12-03 20:32:57
7528
1
原创 SpringBoot项目中的多数据源支持
1.概述项目中经常会遇到一个应用需要访问多个数据源的情况,本文介绍在SpringBoot项目中利用SpringDataJpa技术如何支持多个数据库的数据源。具体的代码参照该 示例项目2.建立实体类(Entity)首先,我们创建两个简单的实体类,分别属于两个不同的数据源,用于演示多数据源数据的保存和查询。Test实体类:package com.example.demo.test.data;import
2017-10-20 11:08:36
18580
1
原创 用docker搭建elasticsearch集群
概述用docker进行elasticsearch的部署非常简单,如果要实现集群配置,需要进行一些特殊的处理,本文介绍如何利用docker进行elasticsearch集群的搭建。具体的配置可以参照该 示例主节点配置docker-compose.yml配置文件es: image: elasticsearch volumes: - ./es:/usr/share/elasticsearc
2017-09-08 11:28:19
6912
3
原创 用JWT技术为SpringBoot的API增加授权保护
概述用spring-boot开发RESTful API非常的方便,在生产环境中,对发布的API增加授权保护是非常必要的。现在我们来看如何利用JWT技术为API增加授权保护,保证只有获得授权的用户才能够访问API。开发一个简单的APIspring提供了一个网页可以便捷的生成springboot程序。如图:在Search for dependencies中选择H2、Web、Security、JPA,这几
2017-08-18 17:14:01
44220
21
原创 SpringBoot框架中REST接口的异常处理方法
一. HTTP状态码100 到199 的状态码代表信息,描述对于请求的处理。200 到 299 的状态码表示客户端发来的请求已经被接收并正确处理。300 到 399 的状态码表示客户端需要进一步的处理才能完成请求,比如重定向到另一个地址。400 到 499 的状态码表示客户端的请求有错误,需要修正。404就是这种情况。500 到 599 的状态码表示服务器在处理客户端请求时发生了内部错误。
2017-02-19 17:01:50
10708
原创 SpringBoot应用基于docker和EFK的日志处理
1.概述在分布式集群环境下,单个节点的日志内容往往都是存放在自己的节点上,这种独立分散的日志存储方式会有很多问题。我们需要一个统一的日志处理中心,对日志进行收集和集中存储,并进行查看和分析。The Twelve-Factor App中有关于日志处理的建议。相应的处理技术现在也很成熟,通常会采用Elastic Search + Logstash + Kibana的技术栈(ELK)。在这篇文章中我们会采
2016-10-10 14:12:04
7687
原创 在centos上用yum安装docker
1.设置yum镜像国外的镜像安装速度很慢,采用清华大学 TUNA 镜像源。 用root用户新建 /etc/yum.repos.d/docker.repo 文件,内容如下:[dockerrepo]name=Docker Repositorybaseurl=https://mirrors.tuna.tsinghua.edu.cn/docker/yum/repo/centos7enabled=1
2016-10-09 15:53:01
3519
原创 SpringCloud服务发现(Eureka)简介
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中,实现SpringCloud的服务发现功能。 为什么要使用Eureka,因为在一个完整的系统架构中,任何单点的服务都不能保证不会中断,因此我们需要服务发现机制,在某个节点终端后,其它的节点能够继续提供服务,从而保证整个系统是高可用的。 服务发现有两种模式:一种是客
2016-09-21 15:24:39
40526
原创 让程序常驻后台运行的原理和方法
unix中进程组织结构为 session 包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。 与终端交互的进程是前台进程,否则便是后台进程
2016-09-10 13:28:19
5194
翻译 OAuth 2.0 教程
OAuth 2.0 (原文:http://tutorials.jenkov.com/oauth2/index.html)OAuth 2.0 教程OAuth 2.0 是一个开放的标准协议,允许应用程序访问其它应用的用户授权的数据。例如:一个游戏可以获取Facebook中的用户信息,或者是一个地理位置程序可以获取Foursquare的用户信息等。 这儿是一个示例图: 首先用户进入游戏的web应用
2016-09-04 16:47:50
9313
2
原创 JSP网页字符集编码
1. JSP网页编码的指定 JSP网页编码用语句来指定,其中的UTF-8就是JSP文件编码的格式。 JSP文件编码有两个作用: • 表明JSP文件本身的字符编码格式,是ASCII,还是UTF-8等等。这种格式在jsp翻译成java文件时会有影响,大家都知道,jsp文件在被访问时会先被编译成servlet,程序实际访问的是jsp对应的servlet,而不是jsp本身。js
2016-08-31 14:31:51
5846
翻译 Secure REST API with oauth2 (翻译)
1.概述在这个教程中,我们将用oauth2对REST API进行安全控制,并在一个简单的AngularJS客户端程序中使用。 我们将要构建的应用包含四个独立的模块: * Authorization Server * Resource Server * UI implicit – 使用 Implicit Flow 的前端应用 * UI password – 使用 Pass
2016-08-31 14:30:09
9145
原创 MacOSX环境用Docker安装gitlab
MacOSX本身不支持Docker,需要安装DockerToolbox来使用Docker。1.下载DockerToolbox,可以从百度网盘下载,版本是1.8.3,下载地址:http://pan.baidu.com/s/1c00SMAW2.安装Docker执行安装程序,按照提示一路操作即可。会安装VirtualBox虚拟机,Kitematic管理程序。用Kinemati
2015-10-25 21:50:00
4711
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人