自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(54)
  • 问答 (2)
  • 收藏
  • 关注

原创 【小红书】安全技术部研发岗位招聘

我们是小红书的安全技术团队,负责小红书基础安全、系统安全和业务安全的中台能力建设;在这里你将和其他小伙伴们一起从0到1搭建小红书安全中台体系, 助力业务快速发展;在这里你将有机会独立负责一个领域的架构设计, 有机会解决数十万乃至百万级别QPS的高并发场景下的各种问题;在这里你将有机会接触和深入了解小红书的所有业务, 成为互联网内容平台领域的技术专家和业务架构师;在这里你将和其他小伙伴一起学习和深化互联网安全领域方方面面的知识,有足够大的舞台去实现自己的想法和创意,成为互联网安全领域的技术专家和技术架

2022-03-24 15:21:33 4591

原创 set values for System.getenv()

set values for System.getenv()System.getenv()可以获取系统的环境变量,这个环境变量不可以通过程序修改,但有些场景下,可能需要在程序启动时,手动注入部分环境变量(比如,本地测试?)。最近在看相关源码时,偶然翻到一种方式来实现这样的场景。备注下实现方式: private static Map<String, String> getFieldValue(Class<?> klass, Object object, String nam

2021-12-20 14:29:56 359

原创 JPA + Hibernate + MySQL Cluster 事务处理

jpa查询数据库时,默认会开启事务,当数据库采用master-slave的架构部署时,事务请求会默认达到master节点,这样会导致master节点的负载过高。下面是对这个问题的分析和处理。首先,默认情况下jpa启动时,会和MySQL数据库产生如下交互:SET NAMES utf8mb4SET character_set_results = NULLSET autocommit=1autocommit=1,是应用向MySQL数据库发起自动提交设置。在自动提交模式下,所有的sql请求都会自动提交。

2021-12-18 18:58:16 1030

原创 JPA查询下@ManyToMany导致的N+1次query的问题

这里写自定义目录标题概述假设模型添加数据解决方案概述Spring Data Jpa底层默认使用Hibernate作为ORM框架, Hibernate有一个非常典型的N+1查询的问题。这个问题在有些场景下会非常影响系统稳定性。下面是实际工作中遇到的问题,主要背景如下:系统使用Hibernate对配置模型进行抽象建模,配置模型存储在MySQL数据库中;系统每隔一段时间,会全量加载所有配置信息,刷新实例本地的内存配置,由于使用了@ManyToMany、@ManyToOne、@OneToMany等注解,

2021-12-16 11:38:58 2233

原创 高配置小集群还是低配置大集群?

nebula图数据库其实就是一个存储层。最开始以为nebula除了使用图模型存储数据之外,还包含了一系列的基于图数据实现的各类数据挖掘算法,最后发现它并没有想象中的那么复杂。也对,毕竟功能越简单的产品,越能做得性能出众。功能复杂了,反而可能失去聚焦。nebula的基础组件分成三块:meta:元数据管理,现在的分布式应用中,单独抽出一个组件管理元数据已经是常见玩法了 storage:存储组件,存储nebula中的各类数据 graph:查询组件,支持各类图上的查询语句的解析和处理这三个组件在操作系

2021-04-19 19:25:59 263

原创 克莱因瓶在现实中为什么不存在

克莱因瓶是一个密闭的空间体,对比的对象是球体,而不应该是玻璃杯。玻璃杯有杯口,内部和外部的空间从杯口的切面处分割开来。杯口如果不加盖子,则内外部空间是联通的。球体是闭合的,直观上很容易区分出球外表面和球内表面,以及球外空间和球内空间,且它们都是相互隔离的。克莱因瓶也是闭合的,但不存在内表面和外表面,也不存在内空间和外空间,内就是外,外就是内。为什么克莱因瓶无法存在于三维世界?因为若想让密闭三维物体不存在内外之分,“平整”的三维空间肯定是做不到的,一定得让空间扭曲…二维平面中,左侧脸如何变成右侧脸

2021-04-18 12:36:26 544

原创 关于Spring容器启动过程中,因 FactoryBean导致的循环依赖的问题分析

§ 一个排列组合问题假设存在如下的配置类: @Configuration publicclassExperienceCenterConfig { @Resource privateThriftServerAddressProvider thriftServerAddressEdsManager; @Bean publicThriftServiceClientProxyFactory experience...

2021-04-07 10:25:33 428

原创 Spring框架解析之对象排序

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍bean对象排序概念、方法和实现。1 背景Spring框架中可以管理多个类型相同的bean对象,这有两层原因。 Spring支持对Collection对象的注入,这本身就意味着Spring可以管理多个相同类型的bean对象; Java是一种OOP语言,天然存在着继承和多态。不同类型的bean对象自然也就可能继承自相同的父类。从IoC容器中拿到的是单个对象,还是多个对象的集合,则取决于使用者从继承链上的哪个层级获取对象了。

2021-02-07 12:22:31 562

原创 Spring框架解析之@Import

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍Spring IoC中的@Import注解。功能解释@Import annotation allows for loading @Bean definitions from another configuration class@Import注解支持从其他的配置类中加载@Bean的定义。一般通过在程序中使用配置类的方式定义所有的bean对象,但当我们希望使用工程中引入的其他包的配置类时,@Import注解就非常有用了。它可以帮

2021-02-07 12:21:50 281 2

原创 Spring框架解析之@ComponentScan

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍@ComponentScan。1 自动扫描机制@ComponentScan注解在Spring中用来定义IoC容器需要扫描哪些类文件。在这些类文件中,所有以@Component标注的对象和以@Bean标注的方法都会被自动加载到IoC容器中。另外,除了@Component注解之外,其他诸如@Controller、@Configuration、@Service这些继承了@Component注解的注解,也同样适用于上述的扫描规则,均会被自动加

2021-02-07 12:21:16 245

原创 Spring框架解析之@Configuration

​本文是Spring IoC容器技术介绍系列文章之一。本文介绍@Configuration的使用以及原理。1 概念介绍Annotating a class with @Configuration indicates that its primary purpose is as a source of bean definitions.上述是Spring官方文档中用于介绍@Configuration的一段话,大意是说在类上使用@Configuration标注则表明该类的主要目的是作为bean定

2021-02-07 12:20:40 841

原创 SpringFactoriesLoader类和spring.factories文件

本文将介绍spring-core中的SpringFactoriesLoader和spring.factories。​1 引言在Spring Web MVC配置方式汇总(二)和Spring Web MVC配置方式汇总(三)中我们介绍了反射、SPI和SCI机制。这些技术框架或名词看似毫不相关,其实本质上处理的是一样的问题,都是将程序或应用的部分控制逻辑暴露出去,便于配置和调整。控制反转是IoC容器的标准特性,我们曾经在文章中也说过:Spring的IoC容器的设计思想便是将对象管理、对象与对象间的依赖

2021-02-07 12:19:21 356

原创 浅谈servlet-mapping的机制(二)

本篇文章将结合源代码介绍servlet-mapping的映射机制。​1 DefaultServletTomcat包中有个类的名字叫DefaultServlet,顾名思义就是默认的Servlet。那这个类有何作用呢?我们看下它的Javadoc描述:DefaultServlet的javadoc简单翻译下就是说DefaultServlet会默认映射到/路径下,它的作用是处理所有的静态资源请求。Web应用启动后默认有两个文件夹下的文件是不能直接被客户端访问的,一个是META-INF,另一个是

2021-02-07 12:18:36 772

原创 浅谈servlet-mapping的机制(一)

​本篇文章将结合源代码介绍servlet-mapping的映射机制1 引言在Web应用中,经常会涉及到字符串匹配的问题。比如使用AbstractAnnotationConfigDispatcherServletInitializer的方式启动Web应用时,我们需要重写这个方法:@OverrideprotectedString[]getServletMappings(){returnnewString[]{"/"};}这里面的/是啥意思?为什么有时候还会出现/*和/**...

2021-02-07 12:17:54 1407

原创 Spring工程的通用配置模式(一)

Spring的很多子项目都涉及到配置。在这些项目中,存在一个较为通用的配置模式,了解该模式有助于我们更好地理解框架。本文将对这一模式进行介绍。我们会先介绍Spring Web MVC框架,之后再结合其他相似的项目进行总结。​1 Registryregistry是登记、注册的意思。以Registry结尾的对象用于完成特定功能的配置。比如CorsRegistry用来配置应用的跨域访问功能,ViewResolverRegistry用来配置应用的视图解析功能,FormatterRegistry用来配置应

2021-02-07 12:17:14 274

原创 Spring工程的通用配置模式(二)

​Spring的很多子项目都涉及到配置。在这些项目中,存在一个较为通用的配置模式,了解该模式有助于我们更好地理解框架。本文将对这一模式进行介绍。我们会以Spring Web MVC框架介绍,之后再结合其他相似的项目进行总结。1 @Enbale@Enable*注解通常指启用某个框架的意思,比如@EnbaleWebMvc指启用Spring Web MVC框架。该注解一般会配合@Configuration注解一起使用,放在配置类上,由ApplicationContext启动时加载。@Config

2021-02-07 12:16:34 109

原创 深入解析Spring Boot启动过程(一)

本篇文章将结合源代码介绍spring boot应用的启动过程。1 引言Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".上面这段话是Spring Boot工程官网上的第一句话。大概意思是Spring Boot应用很好,可以创建独立的、生产级别的、基于Spring框架的、可直接运行的应用。 独立:独立意味着低

2021-02-05 12:11:53 130

原创 异步请求机制介绍

本篇文章将介绍HTTP异步请求机制。1 引言Spring MVC has an extensive integration with Servlet 3.0 asynchronous request processing.DeferredResult and Callable return values in controller methods and provide basic support for a single asynchronous return value.上面这段描述来自

2021-02-05 12:11:15 786

原创 Spring Web MVC配置方式汇总(五)

​1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 @EnableWebMvc在上一篇文章中,我们已经使用过@EnableWebMvc注解进行Spring Web MVC的配置。@EnableWebMvc注解启用Spring Web MVC自动配置的特性,用于初始化Spring Web MVC框架。那么,自动配置到底配置了什么呢?前面的文章中介绍过Web应用,抽象来讲就是一个处理HTTP请求并返回HTTP响应的程序。这个程序的处理过程大致可以描述成:

2021-02-05 12:09:45 272

原创 Spring Web MVC配置方式汇总(四)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 和web.xml说再见我们终于到这一步了!我们花了两篇文章的篇幅,介绍了反射机制、SPI机制、SCI机制以及Spring Web如何和Tomcat集成。可谓是万事俱备,只欠东风了。那么,现在让我们将工程中的web.xml文件删除,着手准备使用纯Java代码的方式,让我们的Web应用启动起来。在Web应用中创建一个名为MyWebApplicationInitializer的类,类的名称可以随便取,只要

2021-02-05 12:09:04 111

原创 Spring Web MVC配置方式汇总(三)

​1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 SCI补充上一篇文章中介绍了Tomcat是如何使用类似Java SPI机制加载启动配置的,它有个专用名词叫SCI。SCI是Servlet Container Initializer的缩写,也就是Servlet容器启动器的意思。在上一篇文章中,我们给出了ServletContainerInitializer的源代码。packagejavax.servlet;importjava.util.Set..

2021-02-05 12:08:22 129

原创 Spring Web MVC配置方式汇总(二)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 反射和SPI反射的概念应该都不陌生。应用执行时操作的是指令,指令集则被抽象成代码块。OOP中将一个个代码块组合成对象(Object),Java语言就是这样。使用Java语言编程其实就是构建这样一个个的对象(Object),而后对这些对象(Object)进行操作。有时候仅仅操作这些对象并不够,在特定语境下需要对操作对象的动作进行抽象和表述,比如调用Car对象的start()方法。这就是反射,反射其实是使用

2021-02-05 10:59:49 180 1

原创 Spring Web MVC配置方式汇总(一)

1 Spring Web MVC本文将介绍Spring Web MVC的几种配置方法。2 准备工作首先得有一个工程,我们随便建一个web工程,比如SpringMvcTest。按照从零搭建Web应用中介绍的,先调整下pom.xml文件。<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://ww...

2021-02-05 10:59:14 644

原创 从零搭建Web应用(二)

1 Java Web本文将从最基础的HTTP协议开始讲起,介绍如何徒手搭建Web应用,内容如果比较多的话,后面会分成多篇逐步介绍。2 皇冠上的明珠-Apache不知道Apache的研发不是好的研发,若你的主语言是Java则更是如此。Apache事实上是很多技术标准的制定者和践行者。比如我们现在要说的Maven和Tomcat。Tomcat是Web容器的一种,那什么是Web容器呢?在上一篇文章中,我们提到Servlet。Servlet其实是Java语言的一部分,其给出了一个Web应用该如何处

2021-02-05 10:58:32 169

原创 从零搭建Web应用(一)

​1 Java Web本文将从最基础的HTTP协议开始讲起,介绍如何徒手搭建Web应用,内容如果比较多的话,后面会分成多篇逐步介绍。2 HTTP协议Web应用被称之为B/S架构,与其对应的的是C/S架构。这里面的B是Browser(浏览器),C是Client(客户端),S是Server(服务器)。客户端需要直接安装在访问终端上,不同访问终端(主要指不同的操作系统)需要提供不同的安装包,这增加了软件投产成本,换言之也就是软件可移植性差。B/S架构则相对简单,只要访问终端安装了浏览器就可以使用。现在

2021-02-05 10:57:55 623

原创 使用Spring Security做方法层的权限拦截

Spring Security中可以通过Authentication(认证)和Authorization(授权)的功能,识别用户身份并完成用户授权。通常的做法是在用户访问某些资源时,通过拦截器方法确认用户身份,如果当前用户身份不明(未登录或者是匿名用户)且被访问资源是非公开资源时,系统会强制跳转至登录页面,在用户登录完成后再跳转回原地址,继续访问资源。这些拦截功能基本都是使用Filter在请求未到达DispatcherServlet前就完成处理了。但如果我们需要在细粒度上进行访问权限控制的话,那该怎

2021-02-04 10:35:12 1255

原创 Spring Security防止CSRF攻击

CSRF全称是Cross-site request forgery,翻译过来的意思是跨站请求伪造。HTTP协议本身是无状态的,这意味着HTTP协议本身无法识别并记录客户身份。​为了实现用户登录并保持登录状态的功能,就要求在HTTP协议之上增加新的特性和功能,将无状态的HTTP协议变成可以支持状态保持的服务。这个技术就是Session和Cookie。Cookie是保存在浏览器端的一小段数据,服务器可以通过HTTP协议,要求客户端设置本地的Cookie数据或告知客户端将Cookie数据以HTTP

2021-02-04 10:34:29 517

原创 Spring Boot下配置Spring Data Jpa项目

正常情况下,绝大部分的应用系统都少不了和数据库做交互。Java语言是面向对象的,也就是OOP(Object Oriented Programming)。传统的数据库,也就是关系型数据库RDBMS(Rational Database Management System),使用的语言叫SQL(Structured Query Language)。当面向对象编程遇到SQL时,总会有人想做到大一统。毕竟,无论怎么变化,所有的语言和技巧,无外乎都是对现实世界的抽象罢了。然后,就出现了ORM(Object

2021-02-04 10:33:49 509

原创 如何对数据库操作进行审计?

​在对关系型数据库的处理上,我们经常希望能对表的创建和更新操作进行审计,即在表上增加四个标准的字段:创建人、创建时间、修改人、修改时间。当新建一条记录时,将触发记录新增的用户和操作时间记录在创建人和创建时间两个字段中;当修改一条记录时,将触发记录修改的用户和操作时间记录在修改人和修改时间两个字段中。以前做项目的时候,会强制开发人员写的SQL中要手动设置创建人、创建时间、修改人、修改时间值并记录到数据库中。但是,这种靠Code Review和制度规范约定的方式,比较古老且不可靠。那有没有什么办

2021-02-04 10:33:05 1839 1

原创 数据库审计框架内部原理解析

​本文介绍Spring Security和Spring Data Jpa集成实现数据库操作审计功能的原理。本篇中使用的示例同如何对数据库操作进行审计?Repository首先Spring Data Jpa中的Repository资源是接口类型的。接口类型的文件在Java中主要用于定义规范。一般的接口中是不包含具体的实现代码和逻辑的。如果要实现接口中定义的功能,一般需要: 实现该接口,在具体实现类中增加相关的处理逻辑; 使用动态代理机制,比如Java Dynamic或CGL

2021-02-04 10:32:12 629

原创 数据库操作审计框架启动过程解析

​本篇文章用于介绍Spring Data Jpa数据库操作审计框架的启动过程。本文中使用的示例同如何对数据库操作进行审计?。背景在数据库审计框架内部原理解析一文中,我们曾介绍过Spring Data Jpa数据库操作审计的执行过程: 用户在页面上提交创建评论的请求,请求到达服务器端。在服务器端处理后,最终调用SimpleJpaRepository,触发EntityManager(即SessionImpl)的persist()方法,完成数据的持久化。 SessionImpl内部保存了一

2021-02-04 10:31:25 459

原创 Hibernate框架入门

​ORM全称是object/rational mapping,简单讲就是建立面向对象语言(OOP)和结构化查询语言(SQL)之间的关系。这种关系其实并不是双向的。一般指的是使用面向对象语言来描述SQL,而不是使用SQL来支持面向对象语言。这种情况主要是有两个原因导致的: OOP的结构要比SQL复杂的多,使用简单语言描述复杂语言本身就比较困难; ORM主要是方便开发人员构思软件体系结构和简化具体编码而发明的。实际项目中,大量的工作也集中在使用面向对象语言实现软件功能这部分。 所以,

2021-02-04 10:30:41 358

原创 Thrift 协议介绍

背景Thrift是一种接口描述语言和二进制通讯协议。原由Facebook于2007年开发,2008年正式提交Apache基金会托管,成为Apache下的开源项目。​Thrift是一个RPC通讯框架,采用自定义的二进制通讯协议设计。相比于传统的HTTP协议,效率更高,传输占用带宽更小。另外,Thrift是跨语言的。Thrift的接口描述文件,通过其编译器可以生成不同开发语言的通讯框架。安装在Mac OS X系统下,可以直接使用homebrew安装thrift,如下:future@Futu

2021-02-04 10:29:56 5662 1

原创 2021年推荐阅读书籍

​1. 背景2020年总算是过去了。无论是在哪个方面,2020年都注定不平凡。往大了说,新冠疫情应该改变了很多人的很多看法。对国内国外国家制度的看法,对工作生活的看法,对未来发展的期许……从小的看,我个人在2020年经历了数次工作的变动。从创业公司的执行总监,到国企部门的总经理,再到互联网公司的普通员工,整个过程充满了玄幻。时也命也!很多事情回头看时貌似轻描淡写,但过程曲折忐忑往往无法言说,只有当事人自己才知道。所以说,切肤之痛也好,酣畅淋漓也罢,总不过一段经历罢了。人生总会有起起伏伏,

2021-02-04 10:29:14 420

原创 写给所有想在新年换工作的技术从业者

致所有想在新年动一动的朋友们:1. 面试官视角我正式开始给别人面试的时间应该是在2015年左右,这么算来我的“面试官生涯”应该也有五年多了,基本上占了自己职业生涯一半还多的时间。来来回回面过的人两三百个总是有的。总体来讲,面试是个苦差事,我其实特别不喜欢给别人面试。因为要在短短的几十分钟之内,彻底认识一个人的难度是非常大的,尤其是做技术这一行。评价一个人的标准无外乎个人的工作履历和参与过的项目。个人的工作履历有时候受限于平台和环境,并不一定每一个能力出众的候选人都有一份漂亮的履历。项目经验上

2021-02-04 10:28:07 151

原创 log4j配置文件加载逻辑调试方法

使用Spark开发弹性计算框架时,由于Scala语言对Spark的原生支持比较好,所以一般会采用Scala编写代码。Scala底层使用的还是JVM虚拟机,和Java本身是共通的,所以Log4J原则上肯定是可以兼容Scala应用。Log4J框架使用配置文件进行日志系统的初始化,由于引入的各类jar包都有可能会包含Log4J的配置文件,首次配置起来会比较痛苦。下面备注下Log4J框架该如何找到实际生效的配置文件。1. 包依赖主要是如下三个包,log4j-api-scala是log4j在sca

2021-02-03 14:10:07 268

原创 使用信号量控制线程池任务提交速率的一个坑

​0 背景不久前,标哥(此乃一位技术非常厉害的我的同事)曾让我看过一段很有意思的代码。这段代码的目的是通过信号量控制向线程池中提交任务,避免在线程池中大量积压任务影响程序执行效率。我简化了一下,大概的逻辑如下://实际工作的线程数,假设是4staticfinalintTHREAD_CNT=4;publicstaticvoiddoWork()throwsInterruptedException{//使用了核心线程数和最大线程数都为4,且使用Synchron...

2021-02-03 14:09:14 569

原创 Spring Boot应用自动配置Kafka过程解析

​最近工作需要集成kakfa到应用中,应用的主体框架使用Spring Boot,因此研究了下Kafka在Spring Boot中的集成方案。1. 依赖引入spring-kafka包,版本号由Spring Boot自动管理。<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><...

2021-02-03 14:08:23 1619 1

原创 spring-kafka-test大揭秘

​已经到了没有测试案例,就不会写代码的年纪了!不过好在,优秀的框架或组件总是会在介绍完主体功能之后,附带介绍如何进行测试。然后,因为工作原因,又简单研究了下kafka的测试框架。其中,最神奇的地方是,Spring团队为了便于测试,秉持着能内嵌一定内嵌的原则,搞了一套内嵌的zookeeper和kafka。这样在单元测试期间,就不用开发人员再准备相关环境了。那么,下面来揭秘下具体是如何实现的:1. 依赖<dependency><groupId>org.spri...

2021-02-03 14:07:27 2429 1

原创 CAT、Kafka 以及 Apollo

微服务架构下,常见的一些基础组件的配置问题1. CATCAT 是大众点评开发的一套监控数据打点的系统,主要就是将CAT客户端集成到应用中,然后由应用异步上报系统内部服务的执行情况。​CAT本身是异步的,同时作为一个应用打点系统,需要保证无论CAT是死是活都不能影响到宿主应用。实际开发过程中,确实对应用来讲没啥影响。即使是CAT挂了,应用也照样能正常运行。但这有时候,对开发人员也头疼,尤其是想要验证自己打点逻辑对不对时,经常发现在CAT上找不到自己上报的数据!CAT是通过一个名叫client.

2021-02-03 14:06:18 675

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除