Decorative image frame

利用AOP编程实现springboot多数据源的切换

为什么需要多数据源切换

在正式的、较大的项目中,很少会只有一个数据库的,至少都会有一个主数据库和一个从数据库,从数据库作为数据备份以及数据读取,而主库作为数据写入;因此就产生了一个问题——如何在项目中做到数据源的切换,如何根据操作进行数据库主从的切换。

解决

在利用springboot集成mybatis的时候,mybatis的sessionFactory由springboot进行创建,而sessionFactory由依赖于数据库连接,因此,首先就是需要解决数据源的问题,这里,利用springboot的注入功能,去注入三个DataSource的bean——masterDataSourceslaveDataSource以及dynamicDataSource,而dynamicDataSource这个我们需要加上@Primary注解,表明这个是优先注入的DataSource对象

Read More...

利用Netty、SpringBoot以及Dubbo构建一个分布式的消息通知系统(初版)

前话

之前在接商业外包的时候,遇到了一个需要服务端主动推送消息的需求,当时由于对Netty的不熟悉以及没有很好的理解Netty的websocket,因此用了SSE去解决了这个问题,但是缺点就是会占用大量的带宽

Netty的websocket

Netty的一个链接就是一个channel(通道),因此,如果要实现服务端的主动消息推送,那么就要实现对channel的统一管理;幸运的是,Netty其内部已经实现了对channel的统一管理的容器——ChannelGroup,ChannelGroup其内部用了一个ConcurrentMap<ChannelId, Channel>来作为channel的承载容器,而channelId是channel的一个属性,但是,如果仅仅依靠ChannelGroup还不能够实现真正可用于生产环境中的消息推送系统,因为channelId与业务是完全没有关联的,因此,我这里又用了一个ConcurrentMap<String, ChannelId>来实现用户的业务标识与channelId的对应关系:当客户端需要连接消息推送中心时,需要带上自己的业务编号信息,然后,服务端接收消息后将用户业务编号解析并与channel一同存储到自定义的管理容器中

Read More...

关于使用nginx实现图片防盗链

什么是nginx

nginx中文文档

什么是Referer

Referer 首部包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 首部识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

通俗来说,假如我通过Google搜索去搜索referer,然后搜索引擎给出了一堆链接,这个时候,我点击链接,那么http头就会带上referer字段信息,并且值就是Google搜索的url地址https://www.google.com;因此,假设从A网址到B网址,那么这个referer字段就告诉B网址该请求是从A网址发起的。

Read More...

Java实现class文件热替换

classloader

java的classloader是实现将java文件编译后产生的字节码加载进内存当中,最终成为可被java虚拟机直接使用的java类型。而原生的java虚拟机中的classloader,如果我们想直接实现class文件的热替换,是不可能的,因为java虚拟机双亲委派模型的限制;因此,为了实现我们目标——class文件热替换,必须实现一个我们自己的classloader

Read More...

leetcode回顾——Spiral Matrix III

题目

On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east.

Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column.

Now, we walk in a clockwise spiral shape to visit every position in this grid.

Whenever we would move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.)

Eventually, we reach all R * C spaces of the grid.

Return a list of coordinates representing the positions of the grid in the order they were visited.

Read More...

如何利用JDK代理以及注解简单实现SpringSecurity的方法权限控制

SpringSecuriry 方法权限控制

在java-web中,经常会涉及权限问题:restful接口的权限访问、数据库接口权限访问、方法权限访问等等,这些权限的问题,如果要手动去实现的话,对于restful接口的权限访问还比较好解决,写一个HttpFilter拦截器,拦截需要验证的url进行相应的权限验证即可;但是方法呢?方法可没有像HttpFiler一样的东西呀,怎么去实现这个方法的权限拦截验证?这时,SpringSecurity解决了这个问题,利用注解以及依赖注入、动态代理,成功的解决了方法的权限拦截这个问题。

Read More...

使用Java的观察者以及定期任务实现redis的缓存过期机制

什么是观察者模式

观察者模式,顾名思义,就是一个对象去观察另一个对象,当被观察对象发生改变时,能够被观察者所观察到并作出相应的反应;举个例子:

1
商店的自动门,其中,顾客是可以被观察的对象,而自动门上的红外感应器,可以称作观察者,当感应器捕捉到有顾客靠近门时,通知相应的设备执行一系列操作,从而打开商店的门,让顾客进来。

观察者模式离不开两个重要的对象—-Observable以及Observer

Read More...

手动实现spring中的@RequestMapping注解

初期介绍

@RequestMapping注解的使用

用过Spring框架的同学或许都使用过@RequestMapping注解吧,这个注解可以方便的将URL映射到我们的方法中。那么,这个是如何实现的呢?在之前我有一篇博客,关于手动实现@ModelAttribute注解的文章;在这篇文章中,采用了java的注解以及反射技术实现了web表单提交的{name:value}值注入到指定的对象中去。同样,我们也可以使用相同的技术{注解、反射}来实现@RequestMapping注解的功能。

@RequestMapping注解功能的一些原理

Read More...