java原理
java原理
pl在之心
立足当下
展开
-
Tomcat总结
Tomcat线程模型 Tomcat容器模型 Tomcat为什么要打破双亲委托类加载机制 Tomcat热部署如何实现 Tomcat处理一个请http求的过程 Connector初始化流程 Container初始化流程 Tomcat编解码过程和中文乱码问题 Tomcat Cookie支持问题 ...原创 2020-08-14 10:51:52 · 212 阅读 · 0 评论 -
idea springboot项目设置http代理
1. 背景1) 使用nacos配置中心,客户端侧2)想了解nacos动态更新配置的原理3) 抓取idea springboot项目的http请求2. idea具体配置-Dhttps.proxySet=true -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8888Configuration--》配置3. 抓包mac系统采用Charles抓包...原创 2020-07-03 11:33:40 · 3263 阅读 · 1 评论 -
grpc Java NANO_RUNTIME does not support services
1. 背景使用grpc的maven插件生成代码时,报错Java NANO_RUNTIME does not support services2. 插件信息3. proto文件内容syntax = "proto3";option java_multiple_files = false;option java_package = "com...原创 2020-01-13 16:29:19 · 886 阅读 · 1 评论 -
dubbo check=true源码分析
1. 问题check=true到底检查的是什么?2. debug查看ReferenceConfig里面的createProxy方法if (shouldCheck() && !invoker.isAvailable()) { throw new IllegalStateException("Failed to check the statu...原创 2020-01-02 17:04:35 · 509 阅读 · 3 评论 -
dubbo 并发控制源码分析
1. 问题dubbo可以实现接口或方法层面的并发控制,它是如何实现的?2. 接口方法的并发控制(服务端)<dubbo:service interface="com.foo.BarService" executes="10" />限制该接口的每个方法并发执行不能超过10个<dubbo:service interface="com.foo.B...原创 2020-01-02 16:29:38 · 152 阅读 · 0 评论 -
分库分表之ShardingSphere 支持分布式事务 源码分析
1. 事务相关配置@EnableTransactionManagement // 支持spring事务@SpringBootApplication(scanBasePackages = "com.example.shard")public class ShardJdbcApplication { .....}@ShardingTransactionType(T...原创 2019-12-26 10:03:29 · 559 阅读 · 0 评论 -
分库分表之ShardingSphere 支持分布式事务
1. 问题分库分表多数据源如何支持分布式事务2. jar引入<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version></depen...原创 2019-12-25 18:05:07 · 1353 阅读 · 0 评论 -
idea maven 报错 使用Lombok 编译报找不到符号
1. 问题mvn compile 编译报错,找不到Lombok2. 环境1) 已经引入lombok的jar包2) idea已经安装lombok插件 ,并重启3. 查看详细日志mvn compile -X发现claspath里面的jar路径不对,显示的是windows下的路径,而我是linux系统4. 解决修改maven的setting....原创 2019-12-24 17:40:43 · 4104 阅读 · 0 评论 -
分库分表之ShardingSphere读写分离源码分析
1. 问题读写分离如何执行2. 源码ShardingMasterSlaveRouter为核心入口public SQLRouteResult route(SQLRouteResult sqlRouteResult) { Iterator var2 = this.masterSlaveRules.iterator(); while(var2.hasNe...原创 2019-12-24 16:41:12 · 490 阅读 · 0 评论 -
分库分表之ShardingSphere读写分离(springboot)
1. 问题数据库主从如何实现读写分离1) select语句走从表2) insert,update走主表2. jar包引入见之前的文章3. springboot配置#shardingspherespring.shardingsphere.datasource.names=master,slave#主库spring.shardingsphere.data...原创 2019-12-24 15:57:20 · 1652 阅读 · 0 评论 -
分库分表之ShardingSphere数据脱敏(Springboot)
1. 环境maven: 3.3.9jdk: 1.8springboot: 2.1.6.RELEASEShardingSphere: 4.0.0-RC32. maven引入jar<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId&...原创 2019-12-23 18:26:36 · 2541 阅读 · 0 评论 -
分库分表之ShardingSphere分片
1. 背景 了解分片之前,我们需要知道为什么要分库分表,本质原因还是因为单表的数据库容量有限,当数据量到达一定量级之后,数据库操作会变得很慢,影响用户体验。2. 问题什么是分片? 当我们将海量的用户信息存储在3个库的100张用户表时,不论是新增或者查询,我们都需要知道具体操作的是哪个数据库的哪张表,此时,分片可以理解为具体的一张表,选择分...原创 2019-12-19 14:37:16 · 336 阅读 · 0 评论 -
分库分表之ShardingSphere概念
1. 问题带着下面一些问题,我们开始学习分库分表1) 逻辑表是什么2) 真实表是什么3) 数据节点是什么4) 绑定表是什么5) 广播表是什么2. 逻辑表水平拆分的数据库(表)的相同逻辑和数据结构表的总称例如,用户信息表按用户id尾数拆分为10张表,分别为user_0到user_9, 他们的逻辑表为user3. 真实表在分片的数据库中真实存...原创 2019-12-19 14:17:19 · 118 阅读 · 0 评论 -
tomcat如何处理post请求base64格式入参
1.几个问题1) post请求参数是否编码2) post请求参数为json, 是否编码 最近项目中遇到一个问题,某个业务的接口需要传一个签名参数,但是签名中包含一些特殊字符,debug发现服务端接受到的参数会将某些特殊字符过滤掉,比如/ .环境信息:1) 服务器: tomcat82)请求接口协议: http3) http请求方式: post...原创 2019-12-03 10:12:28 · 1242 阅读 · 0 评论 -
tomcat编解码过程
在使用tomcat的时候, 一直很好奇他是怎么对请求的参数进行编解码的,带着下面三个问题,一起看下。1. get/post请求参数如何编解码,根据请求头部中什么参数配置2. URI编码3. 中文参数为什么会出现乱码4. POST请求参数form表单和Json编码策略是否一样1. 下图是tomcat各版本默认的编解码方式我们发现tomca6和tomcat7对UR...原创 2019-10-23 15:14:08 · 731 阅读 · 0 评论 -
tomcat处理一个http请求的过程
以NIO方式为例讲解一下tomcat处理一个http请求的过程 (servlet)首先http请求本质上也是建立在socket连接之上的,因此大概处理路径不外乎socket.accept() ---> socket流封装--->丢入Worker线程池处理----->Container内部处理----> 最终交给Servlet处理----> 返回结果...原创 2019-10-23 11:33:45 · 566 阅读 · 0 评论 -
tomcat之Container初始化与加载
1. Container结构Engine: servlet引擎Host: 虚拟主机Context: ServletContext,对应一个web项目或war包,包含多个WrapperWrapper: 对Servlet的封装2. 初始化从Catalina类开始,主要涉及createStartDigester()方法,如下图所示addObjectCrea...原创 2019-10-18 17:59:31 · 203 阅读 · 0 评论 -
tomcat之connector分析
1. connector配置<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectP...原创 2019-10-18 14:30:48 · 221 阅读 · 0 评论 -
tomcat源码分析总结
1. tomcat类加载机制,为什么要违背双亲委托机制(线程上下文类加载器) 线程上下文类加载器是指调用方法当前类队员的类加载器。parant类加载器去请求子加载器加载某些依赖的jar2. tomcat线程模型3. tomcat之connector分析4. tomcat之valve机制5. tomcat之容器类分析 Engine:org.apache.catalin...原创 2019-10-16 17:06:20 · 180 阅读 · 0 评论 -
tomcat为什么要违背双亲委托机制
1. 什么是双亲委托机制双亲委托的含义:1) 加载的顺序固定: 引导类加载器--》扩展类加载器--》应用类加载器---》自定义类加载器2) 当我们使用扩展类加载器加载某个类的时候,若引导类加载器已经加载的该类,就不会继续加载过程3) 下一级类加载器的加载过程依赖上一级类加载器4)jdk核心class只能被加载一次双亲委派模型的工作过程是:如果一个类加载器收到了...原创 2019-10-15 18:08:46 · 614 阅读 · 0 评论 -
tomcat线程模型--NIO
Tomcat支持三种接收请求的处理方式1)BIO阻塞IO,对应org.apache.coyote.http11.Http11Protocol2) NIO非阻塞IO,基于selectort实现,对应org.apache.coyote.http11.Http11NIOProtocol3) APR, 对应org.apache.coyote.http11.Http11AprPro...原创 2019-10-15 15:07:43 · 349 阅读 · 0 评论 -
tomcat源码之类加载机制
1. tomcat类加载思维导向图2. java 类加载思维导向图3. tomcat类加载顺序 当应用需要到某个类时,则会按照下面的顺序进行类加载: 1 使用bootstrap引导类加载器加载,加载jvm所需的基础类 2 使用system系统类加载器加载,加载tomcat启动类等相关 3 使用应用类加载器在WEB-INF/classe...原创 2019-10-15 11:39:45 · 149 阅读 · 0 评论 -
java基础面试题带答案
Java基础1.JAVA中的几种基本数据类型是什么,各自占用多少bit。 byte(8),char(16),short(16),int(32),long(64),float(32),double(64),boolean(1) 2.String类能被继承吗,为什么。 不能, final类型,不能被继承3.String,Stringbuffer,StringBuild...原创 2019-10-14 16:53:52 · 747 阅读 · 0 评论 -
Java中synchronized与lock的区别
最近面试被问到并发问题的解决方案,也就涉及到Java中synchronized与lock的区别,之前只是大概了解了下,现在详细整理一下。1.Java中synchronized与lock的区别synchronized是隐式加锁,lock是显示加锁;synchronized是在方法上或者方法体上加锁,lock一般是在方法内加锁;synchronized采用悲观锁机制,lock采用乐观锁机制;l原创 2017-01-24 21:59:26 · 1022 阅读 · 0 评论 -
G1垃圾回收器
1.说明CMS:Concurrent Mark and Sweep 并发标记整理垃圾回收器G1: Garbage-First G1垃圾回收器2.异同相同: - 都属于回收老年代的回收方法 区别: - 堆内存空间分配 - 垃圾收集的方式 - G1虽然保留了CMS关于代的概念,但是代已经不是物理上连续区域,而是一个逻辑的概念。2.1 堆内存分布CMS:内存分为新生代,老年代和永久代G1原创 2016-11-13 15:45:16 · 531 阅读 · 0 评论 -
String源码分析之equals和hashcode方法
1.说明== :如果是非引用类型,则值相等;引用类型,则地址相同,也就是指向堆中相同的对象 equals:Object对象而言或者没有重写equals方法的类,等效于==;重写了equals方法则按子类的方法来比较2.String的equals方法2.1 先看代码 public boolean equals(Object anObject) { if (this == anObje原创 2016-11-13 11:54:22 · 1231 阅读 · 0 评论 -
String源码分析之getByte乱码
当我们想把字符串转化为某种类型的编码格式时,容易出现乱码;比如下面的代码,很容易造成误区,getByte里面的gbk编码到底是编码还是解码;调用这个方法前,字符串之前编码了没;怎么还原字符串等等1.示例演示 String testStr="I love 中国"; byte[] bytes = testStr.getBytes("gbk"); Strin原创 2016-11-12 16:31:32 · 1096 阅读 · 0 评论 -
BufferByte的使用
最近用到BufferByte来缓存大量数据,然后就遇到了BufferByte的array()方法无法使用的情况,而当数据比较少的时候,array()方法可以正常使用。BufferByte buffer=BufferByte.allocate(22222222);BufferByte转byte[]:byte[] b=new byte[len];buffer.get(b,0,b.len原创 2016-01-20 21:58:37 · 579 阅读 · 0 评论 -
java编码解码过程
最近做项目的时候,有时会遇到中文乱码的问题,网上查询了很多资料,发现大多都是只讲解决方案,并没有讲到为什么要使用这种方案,这种方案的原理是什么? 最典型的就是连接数据库的URL,我们一般把它放到classpath下的db.properties中,然后尽管我们的java代码设置了UTF-8,JSP也设置了UTF-8,数据库也设置了UTF-8,但是插入数据到数据库中仍然会...原创 2015-12-26 12:35:15 · 4837 阅读 · 2 评论 -
Java多线程总结
1.线程是什么,线程与进程的区别1.1 线程的概念一段程序执行流。1.2 线程中的一些术语线程安全:多个线程访问同一个类,它始终表现正确的行为线程同步:线程的执行需要加锁线程封闭:内置锁/互斥锁:JVM提供的隐形锁,当使用synchronized修饰方法或者同步块时,进入时获取对象锁,出来时释放对象锁。内存可见性:一个线程对状态的改变,其他线程都可以看见原子性:原创 2015-07-31 16:30:47 · 329 阅读 · 0 评论 -
Java垃圾收集
Java垃圾收集垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。判断收集对象的方法GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。原创 2015-04-05 21:48:28 · 458 阅读 · 0 评论 -
guava ratelimiter 实现对不同接口单独进行动态限流
1. 背景项目中不同接口的流量限制不一样,需要对不同接口单独进行限流2. 设计1) 不同接口的流量峰值注册在配置中心2) 在拦截器中获取接口的限流配置信息,针对不同的接口单独实例化RateLimiter对象3) 进行流量操作3 代码实现3.1 拦截器实现import java.lang.annotation.Annotation;import ja...原创 2019-09-19 20:09:18 · 1084 阅读 · 0 评论