springboot 动态给注解属性参数赋值

这边是结合最近开发的kafka功能加以示例

yml配置文件

配置映射的Java bean

Controller里使用配置属性进行注解动态设值

 

 

 

 

0

Spring Boot 如何自定义kafka 消费者配置 ContainerFactory

本篇博文主要提供一个在 SpringBoot 中自定义 kafka配置的实践,想象这样一个场景:你的系统需要监听多个不同集群的消息,在不同的集群中topic冲突了,所以你需要分别定义kafka消息配置。

此篇文章会在SpringBoot 提供的默认模板上提供扩展,不会因为你自定义了消费者配置,而导致原生SpringBoot的Kakfa模板配置失效。

1 引入 MAVEN 依赖

版本需要你自己指定

2 引入Java配置类

3 yml模板

4 配置释义

点开 KafkaProperties 这个类,可以看到这个是SpringBoot 自动配置kafka的配置类,引入这个实例,就相当于你拿到了SpringBoot kafka配置模板的参数,就是上述贴的配置,然后再此基础上重新定义你需要改变的配置,这里主要讲消费者配置。

代码中举了个重写监听servers的例子:

5 @KafkaListener 使用 containerFactory

如果在@KafkaListener属性中没有指定 containerFactory 那么Spring Boot 会默认注入 name 为“kafkaListenerContainerFactory” 的 containerFactory。具体源码可跟踪:KafkaListenerAnnotationBeanPostProcessor中的常量:

 

0

SpringBoot + websocket 定时任务完成实时数据(加密)推送前端

一、业务场景

登录数,与游客数,实时推送至前端,完成看板统计功能的页面动态展示

二、实现步骤

1.websocket

完成实时推送我使用的是websocket.
每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket)。它可以让我们使用注解,很简单的进行Websocket开发,让我们更多的关注业务逻辑。它底层使用的是Tomcat,且不说把整个Tomcat放进一个WebSocket服务中是否会太重,但在大数据量高并发的场景下,它的表现并不是非常理想。

Netty一款高性能的NIO网络编程框架,在推送量激增时,表现依然出色。(关于性能与表现的讨论,网上很多,这里不过多说明。)很多流行开源项目都在使用Netty,如:Dubbo、Storm、Spark、Elasticsearch、Apache Cassandra等,这得益于Netty的并发高、传输快、封装好等特点。

但是,要在SpringBoot项目中整合Netty来开发WebSocket不是一件舒服的事,这会让你过多的关注非业务逻辑的实现。那么,是否有一款框架,能使得在SpringBoot项目中使用Netty开发WebSocket变得简单,甚至优雅,并且可以从使用spring-boot-starter-websocket开发的项目无缝的迁移过来呢?

netty-websocket-spring-boot-starter

这是个开源的框架。通过它,我们可以像spring-boot-starter-websocket一样使用注解进行开发,只需关注需要的事件(如OnMessage)。并且底层是使用Netty,当需要调参的时候只需要修改配置参数即可,无需过多的关心handler的设置。

添加依赖

2.SpringBoot定时任务(基于注解(@Scheduled))

基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。

1.创建定时器

3.传输加密

websocket一般在传输过程中加密,我采用的是Aes加密方法,具体加密代码请移步:

后台Java代码

依赖的maven包

前端js代码

4.代码分析

 

0

springboot整合logback日志框架

一、添加依赖

但是呢,实际开发中我们不需要直接添加该依赖,你会发现spring-boot-starter其中包含了 spring-boot-starter-logging,该依赖内容就是 Spring Boot 默认的日志框架 Logback+SLF4J。而 spring-boot-starter-web 包含了spring-boot-stater,所以我们只需要引入web组件即可:

二、默认配置

默认情况下Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.properties中设置logging.file或logging.path属性

三、logback-spring.xml

可以看到上面那种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,将xml放至 src/main/resource下面。

 

 

0

Spring boot 2.0 版本报错 ResourceHttpRequestHandler cannot be cast to HandlerMethod

报错

java.lang.ClassCastException: org.springframework.web.servlet.resource.ResourceHttpRequestHandler cannot be cast to org.springframework.web.method.HandlerMethod

原因

Spring boot 2.0对静态资源也进行了拦截,当拦截器拦截到请求之后,但controller里并没有对应的请求时,该请求会被当成是对静态资源的请求。此时的handler就是 ResourceHttpRequestHandler,就会抛出上述错误。

解决办法

在WebMvcConfiguration的拦截器那里排除静态资源的请求路径

然后再preHandler报错那里加上 instanceof关键字进行判断。

0

使用maven-assembly-plugin插件进行自定义打包

介绍

Maven的Assembly Plugin使开发人员能够将项目输出组合到一个可分发的存档中,该存档还包含依赖项,模块,站点文档和其他文件。

您的项目可以使用预制的装配体描述符之一轻松构建分发“装配体”。 这些描述符处理许多常见的操作,例如将项目的文件以及生成的文档打包到单个zip存档中。 或者,您的项目可以提供自己的描述符,并且可以对程序集中的依赖项,模块,文件集和单个文件的打包方式进行更高级别的控制。

当前,它可以创建以下格式的发行版:

  • zip
  • tar
  • tar.gz (or tgz)
  • tar.bz2 (or tbz2)
  • tar.snappy
  • tar.xz (or txz)
  • jar
  • dir
  • war
  • 等等

实战

pom.xml

工程截图

package.xml

pid文件

web-server.bat脚本

web-server.sh脚本

打包命令

打包完的截图

打包完的截图
打包完的截图
解压后的文件
解压后的文件

lib文件下放了所有用到的jar包,要想运行程序,直接运行脚本文件即可。很方便。使用maven-assembly-plugin插件进行自定义打包就介绍完成了。

0

Spring Boot项目使用Docker和Kubernetes(k8s)进行容器化部署

Spring Boot项目的结构

项目名称是Test

  1. 项目根据环境不同需要读取不同的application.yml
  2. 项目使用logback作为日志工具,需要读取一个logback-spring.xml的配置文件。
  3. 项目还需要读取一个properties文件。
  4. 为方便,所有Kubernetes资源均在default namespace下。
namespace

Kubernetes的许多资源对象都隶属于某个namespace,namespace是对资源的逻辑划分,不同namespace下的资源可以做到简单隔离。

准备工作

镜像

针对项目jar包,我们需要将其打成一个Docker镜像,而Dockerfile就是打包过程的指导文件,类似于make过程中的Makefile

jar->Docker镜像

以下是Dockerfile的内容。


  1. FROM表示要生产的镜像的基础镜像,我们使用jdk8。
  2. VOLUME表示定义一个匿名卷,也可以理解为创建一个目录,这里的/tmp是由于tomcat的需要。
  3. ADD表示将项目编译后的jar包拷贝到镜像里,默认为根目录/
  4. ENTRYPOINT表示入口点,即容器启动时执行的命令,通过上述组合,实际执行的命令为:java -Djava.security.egd=file:/dev/./urandom -jar -Dspring.config.location=/etc/config/application.yml -Dlogging.config=/etc/config/logback-spring.xml -DconfPath=/etc/config /test.jar
    注意这里的配置路径/etc/config还不存在,下文中会创建和用到。

配置

Kubernetes ConfigMap

ConfigMap可以用来保存单个的键值对,也可以保存配置文件。

配置文件->ConfigMap

针对项目配置,需要做的改造就是把配置文件(应用、日志、业务)转化成ConfigMap对象,从而让Kubernetes化后的应用能够读取。

以下是test-config.yml的内容。


  1. 注意配置文件按照yaml规范缩进。
  2. data属性里记录实际的配置,本质上仍是键值对,如第一个数据的key为application-yml,内容为其配置内容。

应用部署定义

Kubernetes Deployment

Deployment是一种控制容器组的对象,在Deployment中定义一个期望的容器组的数量,Deployment在创建后会维持这个数量,当数量少于期望时会新建容器组,反之会停止超额的容器组。

部署->Deployment

针对本项目,对应的Deployment配置如下。

test-deployment.yml内容如下。


  1. replicas即为此Deployment期望的容器组的数量。
  2. metadata.labels用于跟下文中的Service对接。
  3. spec.selector.matchLabels与容器组的spec.template.metadata.labels对接。
  4. spec.template.spec.volumes定义了一些卷,name为卷名。
    • 如果定义了configMap属性,则items属性的key对应上文中ConfigMap对象的名称,path则为要输出的文件,如第一个item的行为是读取ConfigMap对象test-config的第一个数据的内容(key=application-yml),并将其保存为application.yml配置文件。
    • 如果定义了hostPath属性,则是宿主机上的同名目录,如此处将容器日志输出到宿主机的/var/log/test路路径。
  5. spec.template.spec.containers定义了容器组中的容器,包括容器名、镜像、容器暴露的端口,以及要挂载的卷,在volumeMounts中,name为上述卷名,mountPath为挂载路径,从而容器内部存在/etc/config路径,且可以读取到上述配置文件。

服务定义

Kubernetes Service

默认情况下,Kubernetes集群内的容器是不能被集群外访问的。此时我们需要将应用连接到Service,Service可以对集群内部暴露,也可以对外暴露宿主机端口,还能通过LB VIP暴露服务。

外部访问->Service

针对本项目,对应的Service配置如下。

test-service.yml内容如下。


  1. spec.selector用于连接容器组,与上文中Deployment定义的容器组的labels对应。
  2. spec.type定义Service的暴露方式,NodePort为对集群外暴露,用户通过宿主机端口访问应用,即:
    • 用户->宿主机IP:30777->Service:7777->容器:7777

部署工作

编译jar包

不论使用Maven还是Gradle,生成jar包,此处不细说。

生成Docker镜像

使用以下命令生成Docker镜像,当然,前提是生成镜像的机器上需要有基础镜像openjdk:8-jdk-alpine


同时,需要让所有Kubernetes的Node能获取到该镜像,有两种途径:

  1. 将该镜像打包并在所有Node上加载。

  2. 将该镜像推送到所有Node均能访问的镜像仓库里。
创建Kubernetes资源

分别创建ConfigMap、Deployment、Service。


验证

查看资源对象是否正常。


访问服务。


+2

vue + springboot + poi 实现模板文件下载

前文《el-upload+springboot实现excel文件手动上传导入数据》讲了数据导入功能,但其实在导入之前一般都是要有个下载导入模板的功能。这篇文章介绍下这个功能。

element-ui的button代码

js代码

springboot的controller代码

0

el-upload+springboot实现excel文件手动上传导入数据

vue 前端代码

springboot 后端代码

0

vue+springboot+hutool-poi实现导出excel

vue

springboot

hutool-poi pom 依赖

总结

以上就是vue+springboot+hutool-poi实现导出excel核心代码

+2