自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

那年的夏天的博客

尽量每天记录自己的学习历程

  • 博客(71)
  • 收藏
  • 关注

原创 Dubbo 3.2 监控体系核心源码解读

构造函数定义收集的指标类型:应用与服务级别的注册、订阅、收到推送后的 notify 的成功、失败数量} //...省略无关代码。

2023-07-09 16:50:28 276

原创 Nacos 原理详解

整个服务注册与发现过程,都离不开通讯协议,在1.x的 Nacos 版本中服务端只支持 http 协议,后来为了提升性能在2.x版本引入了谷歌的 grpc,grpc 是一款长连接协议,极大的减少了 http 请求频繁的连接创建和销毁过程,能大幅度提升性能,节约资源。据官方测试,Nacos服务端 grpc 版本,相比 http 版本的性能提升了9倍以上。

2022-10-01 22:57:41 16963 12

原创 nacos配置中心之ClusterRpcClientProxy源码分析

首先看初始化方法第一行 /** * init after constructor. */ @PostConstruct public void init() { try { NotifyCenter.registerSubscriber(this); List<Member> members = serverMemberManager.allMembersWithoutSelf();

2021-10-31 16:13:38 454

原创 nacos配置服务源码解析之添加配置

1.可以发现接口路径是:/v1/cs/configs2.可以看到standalone模式下数据库使用的是derby(java语言编写的内嵌数据库,遵循jdbc和sql标准)3.通过源码发现,添加配置的时候并没有直接将配置数据放到数据库,而是先放到SQL_CONTEXT ,private static final ThreadLocal<ArrayList<ModifyRequest>> SQL_CONTEXT = ThreadLocal.withInitial(ArrayLi

2021-10-14 15:09:33 664

原创 nacos服务发现源码

1.服务发现接口2.服务发现接口逻辑1.将发现的服务放到客户端的订阅列表,以达到服务信息改变的时候可以通知给客户端。2.先从ServiceStorage的serviceDataIndexes中获取服务信息,如果获取不到,则从ClientServiceIndexesManager的publisherIndexes中获取,获取成功放到ServiceStorage的serviceDataIndexes中...

2021-10-12 13:46:47 146

原创 nacos服务注册源码分析(二)

接着上篇文章,讲解一下nacos服务改变之后具体做了什么事情上节提到PushExecuteTask是具体TaskExecuteWorker执行的任务。PushExecuteTask做的事情就是将service信息发送到各个客户端。这里拿到所有订阅了该服务的客户端...

2021-10-12 11:28:34 134

原创 nacos服务注册源码分析(一)

一 服务注册整体流程图1.接受服务注册请求2.发布服务注册事件3.服务注册订阅者发布服务改变事件ClientServiceIndexesManager为服务注册订阅者,当发布服务注册事件的时候,会执行onEvent方法来维护服务与客户的索引,顺便会发布服务改变事件4.服务改变订阅者将任务放入延迟执行器通过断点发现NamingSubscriberServiceV2Impl是服务改变订阅者,当发生服务改变时,会执行onEvent方法,将任务放到延迟执行器,这里延迟实际上就是用线程池来实现的

2021-10-12 09:36:11 168

原创 nacos服务注册源码解析

一.启动注册服务到注册中心1.利用springcloud实现的抽象类AbstractAutoServiceRegistration来注册服务2.AbstractAutoServiceRegistration是利用spring的初始化完成事件来触发服务注册3.底层最终采用jdk自带的http请求类来调用nacos提供的服务注册接口...

2021-09-29 11:17:01 88

原创 easypoi自动判断excel宽度

package com.ssi.utils;import cn.afterturn.easypoi.excel.entity.ExportParams;import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.Workbook;import org.apache.poi.x

2021-07-20 13:59:32 991 1

原创 springcloud-feign核心源码解析一

一.@EnableFeignClientsspringboot集成的自动配置阅读源码首先搜 @EnableFeignClients,发现这个enable注解导入了FeignClientsRegistrar类。FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar接口,如果读过spring源码的话知道spring会调用registerBeanDefinitions方法来注入bean。如下图看这两行包装过的代码就知道这里注入的是默认的配置类和fei

2021-06-28 23:09:23 128

原创 spring事务源码主流程

1.这里调过创建代理过程,直接看核心主流程部分 //选择合适的事务管理器 final TransactionManager tm = determineTransactionManager(txAttr); //创建事务 TransactionInfo txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification); Object retVal; try { //执行真实方法

2021-04-03 09:12:40 96

原创 spring事务源码断点调试

1.下载spring源码2.将spring源码在idea跑起来3.新建一个测试工程,写如下测试代码,方便断点看源码@Componentpublic class TransTest { @Autowired private JdbcTemplate jdbcTemplate; @Transactional public void test(){ System.out.println(1); jdbcTemplate.execute("insert activity(id,type) v

2021-04-03 08:59:59 484

原创 tomcat中poller,accepter的作用

org.apache.tomcat.util.net.NioEndpoint.Poller#Poller1.处理队列中的事件,放到selector中 for (int i = 0, size = events.size(); i < size && (pe = events.poll()) != null; i++ ) { result = true; NioChannel channel = pe.getSocke

2021-03-20 12:24:37 464

原创 tomcat源码启动init和start时序图

tomcat启动时序图如下:可以看到,tomcat是将上面的类除了AbstractProtocol,NioEndpoint统一都继承了LifecycleBase,来实现启动一环扣一环的链式启动,也都注册未Mbean方便监控,NioEndpoint继承自AbstractProtocol,是最后接受请求实现的类。...

2021-03-19 22:35:24 186

原创 tomcat启动源码TomcatServletWebServerFactory之getWebServer方法解读

在springboot应用中默认的web容器实现就是tomcat。在ServletWebServerApplicationContext中的onRefresh方法调用createWebServer方法,再从spring容器中找到TomcatServletWebServerFactory,调用他的getWebServer,时序图如下:下面终点看getWebServer()方法:首先要理解一个类的作用:Connector:负责以某一种协议来接受连接请求。Server:代表一个端口的web服务Se

2021-03-19 21:40:13 4992 1

原创 springboot启动源码之SpringApplication的run方法一

先贴run方法源码:public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection<SpringBootExceptionReporter> exceptionReporters = new A

2021-02-16 09:31:35 309 1

原创 springboot启动源码之SpringApplication

这是SpringApplicaion的构造方法1.根据classpath选定WebApplicationType2.实例化Initializers3.实例化Listener public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources,

2021-02-13 10:03:40 362 2

原创 mysql mvcc 的理解

Mvcc的设计是为了读无锁官网解释是A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time. The query sees the changes made by transactions that committed before that point of time快照读意味着InnoDB提供数据库在某个

2021-02-08 23:38:43 179

原创 RestTemplate源码分析一

RestTemplate源码分析一设计模式设计模式1.AbstractClientHttpRequest这个抽象类使用了模板方法设计模式,在这个方法里面定义了基础的执行流程,子类只需继承实现抽象方法即可。/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache Licen...

2019-11-21 10:02:59 251

原创 skipper入门

skipper学习定义:解决springboot可持续集成的问题,类似于jenkins的功能特点1.支持发布应用程序到本地,cloud Foundry kubernates2.支持查询已经存在的应用程序包3.支持发布和回滚4.可以保存发布历史官方入门1.安装skipperhttp://repo.spring.io/release/org/springframework/clou...

2019-08-09 20:53:08 3690

原创 cookie和session的区别和联系

1.cookie是客户端保持状态的一种方案 2.session是服务端保持状态的一种方案 3.cookie里面会保存一个sessionid,通过这个sessionid可以在另外一个地方获取之前地方的session...

2018-06-07 18:45:28 329

原创 java适配器模式之接口适配器

原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。   当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有...

2018-06-06 10:12:36 4307

原创 java适配器模式之类适配器

一.类适配器模式 定义:适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。 原理:通过继承来实现适配器功能。   当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样...

2018-06-06 09:49:56 384

原创 springboot使用pagehelper实现分页

1.我用的springboot版本是2.0.2,并不是和每个版本的pagehelper都兼容&lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper-spring-boot-starter&lt;/artifactId&gt; ...

2018-06-05 09:29:11 1143

原创 Ribbon几种负载均衡规则

1.轮询规则 RoundRobinRule This rule simply choose servers by round robin. It is often used as the default rule or fallback of more advanced rules.2.根据服务是否死掉或者服务处于高并发来分配权重 AvailabilityFilteringRule T...

2018-06-02 17:17:09 7724

原创 使用docker-compose启动一个springcloud项目(包含多个组件和服务)

docker-compose用于启动多个springcloud组件和服务,可以实现一键启动,只需要编写一个docker-compose脚本 talk id cheap ,view the code 1.cloud各个组件(注册中心,路由,链路追踪等等基础服务)的启动 编写docker-compose-base.ymlversion: "2"services: eurekaser...

2018-06-02 14:01:53 6653

原创 centos7添加dns,永久生效方法

1.添加dns记录cd /etc/sysconfig/network-scripts/找到类似ifcfg-eth0的文件vim打开添加一行DNS1=114.114.114.1142.重启网络 service network restart3.验证vim /etc/resov.conf就可以看到添加的dns生效了...

2018-06-02 13:29:49 27547

原创 docker用maven构建和启动一个springboot项目

maven插件构建一个docker镜像1.maven配置&lt;plugin&gt; &lt;groupId&gt;com.spotify&lt;/groupId&gt; &lt;artifactId&gt;docker-maven-plugin&lt;/artifactId&gt; &lt;version&...

2018-06-01 11:42:58 1019

原创 mysql添加索引

1.查看执行计划 explain + 执行慢的sql这个可以看出是哪个表的哪个外键需要加索引2.查看索引show index from 表名3,添加索引alter table 表名 add index index_字段名(字段名)...

2018-05-07 13:45:38 686

原创 DOCTYPE html的作用

在使用layui的时候,发现checkbox的样式不对,找了很多种原因,最后定位是文档声明没有写&lt;!DOCTYPE html&gt;这个是h5的一个声明,必须写这个,浏览器才能正确识别这个是h5...

2018-05-03 16:18:29 305

原创 layui自定义模块和引用

1,定义模块layui.define('jquery', function(exports){ var $=layui.jquery var base={ test:function(){console.log("helloworld")} } exports('base', base);});2.引用模块layui.config({ version: true //一般用于更新模块缓存,默认...

2018-04-26 17:58:54 4817

原创 springboot的理解

1.springboot是spring的一个升级,对开发者来说,熟悉springboot有助于快速开发javaweb项目.2.springboot一个重要的概念就是自动配置,约定大于配置,使得开发者无须像之前做spring项目那样做大量的配置,有了springboot,比如我们要集成redis,如果你使用的是mavan来构建项目,只需要引入redis的依赖,然后在application.prope...

2018-04-14 13:33:25 1672

原创 文件上传,带其他非文件参数,返回文件可以访问的本地地址

@ResponseBody @RequestMapping(value = "/customer/credit/uploadfileurl") public String test(@RequestParam("file") CommonsMultipartFile file,String lll,HttpServletRequest request) throws Exceptio

2017-10-17 16:05:19 655

原创 ScheduledExecutorService实现延迟执行

1.ScheduledExecutorService 设计思想ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务

2017-10-17 11:44:26 2641

原创 .git无法忽略target,或者不生效的情况

在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法. 但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成

2017-09-22 13:57:31 8394 1

原创 centos7下安装mysql和linux下安装mysql是不同的

今天mysql安装了一天,最后晚上下班了才装好,一直是各种报错。 之所以一直报错的原因其实就是因为,centos7只是linux的一个系列,而linux是一个大类,我通过linux去搜索安装mysql的方法,就搜到很多不适合我的安装方式,主要是报这个错Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.s

2017-09-07 21:30:46 458

原创 java将request接受数据转换成map

如果前端传给了你五个以上的参数,你又没有对应的实体类去接受,这个时候,你可以用request去接受,然后通过这个方法转换成map /** * 从request中获得参数Map,并返回可读的Map * * @param request * @return */ @SuppressWarnings({ "unchecked",

2017-05-23 19:26:51 16556 1

原创 后台返回数据快速赋值到页面封装js

//ajax返回data,通过name属性赋值到ipputfunction setValueByData(data){ $.each(data,function(key,value){ $("[name='"+key+"']").val(value) })}

2017-05-23 19:24:41 1492

原创 查看网卡信息linux命令

ip a 显示内容1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever

2017-05-21 10:38:43 6222

原创 keepalived实现主备切换

1.下载安装keepalived,并且做成linux系统服务wget http://www.keepalived.org/download.htmltar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/yum install -y openssl openssl-develcd keepalived-1.2.18/ && ./configure --

2017-05-20 17:28:07 2798

空空如也

空空如也

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

TA关注的人

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