- 博客(71)
- 收藏
- 关注
原创 Dubbo 3.2 监控体系核心源码解读
构造函数定义收集的指标类型:应用与服务级别的注册、订阅、收到推送后的 notify 的成功、失败数量} //...省略无关代码。
2023-07-09 16:50:28 371
原创 Nacos 原理详解
整个服务注册与发现过程,都离不开通讯协议,在1.x的 Nacos 版本中服务端只支持 http 协议,后来为了提升性能在2.x版本引入了谷歌的 grpc,grpc 是一款长连接协议,极大的减少了 http 请求频繁的连接创建和销毁过程,能大幅度提升性能,节约资源。据官方测试,Nacos服务端 grpc 版本,相比 http 版本的性能提升了9倍以上。
2022-10-01 22:57:41 18459 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 536
原创 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 717
原创 nacos服务发现源码
1.服务发现接口2.服务发现接口逻辑1.将发现的服务放到客户端的订阅列表,以达到服务信息改变的时候可以通知给客户端。2.先从ServiceStorage的serviceDataIndexes中获取服务信息,如果获取不到,则从ClientServiceIndexesManager的publisherIndexes中获取,获取成功放到ServiceStorage的serviceDataIndexes中...
2021-10-12 13:46:47 192
原创 nacos服务注册源码分析(二)
接着上篇文章,讲解一下nacos服务改变之后具体做了什么事情上节提到PushExecuteTask是具体TaskExecuteWorker执行的任务。PushExecuteTask做的事情就是将service信息发送到各个客户端。这里拿到所有订阅了该服务的客户端...
2021-10-12 11:28:34 163
原创 nacos服务注册源码分析(一)
一 服务注册整体流程图1.接受服务注册请求2.发布服务注册事件3.服务注册订阅者发布服务改变事件ClientServiceIndexesManager为服务注册订阅者,当发布服务注册事件的时候,会执行onEvent方法来维护服务与客户的索引,顺便会发布服务改变事件4.服务改变订阅者将任务放入延迟执行器通过断点发现NamingSubscriberServiceV2Impl是服务改变订阅者,当发生服务改变时,会执行onEvent方法,将任务放到延迟执行器,这里延迟实际上就是用线程池来实现的
2021-10-12 09:36:11 197
原创 nacos服务注册源码解析
一.启动注册服务到注册中心1.利用springcloud实现的抽象类AbstractAutoServiceRegistration来注册服务2.AbstractAutoServiceRegistration是利用spring的初始化完成事件来触发服务注册3.底层最终采用jdk自带的http请求类来调用nacos提供的服务注册接口...
2021-09-29 11:17:01 134
原创 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 1114 1
原创 springcloud-feign核心源码解析一
一.@EnableFeignClientsspringboot集成的自动配置阅读源码首先搜 @EnableFeignClients,发现这个enable注解导入了FeignClientsRegistrar类。FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar接口,如果读过spring源码的话知道spring会调用registerBeanDefinitions方法来注入bean。如下图看这两行包装过的代码就知道这里注入的是默认的配置类和fei
2021-06-28 23:09:23 172
原创 spring事务源码主流程
1.这里调过创建代理过程,直接看核心主流程部分 //选择合适的事务管理器 final TransactionManager tm = determineTransactionManager(txAttr); //创建事务 TransactionInfo txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification); Object retVal; try { //执行真实方法
2021-04-03 09:12:40 132
原创 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 534
原创 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 524
原创 tomcat源码启动init和start时序图
tomcat启动时序图如下:可以看到,tomcat是将上面的类除了AbstractProtocol,NioEndpoint统一都继承了LifecycleBase,来实现启动一环扣一环的链式启动,也都注册未Mbean方便监控,NioEndpoint继承自AbstractProtocol,是最后接受请求实现的类。...
2021-03-19 22:35:24 227
原创 tomcat启动源码TomcatServletWebServerFactory之getWebServer方法解读
在springboot应用中默认的web容器实现就是tomcat。在ServletWebServerApplicationContext中的onRefresh方法调用createWebServer方法,再从spring容器中找到TomcatServletWebServerFactory,调用他的getWebServer,时序图如下:下面终点看getWebServer()方法:首先要理解一个类的作用:Connector:负责以某一种协议来接受连接请求。Server:代表一个端口的web服务Se
2021-03-19 21:40:13 5174 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 359 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 405 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 223
原创 RestTemplate源码分析一
RestTemplate源码分析一设计模式设计模式1.AbstractClientHttpRequest这个抽象类使用了模板方法设计模式,在这个方法里面定义了基础的执行流程,子类只需继承实现抽象方法即可。/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache Licen...
2019-11-21 10:02:59 284
原创 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 4206
原创 cookie和session的区别和联系
1.cookie是客户端保持状态的一种方案 2.session是服务端保持状态的一种方案 3.cookie里面会保存一个sessionid,通过这个sessionid可以在另外一个地方获取之前地方的session...
2018-06-07 18:45:28 354
原创 java适配器模式之接口适配器
原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。 当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有...
2018-06-06 10:12:36 4372
原创 java适配器模式之类适配器
一.类适配器模式 定义:适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。 原理:通过继承来实现适配器功能。 当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样...
2018-06-06 09:49:56 423
原创 springboot使用pagehelper实现分页
1.我用的springboot版本是2.0.2,并不是和每个版本的pagehelper都兼容<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> ...
2018-06-05 09:29:11 1179
原创 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 7754
原创 使用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 6850
原创 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 27703
原创 docker用maven构建和启动一个springboot项目
maven插件构建一个docker镜像1.maven配置<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version&...
2018-06-01 11:42:58 1045
原创 mysql添加索引
1.查看执行计划 explain + 执行慢的sql这个可以看出是哪个表的哪个外键需要加索引2.查看索引show index from 表名3,添加索引alter table 表名 add index index_字段名(字段名)...
2018-05-07 13:45:38 709
原创 DOCTYPE html的作用
在使用layui的时候,发现checkbox的样式不对,找了很多种原因,最后定位是文档声明没有写<!DOCTYPE html>这个是h5的一个声明,必须写这个,浏览器才能正确识别这个是h5...
2018-05-03 16:18:29 331
原创 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 4891
原创 springboot的理解
1.springboot是spring的一个升级,对开发者来说,熟悉springboot有助于快速开发javaweb项目.2.springboot一个重要的概念就是自动配置,约定大于配置,使得开发者无须像之前做spring项目那样做大量的配置,有了springboot,比如我们要集成redis,如果你使用的是mavan来构建项目,只需要引入redis的依赖,然后在application.prope...
2018-04-14 13:33:25 1718
原创 文件上传,带其他非文件参数,返回文件可以访问的本地地址
@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 691
原创 ScheduledExecutorService实现延迟执行
1.ScheduledExecutorService 设计思想ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是出于轮询任务
2017-10-17 11:44:26 2678
原创 .git无法忽略target,或者不生效的情况
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法. 但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成
2017-09-22 13:57:31 8461 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 482
原创 java将request接受数据转换成map
如果前端传给了你五个以上的参数,你又没有对应的实体类去接受,这个时候,你可以用request去接受,然后通过这个方法转换成map /** * 从request中获得参数Map,并返回可读的Map * * @param request * @return */ @SuppressWarnings({ "unchecked",
2017-05-23 19:26:51 16704 1
原创 后台返回数据快速赋值到页面封装js
//ajax返回data,通过name属性赋值到ipputfunction setValueByData(data){ $.each(data,function(key,value){ $("[name='"+key+"']").val(value) })}
2017-05-23 19:24:41 1543
原创 查看网卡信息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 6306
原创 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 2838
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人