![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java进阶代码示例
文章平均质量分 58
Java进阶知识点
enterpc
这个作者很懒,什么都没留下…
展开
-
Ribbon核⼼源码剖析
一. Ribbon⼯作原理重点:Ribbon给restTemplate添加了⼀个拦截器思考:Ribbon在做什么: 当我们访问http://lagou-service-resume/resume/openstate/的时候,ribbon应该 根据服务名lagou-service-resume获取到该服务的实例列表并按照⼀定的负载均衡 策略从实例列表中获取⼀个实例Server,并最终通过RestTemplate进⾏请求访问Ribbon细节结构图(涉及到底层的⼀些组件/类的描述.转载 2022-02-18 01:07:11 · 406 阅读 · 0 评论 -
Ribbon—— 第一代Spring Cloud核心组件高级应用
一. 关于负载均衡负载均衡⼀般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡,⽐如Nginx、F5这些,请求到达服务器之后由这些负载均衡 器根据⼀定的算法将请求路由到⽬标服务器处理。 所谓客户端负载均衡,⽐如我们要说的Ribbon,服务消费者客户端会有⼀个服务器 地址列表,调⽤⽅在请求前通过⼀定的负载均衡算法选择⼀个服务器进⾏访问,负 载均衡算法的执⾏是在请求客户端进⾏。 Ribbon是Netflflix发布的负载均衡器。Eureka⼀般配合Ribbon进⾏使⽤,Ri转载 2022-02-17 23:54:30 · 234 阅读 · 0 评论 -
Eureka核⼼源码剖析
目录一. Eureka Server启动过程观察类头分析三个关注点(一)关注点1(二)关注点2(三)关注点3二. Eureka Server服务接⼝暴露策略三. Eureka Server服务注册接⼝(接受客户端注册服务)四. Eureka Server服务续约接⼝(接受客户端续约)五. Eureka Client注册服务(一)读取配置⽂件(二)启动时从EurekaServer获取服务实例信息(三)注册⾃⼰到EurekaServer(四)开启⼀..转载 2022-02-17 23:47:10 · 131 阅读 · 0 评论 -
Eureka —— 第一代Spring Cloud核心组件高级应用
一. Eureka介绍注意:服务注册中⼼本质上是为了解耦服务提供者和服务消费者。对于任何⼀个微服务,原则上都应存在或者⽀持多个提供者(⽐如简历微服务部署 多个实例),这是由微服务的分布式属性决定的。 更进⼀步,为了⽀持弹性扩缩容特性,⼀个微服务的提供者的数量和分布往往是动 态变化的,也是⽆法预先确定的。因此,原本在单体应⽤阶段常⽤的静态LB机制就 不再适⽤了,需要引⼊额外的组件来管理微服务提供者的注册与发现,⽽这个组件 就是服务注册中⼼。(一)服务注册中⼼⼀般原理转载 2022-02-17 21:27:31 · 257 阅读 · 0 评论 -
微服务案例引入及问题剖析
一. 案例说明本部分我们按照普通⽅式模拟⼀个微服务之间的调⽤(后续我们将⼀步步使⽤ Spring Cloud的组件对案例进⾏改造)。拉勾App⾥有这样⼀个功能:“⾯试直通⻋”,当求职⽤户开启了⾯试直通⻋之后,会 根据企业客户的招聘岗位需求进⾏双向匹配。其中有⼀个操作是:为企业⽤户开启 ⼀个定时任务,根据企业录⼊的⽤⼈条件,每⽇匹配⼀定数量的应聘者“投递”到企业 的资源池中去,那么系统在将匹配到的应聘者投递到资源池的时候需要先检查:此 时应聘者默认简历的状态(公开/隐藏),如转载 2022-02-14 23:40:13 · 175 阅读 · 0 评论 -
微服务架构及Spring Cloud概述
一. 微服务架构(一)互联⽹应⽤架构发展(回顾) 随着互联⽹的发展,⽤户群体逐渐扩⼤,⽹站的流量成倍增⻓,常规的单体架构已 ⽆法满⾜请求压⼒和业务的快速迭代,架构的变化势在必⾏。下⾯我们就以拉勾⽹ 的架构演进为例,从最开始的单体架构分析,⼀步步的到现在的微服务架构。1. 单体应⽤架构在诞⽣之初,拉勾的⽤户量、数据量规模都⽐较⼩,项⽬所有的功能模块都放在⼀ 个⼯程中编码、编译、打包并且部署在⼀个Tomcat容器中的架构模式就是单体应⽤ 架构,这样的架构既简单实 ⽤...转载 2022-02-14 19:10:52 · 232 阅读 · 0 评论 -
dubbo连接zookeeper报Exception in thread “main“ java.lang.IllegalStateException: zookeeper not connected
修改办法方法一:适用于xml配置dubbo的方案。 <dubbo:registry id="registry1" address="zookeeper://localhost:2181" timeout="25000"/>或者 <dubbo:config-center timeout="25000"/>方法二:适用于api配置dubbo的方案。 private static void startWithBootstrap() {转载 2022-02-08 12:11:27 · 360 阅读 · 0 评论 -
zookeeper源码分析之集群模式服务端
集群模式下启动所有的ZK节点启动⼊⼝都是QuorumPeerMain类的main⽅法。 main⽅法加载配置⽂件以后,最终会调⽤到QuorumPeer的start⽅法,来看下:public void runFromConfig(QuorumPeerConfig config) throws IOException, AdminServerException { try { ManagedUtil.registerLog..原创 2022-02-05 11:47:20 · 964 阅读 · 0 评论 -
Netty核心源码剖析(四)Netty消息出站源码流程分析
目录一. 分析入口二. 出站Handler的write方法执行追踪分析三. 出站Handler中的flush方法执行追踪分析一. 分析入口上图处打上断点以后,首先Debug启动服务端,普通方式启动客户端,客户端启动后,程序停在断点处:接下来我们一直往下跟踪,直到如下图位置:进入pipeline.fireChannelReadComplete()方法继续跟踪:注意:上图继续跟踪后,程序将跳入我们的 NettyServer...原创 2022-01-29 22:58:12 · 922 阅读 · 2 评论 -
Netty核心源码剖析(三)Netty消息入站源码流程分析
目录一. 流程分析(一)流程图(二)netty模型图二. 主要流程源码(一)分析入口(二)处理第一个SelectedKey:连接事件(三)处理第二个SelectedKey:读事件BossGroup主要负责监听. workGroup负责消息处理. 主要看下BossGroup如何将通道交给workGroup的,和如何处理消息读取的.即入站 一. 流程分析(一)流程图(二)netty模型图二. 主要流程源码(一)分析入口首先保持服...原创 2022-01-29 21:11:22 · 836 阅读 · 0 评论 -
Netty核心源码剖析(二)Netty启动源码流程分析
目录一. 启动流程分析(一)流程图(二)Netty模型图二. 主要源码跟踪(一)初始化与注册(二)通道初始化(三)注册通道(四)执行execute方法(五)startThread-->run方法启动线程(六)runAllTasks方法(七)register0方法 (八)ServerBootstrapAcceptor解析一. 启动流程分析 (一)流程图(二)Netty模型图二. 主要源码跟踪(一)初始化与...原创 2022-01-29 16:32:55 · 864 阅读 · 0 评论 -
Netty核心源码剖析(一)线程组创建源码流程分析
EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多 个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。 一. 线程组创建源码流程分析线程组创建流程分析:1. 创建线程组EventLoopGroup 2. 根据创建EventLoopGroup 线程组时设置的参数决定在线程组内创建线程的个数,如未写参数,则默认创建的线程为当前主机CPU线程数*2,在实际案例中,一般b原创 2022-01-29 14:00:49 · 1003 阅读 · 0 评论 -
手写迷你Tomcat升级版(含解题思路及完整代码)
一. 题目要求开发Minicat V4.0,在已有Minicat基础上进一步扩展,模拟出webapps部署效果 磁盘上放置一个webapps目录,webapps中可以有多个项目,例如demo1、demo2、demo3... 每个项目中含有servlet,可以根据请求url定位对应servlet进一步处理。具体的项⽬⽐如demo1中有serlvet(也即为:servlet是属于具体某⼀个项⽬的servlet),这样的话在Minicat初始化配置加载,以及根据请求url查找对应serlvet时都需要进⼀步.原创 2022-01-23 00:48:00 · 170 阅读 · 0 评论 -
JVM优化深度剖析
目录一. JVM回顾(一)什么是JVM(二)JVM与操作系统(三)JVM、JRE、JDK 的关系(四)Java虚拟机规范和 Java 语言规范的关系二. java虚拟机的内存管理(一)JVM整体架构(二)JVM运行时内存1.PC 程序计数器2. 虚拟机栈3. 本地方法栈4. 堆5. 元空间6. 方法区7. 运行时常量池8. 直接内存(三)实战OutOfMemoryError异常3.1 Java堆溢出3....转载 2022-01-21 11:41:02 · 251 阅读 · 0 评论 -
Tomcat 类加载机制剖析
目录一. JVM 的类加载机制二. 双亲委派机制(一)什么是双亲委派机制(二)双亲委派机制的作⽤三. Tomcat 的类加载机制Java类(.java)—> 字节码⽂件(.class) —> 字节码⽂件需要被加载到jvm内存当中(这个过程就是⼀个类加载的过程)类加载器(ClassLoader,说⽩了也是⼀个类,jvm启动的时候先把类加载器读取到内存当中去,其他的类(⽐如各种jar中的字节码⽂件,⾃⼰开发的代码编译之后的.class⽂件等等)) 要说 Tom.转载 2022-01-21 08:51:06 · 237 阅读 · 0 评论 -
Tomcat核⼼流程源码剖析
Tomcat中的各容器组件都会涉及创建、销毁等,因此设计了⽣命周期接⼝Lifecycle进⾏统⼀规范,各容器组件实现该接⼝。Lifecycle⽣命周期接⼝主要⽅法示意Lifecycle⽣命周期接⼝继承体系示意核⼼流程源码剖析 源码追踪部分我们关注两个流程:Tomcat启动流程和Tomcat请求处理流程一. Tomcat启动流程(一)追踪过程1. 入口2. 追踪方式tomcat的启动分两个步骤,首先是逐级初始化,然后是逐级sta...原创 2022-01-21 08:43:51 · 207 阅读 · 0 评论 -
SpringBoot源码剖析-自动配置SpringMVC
在上一小节,我们介绍了SpringBoot是如何启动一个内置tomcat的。我们知道我们在SpringBoot 项目里面是可以直接使用诸如 @RequestMapping 这类的SpringMVC的注解,那么同学们会不会奇 怪,这是为什么?我明明没有配置SpringMVC为什么就可以使用呢? 其实仅仅引入starter是不够的,回忆一下,在一个普通的WEB项目中如何去使用SpringMVC,我 们首先就是要在web.xml中配置如下配置但是在SpringBoot中,我们没有.转载 2022-01-15 21:46:40 · 168 阅读 · 0 评论 -
SpringBoot-内嵌Tomcat源码剖析
Spring Boot默认支持Tomcat,Jetty,和Undertow作为底层容器。 而Spring Boot默认使用Tomcat,一旦引入spring-boot-starter-web模块,就默认使用Tomcat容 器。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artif转载 2022-01-15 21:16:36 · 505 阅读 · 1 评论 -
SpringBoot执行流程中,主要功能实现的关键节点及流程总结
一. 初始化SpringApplication(一)实例化SpringApplication1. 关键节点2. 调用栈二. 初始化classpath下 META-INF/spring.factories中已配置的ApplicationContextInitializer(一)获取META-INF/spring.factories中配置的类名并返回1. 总截图2. 调用栈(二) 对META-INF/spring.factories中配置的类进行实例化.原创 2022-01-15 20:18:42 · 756 阅读 · 0 评论 -
SpringBoot启动过程中-IOC容器创建的节点分析
一. 总图二. 调用栈原创 2022-01-15 17:19:02 · 132 阅读 · 0 评论 -
SpringBoot加载application.properties/yml配置文件的节点分析
一. 发现重要的监听器的节点这个监听器类名称为:ConfigFileApplicationListener,该监听器作用稍后会介绍(一)总图(二)调用栈二. ConfigFileApplicationListener监听器这个监听器默认的从如下标签的几个位置加载配置文件(当然也可以用户自定义):* < ul >* < li > file :. / config /</ li >* < li > file :. /<原创 2022-01-15 14:55:58 · 169 阅读 · 0 评论 -
SpringBoot-自定义starter
一. 先完成自定义starter(一)新建maven jar工程工程名为zdy-spring-boot-starter,导入依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.2.9.RELEASE</vers转载 2022-01-15 10:43:49 · 110 阅读 · 0 评论 -
SpringBoot启动执行流程源码剖析(重点)
一. 源码剖析入口(一)SpringBoot项目的mian函数(入口)package com.lagou;import com.lagou.config.EnableRegisterServer;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication//标注在类原创 2022-01-15 03:15:04 · 727 阅读 · 0 评论 -
SpringBoot自动配置原理-源码剖析
自动配置:根据我们添加的jar包依赖,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。 那么Spring Boot到底是如何进行自动配置的,都把哪些组件进行了自动配置?以下主要从四个注解入手进行源码层面的深入剖析。一. @SpringBootApplication Spring Boot应用的启动入口是@SpringBootApplication注解标注类中的main()方法,@SpringBootApplicat转载 2022-01-15 00:57:32 · 163 阅读 · 0 评论 -
SpringBoot日志框架详解
一. 日志框架介绍在项目的开发中,日志是必不可少的一个记录事件的组件,不管是记录运行情况还是追踪线上问题,都离不开对日志的分析,所以也会相应的在项目中实现和构建我们所需要的日志框架。而市面上常见的日志框架有很多,比如:JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback等等,我们该如何选择呢?通常情况下,日志是由一个抽象层+实现层的组合来搭建的。 Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot.转载 2022-01-12 16:47:44 · 4018 阅读 · 0 评论 -
Spring Boot通过注解实现属性注入详解
使用Spring Boot全局配置文件设置属性时: 如果配置属性是Spring Boot已有属性,例如服务端口server.port,那么Spring Boot内部会自动扫描并读取这些配置文件中的属性值并覆盖默认属性。 如果配置的属性是用户自定义属性,例如刚刚自定义的Person实体类属性,还必须在程序中注入这些配置属性方可生效。 一. 属性注入常用注解@Configuration:声明一个类作为配置类 @Bean:声明在方法上,将方法的返回值加入Bean容器 @Value:属性转载 2022-01-12 16:32:09 · 1404 阅读 · 0 评论 -
Spring Boot全局配置文件详解
一. 全局配置文件概述及优先级全局配置文件能够对一些默认配置值进行修改及自定义配置。 Spring Boot使用一个application.properties或者application.yaml的文件作为全局配置文件也可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录: 翻译成文件系统:–file:./config/ –file:./ –classpath:/co转载 2022-01-12 16:17:41 · 906 阅读 · 0 评论 -
spring-boot-devtools热部署详解
在开发项目过程中,当修改了某些代码后需要本地验证时,需要重启本地服务进行验证,启动这个 项目,如果项目庞大的话还是需要较长时间的,spring开发团队为我们带来了一个插件:spring-boot devtools,很好的解决了本地验证缓慢的问题。一. 热部署实现演示(一)添加spring-boot-devtools热部署依赖启动器在Spring Boot项目进行热部署测试之前,需要先在项目的pom.xml文件中添加spring-boot-devtools热部署依赖启动器:&l转载 2022-01-12 15:57:12 · 1372 阅读 · 0 评论 -
SpringBoot介绍及基础回顾
一. 约定优于配置 概念:约定优于配置(Convention over Configuration),又称按约定编程,是一种软件设计规范。 本质上是对系统、类库或框架中一些东西假定一个大众化合理的默认值(缺省值)。 例如在模型中存在一个名为User的类,那么对应到数据库会存在一个名为user的表,此时无需做额外的配置,只有在偏离这个约定时才需要做相关的配置(例如你想将表名命名为t_user等非user时才需要写 关于这个名字的配置)。 如果所用工具的约定与你的期待相符,便可省去配置;转载 2022-01-12 15:33:44 · 178 阅读 · 0 评论 -
手写MVC框架中通过自定义注解简单控制用户访问handler代码示例(含完整示例代码)
一. 需求手写MVC框架基础上增加如下功能1)定义注解@Security(有value属性,接收String数组),该注解用于添加在Controller类或者Handler方法上,表明哪些用户拥有访问该Handler方法的权限(注解配置用户名)2)访问Handler时,用户名直接以参数名username紧跟在请求的url后面即可,比如http://localhost:8080/demo/handle01?username=zhangsan3)程序要进行验证,有访问权限则放行,没有访问权限在页原创 2022-01-10 17:19:43 · 338 阅读 · 0 评论 -
自定义注解示例代码
一、需求自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚注意考虑以下情况:1)注解有无value属性值【@service(value="") @Repository(value="")】2)service层是否实现接口的情况【jdk还是cglib】二、实现思路 创建 @Service 、@Repository、@Com原创 2022-01-10 17:13:10 · 226 阅读 · 0 评论 -
SpringData源码剖析
一. resumeDao代理对象是怎么产生的,过程怎样?以往:如果要给⼀个对象产⽣代理对象,我们知道是在AbstractApplicationContext的refresh⽅法中,那么能不能在这个⽅法中找到什么我们当前场景的线索?新的疑问⼜来了? 问题1: 为什么会给它指定为⼀个JpaRespositoryFactoryBean(getObject⽅法返回具体的对象) 问题2:指定这个FactoryBean是在什么时候发⽣的?⾸先解决问题2:传⼊⼀个...转载 2022-01-10 11:36:18 · 230 阅读 · 0 评论 -
SpringMVC-在控制器中处理异常
一 异常处理的思路在Java中,对于异常的处理一般有两种方式:一种是当前方法捕获处理(try-catch),这种处理方式会造成业务代码和异常处理代码的耦合。另一种是自己不处理,而是抛给调用者处理(throws),调用者再抛给它的调用者,也就是一直 向上抛。在这种方法的基础上,衍生出了SpringMVC的异常处理机制。系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:转载 2022-01-06 02:31:12 · 213 阅读 · 0 评论 -
SpringMVC中处理multipart形式的数据(文件上传)
一. 文件上传所需要的JAR包原⽣servlet处理上传的⽂件数据的,springmvc⼜是对serlvet的封装,所需jar包<!--⽂件上传所需jar坐标--><dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</ve转载 2022-01-06 02:24:30 · 305 阅读 · 0 评论 -
Spring MVC之拦截器(Inteceptor)的使⽤
一. 监听器、过滤器和拦截器对⽐(1)Servlet:处理Request请求和Response响应(2)过滤器(Filter):对Request请求起到过滤的作⽤,作⽤在Servlet之前,如果配置为/*可以对所 有的资源访问(servlet、js/css静态资源等)进⾏过滤处理(3)监听器(Listener):实现了javax.servlet.ServletContextListener 接⼝的服务器端组件,它随 Web应⽤的启动⽽启动,只初始化⼀次,然后会⼀直运⾏监视,随Web应⽤的停⽌⽽销转载 2022-01-06 02:18:39 · 183 阅读 · 0 评论 -
SpringMVC中Ajax Json交互
交互:两个⽅向 1)前端到后台:前端ajax发送json格式字符串,后台直接接收为pojo参数,使⽤注解@RequstBody 2)后台到前端:后台直接返回pojo对象,前端直接接收为json对象或者字符串,使⽤注解 @ResponseBody一. 什么是 JsonJson是⼀种与语⾔⽆关的数据交互格式,就是⼀种字符串,只是⽤特殊符号{}内表示对象、[]内表示数组、""内是属性或值、:表示后者是前者的值{"name": "Michael"}可以理解为是⼀个包含name为Mic转载 2022-01-06 02:08:41 · 216 阅读 · 0 评论 -
Springmvc对rest⻛格请求的支持
一. 什么是RESTfulRestful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用 于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:GET: 读 取 (Read)POST:新建(Create)PUT:更新(Update)DELETE:删除(Delete) 客户端请...转载 2022-01-06 02:00:45 · 108 阅读 · 0 评论 -
SpringMVC如何接收请求参数
http协议(超⽂本传输协议) 原⽣servlet接收⼀个整型参数: 1)String ageStr = request.getParameter("age"); 2) Integer age = Integer.parseInt(ageStr); SpringMVC框架对Servlet的封装,简化了servlet的很多操作 SpringMVC在接收整型参数的时候,直接在Handler⽅法中声明形参即可@RequestMapping("xxx")public String转载 2022-01-06 01:51:31 · 430 阅读 · 0 评论 -
Spring Web MVC ⼯作流程
Spring Web MVC项目开发过程:1)配置DispatcherServlet前端控制器 2)开发处理具体业务逻辑的Handler(@Controller、@RequestMapping) 3)xml配置⽂件配置controller扫描,配置springmvc三⼤件 4)将xml⽂件路径告诉springmvc(DispatcherServlet)一. Spring MVC 请求处理流程流程说明:第⼀步:⽤户发送请求⾄前端控制器DispatcherServlet .转载 2022-01-06 01:39:59 · 179 阅读 · 0 评论 -
Spring MVC 简介
一. MVC 体系结构三层架构我们的开发架构⼀般都是基于两种形式,⼀种是 C/S 架构,也就是客户端/服务器;另⼀种是 B/S 架构,也就是浏览器服务器。在 JavaEE 开发中,⼏乎全都是基于 B/S 架构的开发。那么在 B/S 架构中,系 统标准的三层架构包括:表现层、业务层、持久层。三层架构在我们的实际开发中使⽤的⾮常多,所以 我们课程中的案例也都是基于三层架构设计的。三层架构中,每⼀层各司其职,接下来我们就说说每层都负责哪些⽅⾯:(1)表现层 :也就是我们常说的web 层转载 2022-01-06 01:28:13 · 110 阅读 · 0 评论