自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

啊杰的博客

愿做一个默默成长的程序员。加油!

  • 博客(60)
  • 资源 (6)
  • 收藏
  • 关注

原创 Eureka迁移到Nacos之服务名称大小问题

Eureka迁移到Nacos之服务名称大小问题解决

2023-04-06 16:43:41 507

原创 浅谈Nacos注册中心集群分布式架构设计

当Nacos不单单是服务于集团公司内部,而是PaaS化了,所需管理的服务实例,达到了几百万 ,甚至千万等等。那么依靠Nacos现在开源版本是很难支持这种场景的。我们该如何二开Nacos使其集群分布式化呢?

2022-12-07 21:07:35 1868

原创 Dubbo底层网络连接模型

Dubbo的底层网络连接模型

2022-12-02 15:51:21 591

原创 Nacos与Eureka中的高性能读写并发架构设计

一文带你彻底搞懂Nacos与Eureka的高性能读写并发架构~

2022-11-24 18:32:37 1381

原创 换你来,你会如何设计微信朋友圈?

如何设计微信朋友圈

2022-01-28 16:29:23 3711 1

原创 基于AQS自定义同步器

最近 复习Java并发编程核心知识点,重温了AQS。有了新的认识,换句话说,之前的学习只是为了面试吹牛,现在学习是为了自己质的提升。什么是AQS?什么是AQS? 如果你问我什么是AQS,我就带你看这篇我之前写的文章.Java并发之AQS学习笔记接下来,笔者将基于AQS自定义一个同步器的行文思路来展开篇幅。鉴于目前广州疫情严峻,以核酸大规模筛查为背景例子演示自定义同步器。创建核酸筛查服务类创建sync内部类,继承AQS,重写两组方法:分别是独占式的获取与释放(tryAcquire、tryReleas

2021-06-10 17:25:45 266

原创 从源码角度窥探RocketMQ之NameServer原理

NameServer架构设计NameServer可以说是RocketMQ的“大脑”。她负责路由管理、服务注册及服务发现。客户端想要往服务端发送消息或者从服务端订阅消息时,必须要知道服务端的路由信息。在服务端集群部署下,更加尤为重要。为了解决这个问题,必须引入类似zookeeper这类分布式协调中心。那么业界已有ZK这个神器,为何RocketMQ要架设NameServer,不用ZK呢?原因很简单,ZK具有强一致性,在ZK、消息服务端都在大规模集群环境下,网络通信将变得异常庞大复杂,尤其是ZK。所以Rock

2021-05-13 18:20:26 383 1

原创 从源码角度深刻理解Spring AOP

今天总结的是Spring 的AOP原理。本文不讲使用,只讲原理!这里贴笔者收藏夹里两篇很不错的关于AOP的文章:1、springboot aop的execution 表达式详解2、【漫画】AOP 面试造火箭事件始末好了,Talk is cheap. Show you the code。AOP的入口在哪我们回忆一下,我们写切面时,要把它定义为spring的bean。基于这个切面bean,做了代理增强。透过这句话你想到了什么?如果你熟悉Spring Ioc的话,bean 意味着往ioc容器靠,对bea

2021-04-20 17:12:58 214 1

原创 动态依赖注入组件

这篇文章主要介绍笔者一个动态依赖注入组件。具体介绍请前往github查看,这里不再过多重复赘述。本文主要以一个实际例子来演示其强大特性。github 源码:动态依赖注入组件这里贴一下组件的原理图:需求背景在大促等高峰流量场景下,我们为了能在大促期间抗住高峰流量,我们往往会给服务加机子,或者提升配置来提高服务的服务能力。在大促后,回收机子,减少资源耗费。这是常规操作。但在代码优化里,我们也往往会在大促期间针对大促的流量高峰特点,定制特定服务接口实现来提供服务,待大促后,切换为常规服务接口实现。

2021-04-12 17:22:28 416

原创 FactoryBean能怎么用呢

读者们应该知道BeanFactory。它是Spring Ioc容器的底层定义。FactoryBean这家伙跟它长得很像,二者的区别也是面试中面试官比较喜欢问的。下面我贴一下我的关于这二者区别的学习笔记。从概念上理解不难,但是这个FactoryBean该怎么玩呢?笔者在spring源码阅读过程中发现,有好多好多的它的实现类。可见它的地位不同一般。接下里以笔者实际自身项目的例子来演示。需求背景:有个接口服务有一个稳定版本,经过了线上的历次磨炼。最近给这个服务增加了另外一个版本实现–增强版本。性能更猛,特性

2021-04-08 15:06:54 449

原创 异步中异常那点事

我接触异步概念最早的时候是在大学学习前端中,是一个很老的技术叫Ajax。异步编程很重要!很重要!很重要!在接口性能优化中我常用“sql优化、业务优化、算法优化”三把斧。其中“业务优化”中有“是否有可以异步进行的”这么一小则。今天的主题我们来看看Spring中相关异步中异常的那点事。本文不是异步入门,默认读者有初步的异步知识。还不懂异步的读者请先网上查找相关资料先了解。异步方法有两种形式:无返回值:void有返回值:可以声明常规的java.util.concurrent.Future返回类型,还

2021-04-06 15:39:58 3234

原创 LoadTimeWeaving实现AOP

LoadTimeWeaving技术还是比较偏陌生的,博主也是在源码学习中,发现了它,关于它的资料也不多。Spring 5 文档中只有这么少少一段介绍。主要参考这位博主:https://blog.csdn.net/weixin_34279061/article/details/93034171LoadTimeWeaving字面意义上看去就是加载期织入。看到织入,我们会联想到AOP,想到AOP,我们肯定会立马想到老生常谈的动态代理。其实AOP不止动态代理这么一种实现,不要因为我们用惯了动态代理就把这二

2021-03-31 17:41:17 448 3

原创 自研框架之自定义注解标注的Bean交由Spring管理

开篇前,我给此文起个小标题(受老钱的《Redis深度历险》有感起的)----自研框架中那颗最核心的螺丝。在注解驱动编程模型下,自定义注解永远避不开;在Java领域中,同样离不开Spring。相信大家都对Dubbo的@Service(高版本已变为@DubboService)、@Reference(高版本已变为@DubboReference)以及Mybatis的@Mapper注解等有所了解。但是有没有深入想过他们区区一个普通注解是怎么让spring接管这些注解所标记的Bean呢?在注解模式下,纳入Sprin

2021-03-26 17:14:22 1207

原创 从源码理解Dubbo扩展点加载机制的实现原理

Dubbo的整个扩展机制最核心的类就是ExtensionLoader。在这个类里面实现了配置加载、扩展类缓存、自适应对象生成等所有工作。1 工作流程ExtensionLoader 的逻辑入口可以分为getExtension、getAdaptiveExtension、getActivateExtension三个,分别是获取普通扩展类、获取自适应扩展类、获取自动激活的扩展类。总体逻辑都是从调用这三个方法开始的,每个方法可能会有不同的重载的方法,根据不同的传入参数进行调整,流程如下三个入口中,ge

2021-03-17 17:53:04 331 2

原创 Dubbo扩展点加载机制

1 加载机制概述Dubbo具有很好的扩展性,这与其巧妙的运用设计模式、特殊的加载机制密切相关。基于Dubbo SPI 加载机制,让整个框架的接口和具体实现完全解耦,从而奠定了整个框架良好扩展性的基础。Dubbo 几乎所有的功能组件都是基于扩展机制(SPI)实现的。博主的Honey-Audit审计服务也是利用SPI机制奠定其良好的扩展性基础1.1扩展点的分类与缓存Dubbo SPI 可以分为Class 缓存、实例缓存。这两种缓存又能根据扩展类的种类分为普通扩展类、包装扩展类(Wrapper)、自

2021-03-16 18:03:02 228

原创 从源码角度一步步窥探Nacos配置拉取与动态刷新、监听原理

在分析原理前,我们先来回顾一些nacos的几个用法。用法一:读取nacos配置中心的值。这种语法跟注入本地的配置一样。是spring的注解,从当前环境的属性集合获取值。@Value(value = "${info:Local Hello world}")private String info;配置中心的值变化后,应用无法实时感知,需要重启应用,值才会相应变更。用法二:动态获取nacos配置中心的值。用的是nacos的注解NacosValue,autoRefreshed 表示是否自动更新。@

2021-01-13 11:43:35 5285 9

原创 从源码角度一步步窥探Nacos的服务注册与发现原理

现在主流的注册中心还是挺多的,并且实现得都很不错,像zookeeper、Nacos、Etcd、Consul、Eureka等。笔者呢,比较喜欢zookeeper多一点,因为zk的节点特性以及监听机制提供的便利确实很大。当然Nacos我也喜欢,所以本文基于spring cloud alibaba着重分析一下Nacos这个注册中心是如何实现服务的注册与发现的。这里顺带一下,携程的Apollo配置中心底层也有用到Eureka这么个东东哦,所以它们都是很优秀的Nacos的客户端访问服务端有两种方式:1、Op

2020-12-30 11:50:50 530

原创 从源码角度一步步窥探Dubbo服务发布原理

从源码角度一步步窥探Dubbo服务发布原理

2020-12-28 17:20:37 1271 8

转载 Solr原理

1.倒排索引基本概念      文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。       文档集合(Docume...

2019-01-05 14:07:20 3508

原创 Dubbo原理分析

接触了dubbo框架已经接近一年,今天把dubbo框架的实现总结一下。1.前言未有dubbo之前,我们在应用与应用跨应用调用,一般可以采用基于TCP的socket来实现(当然也可以用netty或者httpclient),当采用这种调用方式,会有一个严重弊端,那就是当服务过多时,导致调用者与被调用者的关系链变得负责,用专业术语来说就是服务治理问题。而解决服务治理问题的核心方法就是使用注册中心...

2018-12-22 22:01:23 718

原创 深入理解数据库索引的实现原理

什么是索引索引是帮助数据库高效获取数据的数据结构。索引是在基于数据库表创建的,它包含一个表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中。索引是以索引文件的形式存放于磁盘中。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。索引的优缺点在mysql优化中,当我们定位到了慢查询语句后,我们都会适当给它建立索引来提高查询效率。是的,索引的作用就是高效提...

2018-12-21 15:59:26 709

原创 数据库事务相关知识总结

数据库事务的四个基本要素(ACID)1.原子性(A):事务的原子性是指事务是一个不可分割的工作单位,这组操作要么全部发生,否则全部不发生。发生错误就回滚。2.一致性(C):在事务开始以前,被操作的数据的完整性处于一致性的状态,事务结束后,被操作的数据的完整性也必须处于一致性状态。比如转账:有5个账户,每个账户各有100元,5个就是500元。不管5个账户之间如何并发转账,5个账户的总额应该还...

2018-12-21 13:52:13 304

原创 Java并发之AQS学习笔记

Java并发包(JUC)中有几个重要并发类如CounDownLatch、Semaphore、CyclicBarrier以及我们重要的可重入锁ReentrantLock等。它们的底层实现就是基于AQS实现的。看过源码之后,会惊叹设计者的设计之妙!说到AQS,在Java并发中,还有一种CAS算法,它是Java并发包下原子类的实现的底层算法,这个笔者会另起篇幅来做学习总结。什么是AQSAbstr...

2018-12-13 21:28:42 430

原创 Java并发之死锁与解决方法

死锁  线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。产生死锁的四个条件1.互...

2018-12-12 23:14:07 842

原创 Java并发之线程池学习笔记

JUC包下有一个重要的线程池的实现,大大优化方便了我们对线程的使用,而不再是传统的new一个Thread。线程池相对传统的直接创建线程主要有三个优点:1.统一管理线程,可以重用存在的线程,避免多次的创建、消亡的开销,使得性能表现得更好2.可以有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源的竞争,避免阻塞3.提供定时执行、定期执行、单线程、并发数控制等功能如何使用线...

2018-12-12 22:44:22 287

原创 二叉树常用算法实现(Java)

 剑指offer与LeetCode刷题过程中二叉树相关算法的实现总结/** * Copyright (C), 2018, 杨智杰 * FileName: BinaryTree * Author: 猪猪 * Date: 2018/11/24 12:14 * Description: 二叉树 * History: * <author> &l...

2018-12-02 22:55:12 1604

转载 TCP三次握手四次挥手

确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1; 同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1; 终止FIN,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放; TCP连接的建立(三次握手) 先附上TCP连...

2018-12-02 22:42:03 248

原创 初入红黑树

说红黑树之前,首先有必要理解各种树的概念。这里有一篇写得很好相关概念的介绍,并且有相关操作的算法代码实现https://www.cnblogs.com/kuotian/p/5333956.html红黑树是一种自平衡二叉查找树。1.红黑树的性质:一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:1)每个结点要么是红的,要么是黑的。2)根结点是黑的。3...

2018-11-26 21:50:39 315

原创 深入理解JVM--Java程序如何在虚拟机中运行

Java 虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC 寄存器、Java 方法栈和本 地方法栈。Java 程序编译而成的 class 文件,需要先加载至方法区中,方能在 Java 虚拟机中运行。JVM将字节码编译成机器码有两种方式:第一种是解释执行,即逐条将字节码翻译成机器码并 执行;第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包...

2018-11-25 21:46:26 601

原创 深入理解JVM--内存模型及其内存溢出异常

要想深入理解JVM,必然先理解JVM的内存模型。根据Java虚拟机规范,Java虚拟机所管理的内存区域包括以下几个运行时内存区域,如下图所示。接下来逐一讲解每个内存区域的具体作用。1.程序计数器(线程私有)程序计数器是一块很小的内存区域,它可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条要执行的字节码指令,比如分值、循环、跳转、异常...

2018-11-05 22:57:04 280

原创 实战-SpringBoot与Shiro安全框架整合实现认证以及权限管理

SpringBoot是最近比较火的变态版spring系列框架,但是本文这里不是讲解springboot相关方知识的博文,如果有兴趣,博主会抽空整理写一篇。至于Shiro的相关理论知识以及实战(SSM),博主在之前的博文有详细介绍。1.实战-Shiro安全框架(一)认证2.实战-Shiro安全框架(二)权限控制要实现Shiro与SpringBoot的整合,最核心的就是要将shiro的配置...

2018-11-02 11:56:25 900

原创 实战-Shiro安全框架(二)权限控制

  上一篇讲解了shiro的认证流程以及实现。这一篇,笔者要详细讲解shiro的另一重要部分就是权限控制,简称授权。  授权流程跟认证流程很相似,大致过程为当前用户subject调用isPermitted*/hasRole* 接口时,将会委派给security manager,security manager委派给Authorizer(授权器)。比如调用的是isPermitted("user:...

2018-10-27 20:52:57 567

原创 实战-Shiro安全框架(一)认证

  Shiro是一个很不错的安全权限框架,可以完成认证、授权、加密、会话管理、缓存等。既能用于javase,也可以用于JavaEE中。这里,笔者以Javaee中为例,讲解一下shiro的第一部分--认证。  认证,通俗的说,就是我们web系统的登陆。使用shiro框架后,就不用我们向之前那样写较多的对账号密码的逻辑判断校验了,直接调用shiro的相关api即可轻松完成认证。当然,这里面的底层也...

2018-10-27 15:08:03 614

原创 hibernate快速入门(适合初学者)

    hibernate是一个ORM(对象关系映射)框架,ORM简单的说就是我们的实体对象与数据表的映射,由实体对象映射出数据表。hibernate是非常优秀的dao层的框架之一。使用hibernate框架,可以大大提高我们的开发效率,摆脱繁琐的jdbc原始操作,甚至都不用写sql语句了,这是我们程序员最希望的啦。    搭建hibernate工程非常简单大体可以分为以下几个步骤。    第一步...

2018-05-24 16:24:22 1112

原创 ActiveMQ与Spring的整合

ActiveMQ是遵循jms规范编写的,所以单独使用ActiveMQ时,步骤稍微有点繁琐,但又比较死板。但ActiveMQ可以与spring完美整合,整合后,ActiveMQ的使用就相当方便了。目前企业开发绝大多数用到spring,所以ActiveMQ与Spring的整合过程有必要学习。接下来笔者详细带大家学习ActiveMQ与Spring的整合过程。(笔者建议读者先阅读笔者之前写过文章,了解Ac...

2018-02-12 23:00:31 529

原创 java_三大变量-静态变量、成员变量、局部变量

这篇博客中,笔者将详细介绍java中类中三大变量-静态变量、成员变量、局部变量。局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。静态变量(类变量):静态变量也声明在类中,方法体之外,但必须...

2018-02-12 22:24:57 855

原创 java_类与对象

今天笔者将要介绍的是java的基础篇--类与对象。对象:对象是类的一个实例。万物皆对象,对象具有状态与行为特征。比如一只猪有名字,有年龄,会有睡觉,吃饭等行为。类:类是一类对象的集合。它描述一类对象的行为和状态。比如人类是男人与女人的统称。java中的类public class User { //类中的属性(状态) String name; int age; //类中方法(行为) pub...

2018-02-12 21:51:27 331

原创 Redis集群搭建

1.1. Redis集群的搭建Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。Redis集群至少需要6台服务器。搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-70061.1.1.    集群搭建环境1、使用ruby脚本搭建集群。需要ruby的运行环境。安装rubyyum install rubyyum install ...

2018-02-11 15:15:38 323

原创 Redis的基础知识(使用)

1.1. Redis五种数据类型String:key-value(做缓存)Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。get、set、incr:加一(生成id)Decr:减一 Hash:key-fields-values(做缓存)相当于一个key对于一个map,map中还有key-value使用hash对key...

2018-02-11 15:14:28 263

原创 redis安装

1.  Redis的安装 1.1. Redis的安装Redis是c语言开发的。安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yuminstall gcc-c++ 安装步骤:第一步:redis的源码包上传到linux系统。第二步:解压缩redis。第三步:编译。进入redis源码目录。make 第四步:安装。makeinstall PREFIX=/usr/local/redisPR...

2018-02-11 15:13:07 314

ssh组合框架API

java开发中,Struts2、spring、hibernate框架中英文API大全

2017-11-29

javaweb网上图书商城

经典的Javaweb商城项目。适合初学者学习参考。项目用到jsp、servlet、mysql等一些基础技术。支持在线支付,是电商类的学习项目的最佳选择。

2017-11-22

安卓Android源码

超级实用的安卓源码

2017-05-01

H5web app移动开发

8套实用漂亮的H5移动开发源码

2017-04-08

一个很使用强大的实现二维码的jar包

jdk1.4以下使用 代码如下 private BufferedImage qRCodeCommon(String content, String imgType, int size) { BufferedImage bufImg = null; try { Qrcode qrcodeHandler = new Qrcode(); // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小 qrcodeHandler.setQrcodeErrorCorrect('M'); qrcodeHandler.setQrcodeEncodeMode('B'); // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大 qrcodeHandler.setQrcodeVersion(size); // 获得内容的字节数组,设置编码格式 byte[] contentBytes = content.getBytes("utf-8"); // 图片尺寸 int imgSize = 67 + 12 * (size - 1); bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); // 设置背景颜色 gs.setBackground(Color.WHITE); gs.clearRect(0, 0, imgSize, imgSize); // 设定图像颜色> BLACK gs.setColor(Color.BLACK); // 设置偏移量,不设置可能导致解析出错 int pixoff = 2; // 输出内容> 二维码 if (contentBytes.length > 0 && contentBytes.length < 800) { boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); for (int i = 0; i < codeOut.length; i++) { for (int j = 0; j < codeOut.length; j++) { if (codeOut[j][i]) { gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3); } } } } else { throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800]."); } gs.dispose(); bufImg.flush(); } catch (Exception e) { e.printStackTrace(); } return bufImg; } /** * 解析二维码(QRCode) * @param imgPath 图片路径 * @return */ public String decoderQRCode(String imgPath) { // QRCode 二维码图片的文件 File imageFile = new File(imgPath); BufferedImage bufImg = null; String content = null; try { bufImg = ImageIO.read(imageFile); QRCodeDecoder decoder = new QRCodeDecoder(); content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8"); } catch (IOException e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } catch (DecodingFailedException dfe) { System.out.println("Error: " + dfe.getMessage()); dfe.printStackTrace(); } return content; }

2017-04-08

传智播客二维码jar包

很简单的代码就可实现 @Test public void Code() throws FileNotFoundException, IOException{ VerifyCode verifyCode = new VerifyCode(); BufferedImage bi = verifyCode.getImage();//随机 System.out.println(verifyCode.getText());//读取 verifyCode.output(bi, new FileOutputStream("D:/a.jpg")); }

2017-04-08

空空如也

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

TA关注的人

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