0%

背景

首先请思考一下以下代码执行的结果:

  • LogAop.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//声明一个AOP拦截service包下的所有方法
@Aspect
public class LogAop {

@Around("execution(* com.demo.service.*.*(..))")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
try {
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
Object ret = joinPoint.proceed();
//执行完目标方法之后打印
System.out.println("after execute method:"+method.getName());
return ret;
} catch (Throwable throwable) {
throw throwable;
}
}
}
阅读全文 »

Maven-Helper 插件介绍

这个插件能可以通过 UI 界面的方式来查看 maven 项目的依赖关系,当然还有最重要的功能解决依赖冲突,使用起来非常的方便,效果图:

在开发 JAVA 项目的时候,经常会由于 maven 依赖冲突导致项目启动失败,这个时候往往会懵逼,到底哪个依赖冲突了,需要排除哪个子依赖,有了这个插件之后就可以很快的定位到冲突的组件,并进行排除。

阅读全文 »

proxychain 介绍

本文介绍的是proxychains-ng项目

在 linux 上运行一些命令的时候,经常访问到国外的网站,速度非常的慢,例如用gitwget等等,这个时候就可以通过proxychain工具来使用代理进行网络访问,使用教程如下:

1
proxychains4 git clone git@github.com:rofl0r/proxychains-ng.git

在所有要运行的命令行之前加上proxychains4就可以通过代理进行网络访问了。

阅读全文 »

背景

在一次升级阿里云 k8s 版本之后暴露出来一个问题,一般在 k8s 集群中都会使用service域名来进行服务之间访问,但是为了在本地开发时能访问到这些服务,又会通过ingress暴露在外网中,这样在开发的时候就可以直接使用的ingress暴露的外网域名进行访问。

按理说本地开发环境的时候使用外网域名,在部署到 k8s 的时候应该使用 k8s 内部的service域名就什么事都没有了,然而在没有强约束的情况下很多项目调用集群内部服务的时候还是使用的外网域名,然而这样可能会导致服务调用失败,没想到吧。对此我们咨询了阿里云,给我们的回答是:

好吧,按着提示把externalTrafficPolicy选项修改为Cluster,确实问题解决了,但是这样一改又把源IP丢失了,在后端服务中获取的IP都变成了Node IP,这肯定也不行。

阅读全文 »

RequestMappingHandlerMapping 介绍

RequestMappingHandlerMappingSpringMVC中的一个重要组件,作用是扫描@Controller@RequestMapping注解修饰的类,然后生成请求方法的对应关系,当有一个 HTTP 请求进入 SpringMVC 时,就会通过请求找到对应的方法进行执行。

可以简单的想象一下,在RequestMappingHandlerMapping会维护一个Map<String,Handle>,key 存放的是URI,value 存放的是对应处理的handle,例如:

1
2
map.put("GET /user",UserController#get)
map.put("POST /user",UserController#create)

这样通过解析请求就可以很快的找到对应的方法去执行,当然 SpringMVC 的实现肯定不会像上面一样这么简单,不过思路是差不多的。

阅读全文 »

背景

最近在开发一个功能时,需要通过 http 协议上报大量的日志内容,但是在 Go 标准库里的 http client 的 API 是这样的:

1
http.NewRequest(method, url string, body io.Reader)

body 是通过io.Reader接口来传递,并没有暴露一个io.Writer接口来提供写入的办法,先来看看正常情况下怎么写入一个body,示例:

1
2
buf := bytes.NewBuffer([]byte("hello"))
http.Post("localhost:8099/report","text/pain",buf)

需要先把要写入的数据放在Buffer中,放内存缓存着,但是我需要写入大量的数据,如果都放内存里肯定要 OOM 了,http client 并没有提供流式写入的方法,我这么大的数据量直接用Buffer肯定是不行的,最后在 google 了一番之后找到了解决办法。

阅读全文 »

前言

网上都在调侃CRUD没有技术含量,但是不可否认的是在工作中无可避免的要做大量的CRUD,这里面会存在大量的重复工作,意味着可能会写大量的冗余代码,秉着能少写一行代码绝不多写一行的原则,不应该把时间浪费在这些重复的工作中的,在这里分享两个方案来用尽量少的代码实现CRUD,一个是spring-data-rest还有一个是我自己封装的一套框架monkey-spring-boot-starter,下面一一进行介绍。

阅读全文 »

HSTS 简介

HSTS(HTTP Strict Transport Security)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用 HSTS 策略,来让浏览器强制使用 HTTPS 与网站进行通信,以减少会话劫持风险。

背景

有时候由于某些开发的需要,想访问 http 协议的接口,但是由于 HSTS 的机制,浏览器一直会强制跳转到 https,没办法调试,所以得把 HSTS 记录清除掉。

清除步骤

  1. 浏览器访问chrome://net-internals/#hsts
  2. 找到Delete domain security policies选项,输入对应的域名点击删除即可

前言

平常开发 spark 应用的时候,为了快速验证程序是否正确一般都会设置masterlocal模式来运行,但是如果想用集群环境来运行的话,就需要打一个 jar 包用spark-submit进行任务提交,但是在开发过程中频繁打 jar 包提交也是一件麻烦事,查阅相关资料之后发现其实可以在本地运行代码的时候指定集群环境来运行,达到快速调试的目的。

阅读全文 »

前言

最近在公司搭建了一个 CDH 测试环境集群,从官网得知 CDH 在 6.3.3 版本开始不再提供免费版本了,于是选择了 6.2.x 版本进行安装,这里记录一下正确的离线安装步骤,避免下次安装时又踩坑。

阅读全文 »