背景
首先请思考一下以下代码执行的结果:
- LogAop.java
1 | //声明一个AOP拦截service包下的所有方法 |
首先请思考一下以下代码执行的结果:
1 | //声明一个AOP拦截service包下的所有方法 |
本文介绍的是proxychains-ng项目
在 linux 上运行一些命令的时候,经常访问到国外的网站,速度非常的慢,例如用git
、wget
等等,这个时候就可以通过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
是SpringMVC
中的一个重要组件,作用是扫描@Controller
、@RequestMapping
注解修饰的类,然后生成请求
与方法
的对应关系,当有一个 HTTP 请求进入 SpringMVC 时,就会通过请求找到对应的方法进行执行。
可以简单的想象一下,在RequestMappingHandlerMapping
会维护一个Map<String,Handle>
,key 存放的是URI
,value 存放的是对应处理的handle
,例如:
1 | map.put("GET /user",UserController#get) |
这样通过解析请求就可以很快的找到对应的方法去执行,当然 SpringMVC 的实现肯定不会像上面一样这么简单,不过思路是差不多的。
最近在开发一个功能时,需要通过 http 协议上报大量的日志内容,但是在 Go 标准库里的 http client 的 API 是这样的:
1 | http.NewRequest(method, url string, body io.Reader) |
body 是通过io.Reader
接口来传递,并没有暴露一个io.Writer
接口来提供写入的办法,先来看看正常情况下怎么写入一个body
,示例:
1 | buf := bytes.NewBuffer([]byte("hello")) |
需要先把要写入的数据放在Buffer
中,放内存缓存着,但是我需要写入大量
的数据,如果都放内存里肯定要 OOM 了,http client 并没有提供流式写入
的方法,我这么大的数据量直接用Buffer
肯定是不行的,最后在 google 了一番之后找到了解决办法。