自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

A minor

菩提本无树,明镜亦非台。本来无一物,何处惹尘埃

  • 博客(548)
  • 资源 (1)
  • 收藏
  • 关注

原创 OSS和ACM同名类冲突问题

因为代码是静态的,所以编译是没有问题的,只是在运行时才会抛出异常,导致类无法实例化,最终导致 NoClassDefFoundError。这次碰到的这个问题和常见的 jar 包冲突问题还不太一样,jar 包冲突是指 maven 仲裁下的同 jar 包不同版本问题,而这里碰到的是不同 jar 包的类冲突问题,但本质上它们都是为了遵守 jvm 中同一个 classloader 实例加载的类不能重复,即 [同名+同classloader加载] 的类只能存在一个。记一次开发中碰到的类冲突问题。

2023-04-09 21:32:07 260 1

原创 【面向对象】领域驱动设计核心

模型好不好,结果来反映 => 效率(开发/扩展)理想模型是,概念剥离好,可复用程度高不好的模型会成为负债,最终会被淘汰掉。

2023-04-02 20:31:18 348

原创 分布式场景下,服务发现的几种模式

上面介绍了三种服务发现模式及优缺点,业界大公司目前使用较多的是第二种,比如阿里内部的HSF,蚂蚁的sofa,因为它们对性能有更高的要求,且有足够强的研发能力。但大多数公司及团队更适合其实是第一种集中式代理的模式,实施和维护起来成本相对较低,性能方面也被很多企业验证过是没问题的。集中式代理优化集中式代理,因为没有自动的服务发现机制,所以每增加一个服务或者一个服务提供者都要手动去 LB 上面配置一下,存在较长的配置周期。

2023-03-26 23:08:48 409

原创 了解 React Hook(钩子函数)

自定义 Hook 就是将组件之间需要共有的逻辑抽出来写成单独的函数。与一般的函数的区别是,自定义 Hook 是一个以 use 开头的函数,内部可以调用其它的 Hook。import {});在另外一个组件中,将其引入后,就可以使用了import {可以看出,自定义 Hook 就是一个 JavaScript 函数而已,并没有什么特别。不过需要注意的是,自定义 Hook 函数也必须以 use 开头(规约优先)。useContext【使用共享状态】

2023-03-26 18:52:29 646

转载 Jenkins实现自动化CI/CD

原文链接:https://juejin.cn/post/7064389514470359053在本篇文章中,将讲解使用jenkins帮助我们监听git仓库的变化,一旦有新的push到master分支,jenkins服务则从gitee主动拉取项目代码,构建新镜像,然后删除同名旧镜像和旧容器,部署新容器。而对于开发者来说,你向远程仓库的master分支push了新的代码之后,就可以马上访问url看到最新的项目运行结果,一切都将由jenkins帮你完成(只要事先配置好jenkins工作流程)

2023-03-26 18:13:29 255

转载 TS中的问号 ? 与感叹号 ! 是什么意思

在TypeScript里面,有4个地方会出现问号操作符,他们分别是1)三元运算符// 当 isNumber(input) 为 True 时返回?: 之间的部分;// isNumber(input) 为 False 时返回 :;之间的部分 const a = isNumber(input)?2)可选参数// 这里的?表示这个参数 field 是一个可选参数 function getUser(user : string , field?3)成员// 这里的?表示这个name属性有可能不存在class A {

2023-03-26 16:47:22 755

原创 K8S一些基础概念

K8S 是由 Google 公司 用go 语言开发的。google 在全球有相当多的服务器,当然需要一个管理软件。Google内部本身就有一个叫 borg 的系统云平台管理工具,已经使用了十几年。后来参照 borg 系统架构开发了 k8s,主要用它来编排、管理容器,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

2023-03-19 21:00:22 331

原创 敏捷开发&TDD测试驱动

前一阵子团队组织了敏捷和TDD的培训,这里记录一下。

2023-03-12 01:07:44 195

原创 【JVM】类加载器(三):常见问题分析

前面文章讲过,在不指定父类加载器的情况下,默认采用系统类加载器。可能有人觉得不明白,现在我们来看一下JDK对应的代码实现。// 摘自java.lang.ClassLoader.java protected ClassLoader() {= null) {//... }//... }//... }//... }//... }//本机对应输出如下:所以,我们现在可以相信当自定义类加载器没有指定父类加载器的情况下,默认的父类加载器即为系统类加载器。

2023-03-12 00:52:43 172

原创 【JVM】类加载器(二):Tomcat 打破双亲委派

首先思考一个问题,整个Tomcat容器是一个Java进程,假若Tomcat中同时部署了两个应用,应用A依赖Spring3.0,应用B依赖Spring5.0,那么Tomcat如何决定使用哪个版本的依赖呢。所以,按照JDK自带的双亲委派模型是无法解决的,因为ClassLoader#loaderClass默认会检查这个类有没有加载过,保证了类在进程中是唯一的。如果我们想加载两个版本的类,需要打破原有的模型。

2023-03-12 00:29:47 1482

原创 【JVM】类加载器(一):类加载机制及自定义ClassLoader

入口,定义了 加载/寻找 Class 的策略。比如双亲委派,或者其他形式调用 findClass() 读入 class 文件,并生成 Class 对象根据 class 名,在当前 ClassLoader 能处理路径中查找,如果能找到就将 class 文件读入调用 defineClass 生成 Class 对象native 方法将字节数组生成 Class 对象。

2023-03-12 00:28:26 1071

原创 【面向对象】领域驱动(四):总结及注意事项

聚合根利用仓储管理聚合内实体数据之间的一致性,这种方法对于管理新建和修改数据非常有效,比如在修改订单数据时,它可以保证订单总金额与所有商品明细金额的一致,但它并不擅长较大数据量的查询处理,甚至有延迟加载进而影响效率的问题。战略设计时构建的领域模型,是微服务设计和开发的输入,它确定了微服务的边界、聚合、代码对象以及服务等关键领域对象。因此,在遵守领域边界和微服务分层等大原则下,在进行战术层面设计时,我们应该选择最适合的方法,不只是 DDD 设计方法,当然还应该包括传统的设计方法。

2023-03-10 00:57:04 79

原创 【面向对象】领域驱动(三):怎么做领域驱动?

领域驱动设计的宏观层次是战略设计,微观层次是战术设计。战略设计:从业务视角出发,完成领域到子域的分解,并为子域定义核心子域和通用子域属性。在子域内展开事件风暴,根据上下文语义边界来划分限界上下文,建立通用语言,完成领域建模。在建立领域模型后,我们将领域模型作为微服务设计的输入完成战术设计。战术设计:从技术视角出发,侧重于对领域模型的技术实现,按照领域模型完成微服务的设计和落地。

2023-03-10 00:53:26 319

原创 【面向对象】领域驱动(二):为什么要做领域驱动?

面向对象语言的诞生,让计算机世界有了物理世界的对象概念,但是这还不够,DDD 定义了一些基本概念,然后尝试让业务和开发都能够理解这些概念名词,然后让领域专家(可以理解为熟悉业务的人)使用这些概念名词来描述业务,而由于使用了规定的概念名词,开发就可以很好的理解领域业务,并能够按照领域业务设计的方式进行软件实现。DDD 初衷:让业务架构绑定系统架构。后来发现这个方法不仅仅可以做好翻译,还可以帮助业务划分领域边界,可以明确哪个领域是自己的核心价值所在,以后应该重点发展哪个领域。

2023-03-10 00:46:11 223

转载 MYSQL自增主键丢失问题

(1)如果mysql重启了,那么innodb表在启动后,AUTO_INCREMENT值会自动检测出、并重置为当前表中自增列的最大值+1。(2)假如一个表里AUTO_INCREMENT计数器的值是10,此时执行update table set id = 15 where id = 9后,如果这时再继续插入数据,到了自增ID=15的时候是会报错。但是这个时候继续插入,就不会报错。因为刚才即使报错了,AUTO_INCREMENT的值依旧会增加。

2023-02-17 20:34:36 757

原创 【面向对象】领域驱动(一):什么是领域驱动(基础概念)

DDD 的全称是 Domain-driven Design ,即领域驱动设计。2004 年埃里克·埃文斯发表了《领域驱动设计》这本书,从此领域驱动设计)诞生。DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性,如今已经发展为一种针对大型复杂系统的领域建模与分析方法。

2022-10-24 22:38:19 3601 2

转载 【开发杂记】DOM 是什么?

js中经常会出现DOM这个词,那么DOM是何方神圣呢?DOM 是 Document Object Model(文档对象模型)的缩写。下面是MDN对DOM的解释:文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。在浏览器渲染机制中,浏览器解析HTML标签,构建

2022-03-17 21:02:56 134

原创 React 开发杂记(核心语法总结)

react开发杂记

2022-03-17 21:01:57 197

原创 Docker Swarm 及 K8S 产生背景

1.Swarm 产生背景使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。虽然 Docker 项目备受追捧,但用户们最终要部署的,还是他们的网站、服务、数据库,甚至是云计算业务。这就意味着,只有那些能够为用户提供平台层能力的工具,才会真正成为开发者们关心和愿意付费的产品。而 Doc

2022-01-09 20:06:11 232

原创 Docker 的产生背景

PaaS 项目被大家接纳的一个主要原因,就是它提供了一种名叫“应用托管”的能力。PaaS 之所以能够帮助用户大规模部署应用到集群里,是因为它提供了一套应用打包的功能。可偏偏就是这个打包功能,却成了 PaaS 日后不断遭到用户诟病的一个“软肋”。出现这个问题的根本原因是,一旦用上了 PaaS,用户就必须为每种语言、每种框架,甚至每个版本的应用维护一个打好的包。这个打包过程,没有任何章法可循,更麻烦的是,明明在本地运行得好好的应用,却需要做很多修改和配置工作才能在 PaaS 里运行

2022-01-09 19:49:44 612

原创 【MySQL】基础使用(四):用户及权限操作

查看用户、权限、角色的命令和视图查看所有用户:select * from dba_users;select * from all_users;select * from user_users;2.查看用户系统权限:select * from dba_sys_privs;select * from session_privs;select * from user_sys_privs;3.查看用户对象权限:select * from dba_tab_privs;select * fro

2021-06-24 23:42:14 366

原创 【MySQL】基础使用(三):视图操作及其作用

https://blog.csdn.net/buhuikanjian/article/details/53105416视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。–创建视图–create or replace view v_student as select * from student;–从视图中检索数据–select * fr

2021-06-24 23:40:47 1264

转载 什么是灰度发布?

在新版本应用发布时,为了服务器不停机升级,使用灰度发布策略,在灰度发布开始时,使用 HTTP Header 匹配指定测试人员的流量到新版本上,然后当新版本内部测试通过后,可以再按百分比,将用户流量一点一点导入到新版本中,比如先导入 10% 观察一下运行情况,然后再导入 20%,如此累加,直到将流量全部导入到新版本上,最后完成升级,如果期间发现问题,就立即取消升级,将流量切回到老版本。运用灰度发布,就再也不需要加班到深夜进行停机升级了,在白天就可以放心大胆地、安全地发布新版本。

2021-06-01 16:08:59 1210

原创 【Redis】事务浅析

我们知道 Redis 的单个命令是原子性的(比如 get set mget mset),如果涉及到 多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务。例如用 setnx 实现分布式锁,我们先 set,然后设置对 key 设置 expire, 防止 del 发生异常的时候锁不会被释放,业务处理完了以后再 del,这三个动作我们就希望它们作为一组命令执行。Redis 的事务有两个特点:按进入队列的顺序执行不会受到其他客户端的请求的影响1.事务的用法命令描述

2021-05-07 23:13:02 298

原创 【Redis】基础结构(五):ZSet 类型命令、应用、原理

zset 似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。1.常用命令ZADD key score member [[score member]…] // 往有序集合key中加入带分值元素ZCARD key // 返回有序集合key中元素个数ZREM key member [member …] // 从有

2021-05-06 22:47:24 582

原创 【Redis】基础结构(三):List 类型命令、应用、原理

Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。1.常用命令1.存(push)lpush key value [key value...] // 将一个或多个值value插入到key列表的表头(最左边)rpush key value [key value..

2021-05-06 22:46:23 223

原创 【Redis】基础结构(二):Hash 类型命令、应用、原理

Redis 的字典相当于Java 语言里面的 HashMap,它是无序字典。内部实现结构上同 Java 的 HashMap 也是一致的,同样的数组 + 链表二维结构。第一维 hash 的数组位置碰撞时,就会将碰撞的元素使用链表串接起来。优点:同类数据归类整合存储,方便数据管理相比string操作消耗内存与cpu更小相比string更节省空间缺点:过期功能不能用在field上,只能用在key上Redis集群架构下不适合大规模使用1.常用命令1.增(hset)hset key f

2021-05-06 22:45:20 236 2

原创 【Java杂记】System.getProperty() 常用参数及解释

我们可以通过 System.getProperty(key) 很方便的获取到很多系统参数。1)运行环境java.home: Java installation directory (Java 安装目录)java.vendor.url: Java vendor URL (Java 供应商的 URL)java.version: Java Runtime Environment version(Java 运行时环境版本)

2021-05-05 03:36:50 641

原创 【Maven】基本使用:坐标与依赖

1.坐标在数学中, 任何一个坐标可以唯一确定一个“点”。Maven 中坐标是Jar包的唯一标识,坐标元素包括groupId、artifactId、version、packaging:元素描述说明groupId定义当前模块隶属的实际Maven项目中小企业常常直接对应公司/组织artifactId定义实际项目中的一个Maven模块唯一标识一个模块version定义当前项目所处版本SNAPSHOT 表示不稳定的版本。 LATEST 指最新发布的版本,可能是个发布

2021-05-05 00:19:58 607 1

原创 【设计模式】行为型:迭代器模式

迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。 它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合 对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。迭代器模式将 集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一。迭代器是用来遍历容器的,所以,一个完整的迭代器模式一般会涉及容器和容器迭代器两部 分内容。为了达到基于接口而非实现编程的目的,容器又包含容器接口、容器实现类,迭代

2021-05-02 17:18:44 180

原创 【设计模式】行为型:责任链模式

责任链模式的定义是:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它 为止。说的更直白一些,在责任链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作责任链模式。1.代码示例// 抽象处理者public a

2021-04-30 19:56:06 154 1

原创 【Java杂记】代理:手动实现一个简易动态代理

Java 动态代理本质的本质就是通过代码写代码,即根据我们新定义的逻辑,实现接口,重新生成代理类class $Proxy0 implements ~{ class InvocationHandler { class Obj implements ~ { } }}调用逻辑: $Proxy0#f() -组装参数-> InvocationHandler#invoke() -控制访问-> Obj#f()我们下面就来实现一个完全属于我们自己的动态代理…要实现目标先从最终要达到的

2021-04-30 19:55:25 450 2

原创 【设计模式】创建型:建造者模式

1.理论定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的对象用户只需指定要建造的类型就可以得到他们,建造过程及细节不需要知道适用场景如果一个对象有非常复杂的内部结构(很多属性)想把对象的创建与使用分离优点封装性好,创建和使用分离扩展性好,建造类之间独立,一定程度上解耦缺点产生多余Builder对象产品内部发生变化,建造者都需要修改,成本较大与工厂模式对比建造者更适用于创建对象的方法流程复杂,而工厂模式适合创建对象的方法简单(或单一)

2021-04-30 16:48:09 131 2

原创 【MyBatis】插件原理(一):如何实现一个插件

我们可以通过 System.getProperty(key) 很方便的获取到很多系统参数。1)运行环境java.home: Java installation directory (Java 安装目录)java.vendor.url: Java vendor URL (Java 供应商的 URL)java.version: Java Runtime Environment version(Java 运行时环境版本)

2021-04-30 16:23:21 216 1

原创 【Java杂记】文件操作:如何获取文件绝对路径?

1.获取当前项目的绝对路径String absolutePath = System.getProperty("user.dir");System.out.println(absolutePath); // C:\Users\13275\Documents\Java\Java-project\myJdkDynamic另外,还可以通过 File 来获取File f = new File("");String absolutePath = f.getAbsolutePath()System.ou

2021-04-30 15:47:24 6915 1

原创 【Java杂记】文件操作:File 类核心 API 及特殊示例

我们下面通过一段代码来看 File 类的核心函数:public class TestFile { public static void main(String[] args) { String path = "C:/windows/"; // 指定文件所在的目录 File f = new File(path, "notepad.exe"); // 建立File变量,并设定由f变量引用 System.out.prin

2021-04-30 13:03:25 136

原创 【Java杂记】反编译:javap,jd-gui,jad 对比总结

关于反编译我们可以使用的工具有三种:javap、jad、jd-gui,本篇我们就来看看这它们的区别是什么。先来看看测试用的代码,是枚举单例:然后将该代码进行编译生成 .class 文件。PS:关于编译,我们这里既可以直接使用 javac 命令,也可以使用 ide 自动编译(包括 maven)。下面我们就分别使用以上三种方式对上面的代码进行 EnumSingleton.class 反编译,对比得到结果。1.javapjavap 是 jdk 自带的反编译工具,我们常用的命令有以下两种:ja

2021-04-30 11:28:20 916 2

原创 【设计模式】行为型:几种设计模式小结

我们知道,创建型设计模式主要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合”问题,那行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型模式比较多,有 11 种,它们分别是:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。1.观察者模式观察者模式将观察者和被观察者代码解耦。观察者模式的应用场景非常广泛,小到代码层面的解耦,大到架构层面的系统解耦,再或者一些产品的设计思路,都有这种模式的影子,比如,邮件订

2021-04-29 00:40:27 2368

原创 【设计模式】结构型:代理模式(四)总结对比

代理模式(Proxy Design Pattern)的原理和代码实现都不难掌握。它在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。1.代理模式的实现与原理在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。2.静态代理和动态代理区别静态代理需要针对每个类都创建一个代理类

2021-04-28 23:55:07 111

原创 【设计模式】结构型:代理模式(三) CGLib 动态代理

在前两篇文章我们分别介绍了静态代理,以及基于 JDK 实现的动态代理,本篇我们再来介绍一下 Cglib 动态代理。代理模式都是生成一个新的类,去实现增强代码逻辑的功能,但JDK Proxy 对于用户而言,必须要有一个接口实现,目标类相对来说复杂;而 CGLib 可以代理任意一个普通的类,没有任何要求。PS:JDK是采用读取接口的信息,CGLib覆盖父类方法。还是以媒婆为例,创建 CglibMeipo:// 实现 MethodInterceptor 接口public class CGlibMei

2021-04-28 23:22:51 102

jdk8环境(解压即用)

jdk8,解压即用。

2020-09-18

空空如也

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

TA关注的人

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