自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(132)
  • 收藏
  • 关注

原创 分布式事务的实现方式

分布式事务的一般解决方案

2022-07-02 15:21:25 373 1

原创 RocketMQ的路由中心:NameServer源码解析

1 前言对于大部分开发过分布式系统的同学来说,对于服务发现肯定不陌生,分布式系统中的服务注册中心主要是提供服务调用的解析服务,服务调用者可以通过注册中心找到对应的服务提供者,从而进行方法的调用。类似地,RocketMQ里也有一个注册中心,称之为NameServer。接下来,我们就通过这篇文章,来对NameServer一探究竟吧!2 RocketMQ的整体架构首先来看看RocketMQ的整体部署架构,如图:分为下列四个部分:Producer:消息发布的角色,支持分布式集群方式部署。Produc

2022-05-21 20:55:52 680 1

原创 RocketMQ的单机部署

1 前言承接着我的上一篇文章RocketMQ的概念与特性,相信大家对RocketMQ都有了一定地了解,为了进一步深入学习RocketMQ的设计,我们要把它的源码部署起来并启动运行,接下来就一步步让RocketMQ在我们的Mac上跑起来吧!2 前置条件部署前,我们的Mac需要具备如下软件:JDK 1.8Maven 3.2.X+IDEA因为本次的部署需要直接编译RocketMQ源码,构建出RocketMQ可执行包。3 下载源码打开RocketMQ在Github上的主页,获取仓库地址,然后在

2022-05-14 17:58:36 2891

原创 Go语言实现多态

多态是什么相信学过Java这种面向对象语言的同学对于多态来说都不陌生,在代码执行的时候,能够根据子类的类型去执行子类当中的方法。多态是指代码可以根据类型的具体实现采取不同行为的能力。如果一个类型实现了某个接口,所有使用这个接口的地方,都可以支持这种类型的值。Go语言多态举例有这样一个场景,我们在应用开发中涉及到很多通知事件,通知的类型可以是通过微信、QQ、Email等,那么我们可以抽象出一个接口,定义一个通知的接口,然后微信通知类、QQ通知类、Email通知类分别实现对应的通知方法。定义一个通知类

2022-02-19 21:29:00 3421

原创 Go语言切片详解

1 前言去年校招入职字节跳动从Java转Go已经有大半年了,说实话Go上手还是很容易的,而我期间一直在写业务相关的需求,对Go的一些底层数据结构的了解还是不够深入的,难得春节假期放长假,那么就以博客的形式来记录下Go数据结构的学习吧2 切片简介切片是一种数据结构,这种数据结构便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数 append 来实现的。这个函数可以快速且高效地增长切片。还可以通过对切片再次切片来缩小一个切片的大小。因为切片的底层内

2022-01-31 10:22:29 1982

原创 Go实现低性能集合Set

前言从去年校招入职至今,Java转Go已经有大半年了,在开发过程中发现Go还是有一些痛点的,它的基本数据结构主要是数组、切片、Map,像我们常用到的集合Set其实是没有的,需要自己实现一套。Set表示一个集合,Set里的元素不能重复,实现方式有:利用Map的Key是唯一的来实现直接用别人写好的Set,比较成熟的包是https://github.com/deckarep/golang-set作为一名Bytedancer,当然要享受造轮子的过程,那么现在我们来自己动手写实现一个Set线程不安全Se

2022-01-30 11:29:48 1086

原创 MySQL的数据是存在哪的

MySQL的数据是存在哪的?我们都知道,MySQL需要支持持久化,它把数据存储在磁盘中,在操作系统中会把管理磁盘的设备叫做文件系统,对于我们研发而言,我们大多数只会关心MySQL的索引、SQL性能优化,而对于数据是怎么存储、存在哪里这类问题就像是一个黑盒。接下来,就来通过这篇文章来简要了解下吧~1 数据存储在文件系统我们常用的存储引擎InnoDB都是把表存储在文件系统上的(即磁盘),当需要读取数据时,InnoDB会从文件系统中把数据读取出来返回给我们;当需要写入数据时,InnoDB又会把数据写回到文件

2022-01-22 11:32:26 17629

原创 手把手教你写一个RPC框架(三)

承接着上一节,手把手教你写一个RPC框架(二) 我们定义了两个注解、编写了的连接Zookeeper注册中心的逻辑,这一节,我们继续来完成RPC框架吧!七 序列化RPC框架中,离不开网络请求,服务A调用服务B的方法,要发送一个网络请求,服务B收到网络请求后,解析请求,然后把方法的执行结果返回给服务A。为了实现这些步骤,需要编写消息请求体、消息相应体、序列化与反序列化的相关逻辑。下面一起来看看怎么写吧~import lombok.Data;import java.io.Serializable;.

2021-12-15 19:55:09 2530

原创 手把手教你写一个RPC框架(二)

承接着上一节,手把手教你写一个RPC框架(一) 我们手写了一个Spring Boot Starter,开启了自己造轮子的第一步,这一节,我们继续来完成RPC框架吧!五 自定义注解我的需求时,使用我的RPC框架时,服务提供者可以通过注解的方式,告知框架哪些接口可以被远程过程调用,也就是将服务暴露出去;同时,服务消费者也可以通过注解的方式,把需要调用的远程服务的接口注入进来,从而调用它其中的方法。因此,我决定编写两个注解:@ZhonggerRpcServiceProvider:服务提供者注解,被该注.

2021-12-12 12:27:18 2431

原创 手把手教你写一个RPC框架(一)

一 写在前面最近在公司中进行开发,均是采用分布式微服务的开发方式,不同的微服务之间采用RPC框架进行通信与数据调用。通常在开发一个接口时,会需要调用其他微服务的接口,从而获取想要的数据,因为有了RPC框架,调用其他服务的接口非常方便,就像调用本地方法一样简单。于是我非常想学习RPC框架的原理并且自己实现一个RPC框架,为了记录这个过程,有了这个系列的文章。感兴趣的小伙伴们,记得一键三连~二 RPC框架...

2021-12-09 21:30:17 2591 2

原创 入门Zookeeper(一)

一、Zookeeper简介ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。1. Zookeeper的工作机制如图所示,服务器上线时,会将服务器的信息注册到Zookeeper中,客户端会从Zookeeper获取服务器信息列表,进行注册监听,当服务器节点下线或异常时,会通知Zookeeper,Zookeeper进而通知客户端。简单来说,Zo

2021-11-30 18:09:54 150

原创 Netty实战与源码剖析(三)——Netty线程模型

1 线程模型基本介绍不同的线程模式,对于程序的性能有很大的影响,Netty为何具有如此高的性能,很大程度上是得益于Netty采用的线程模型。目前主流存在的线程模型有两种:传统阻塞IO模型Reactor模型然而根据Reactor的数量和处理资源线程的数量不同,又可以将Reactor模型分为三种:单Reactor 单线程单Reactor 多线程主从Reactor 多线程Netty基于主从Reactor多线程模型做了一定的改进,其中主从Reactor多线程模型有多个Reactor。1.

2021-10-03 15:56:09 296

原创 Netty实战与源码剖析(二)——基于NIO的群聊系统

服务端实现package com.Zhongger.groupchat;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;import java.util.Set;/** * @author zhongmingyi * @date 2021/9/25 3:

2021-09-25 16:31:10 126

原创 Netty实战与源码剖析(一)——浅谈NIO编程

1 前言很久之前就想写与Netty相关的博客了,但由于个人时间安排的问题一直拖到了现在,目前我在字节是写Go语言,也很久一段时间没有接触Java了,借助这个机会,重新温习Java高级编程的同时,也把Netty实战以及源码剖析分享给各位读者。2 Netty是什么?Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol

2021-09-25 13:18:43 345

原创 再探滑动窗口:【存在重复元素 II】

题目给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且 i 和 j的差的 绝对值 至多为 k。解题思路维护一个哈希表,用来模拟滑动窗口,里面始终最多包含 k 个元素,滑动窗口的大小为k,当出现重复值时则说明在 k 距离内存在重复元素每次遍历一个元素则将其加入哈希表中,如果哈希表的大小大于 k,则移除最前面的数字,滑动窗口滑动时间复杂度:O(n)代码实现 public boolean containsNearbyDuplic

2021-08-07 21:34:14 155

原创 初识滑动窗口:【643. 子数组最大平均数 I】

滑动窗口指的是这样一类问题的求解方法,在数组上通过双指针同向移动而解决的一类问题。其实这样的问题我们可以不必为它们专门命名一个名字,它们的解法其实是很自然的。使用滑动窗口解决的问题通常是暴力解法的优化,掌握这一类问题最好的办法就是练习,然后思考清楚为什么可以使用滑动窗口。题目子数组最大平均数 I给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。例如:输入:[1,12,-5,-6,50,3], k = 4输出:12.75解释:最大平均数 (12-5-6+50).

2021-08-07 19:05:19 148

原创 使用GoLand来开始你的第一个Gin Web项目吧

参考文献 Gin框架文档 https://github.com/gin-gonic/gin一、New Project点击Create,成功之后可以看到项目中只有一个go.mod文件。二、go get 下载 Gin 框架依赖命令行进入项目目录中,下载Gin依赖: go get -u github.com/gin-gonic/gin下载完成后,可以看到go.mod文件下多了Gin的依赖:一般而言,都需要使用go.mod文件来对项目以来进行管理,就跟Java里的Maven一样。三、新建m.

2021-06-26 12:35:06 1319

原创 万字长文带你了解MySQL中的各种文件

参考文献《MySQL技术内幕 InnoDB存储引擎 第二版》MySQL中有各类文件,这些文件主要有:参数文件 :告知MySQL实例启动时在哪里可以找到数据库文件,并指定初始化参数等。日志文件 :用来记录MySQL实例对某些条件做出响应时写入的文件,例如错误日志、二进制日志、慢查询日志等。Socket文件 :当用UNIX域套接字方式进行连接时需要的文件。pid文件 : MySQL实例等进程ID文件。MySQL表结构文件:用来存放MySQL表结构定义文件。存储引擎文件:MySQL表的存储引擎.

2021-06-26 12:01:20 309

原创 RocketMQ的概念与特性

参考文献:《Apache RocketMQ开发者指南》1 消息模型(Message Model)RocketMQ主要由 Producer、Broker、Consumer 三部分组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的.

2021-06-23 11:30:36 233

原创 MySQL查询性能优化(下)

参考文献《高性能MySQL(第三版)》上一期主要对MySQL的查询过程进行了简要的梳理,理解了一条SQL执行的过程需要经过MySQL的各种组件,本期我们将重点探索下MySQL查询性能优化的方法。5 MySQL查询优化器的局限MySQL查询优化器对于以下几种类型的查询是不适用的。5.1 关联子查询where条件中包含in子句的子查询语句。例如:select * from a where a.id in (select b.id from b where b.name = 'zhongger'.

2021-06-03 18:53:15 164

原创 MySQL查询性能优化(上)

参考文献《高性能MySQL(第三版)》上一期我们深入理解了MySQL的索引,有了MySQL索引可以一定程度上提高MySQL的查询速度。这一期我们来学习下MySQL查询性能优化的一般方法。1 为什么查询速度会慢?其实很简单,在一个应用程序中,我们要查询一些数据,通常是从客户端出发,请求经过网络传输到达服务端后,在服务端进行解析,然后把查询命令发送给MySQL,MySQL经过一系列解析、优化等,最终将结果查询出来,返回给客户端,最终给到我们用户。在这一系列操作里,由于网络时延、CPU、内存、锁竞争、.

2021-05-31 13:37:22 243

原创 万字长文带你搞懂MySQL索引

参考文献《高性能MySQL(第三版)》之前找实习、参加秋招时准备面试都没有系统地复习过索引,都是零零碎碎地看一下博客和公众号,总结出了一套面试索引相关问题的组合拳,现在有时间静下心来看看书,那就系统地把索引的知识梳理一下吧。1 索引的类型1.1 B-Tree索引一般说到索引数据结构,大部分同学的第一反应就是B+树,其实不然。MySQL中的专业术语是B-Tree,在create table和其他语句中会见到B-Tree这个关键字。虽然很多存储引擎都使用B-Tree索引,但底层真正的数据结构又有所.

2021-05-08 18:05:45 150

原创 MySQL优化——Schema与数据类型设计

1. 更优化的数据类型(1)选择可以正确存储数据的最小数据类型。 因为它们占用更少的磁盘、内存和CPU缓冲,且处理时需要的CPU周期也更少。**(2)简单的数据类型。**因为简单数据类型的操作通常需要更少的CPU周期。eg:整型比字符型更好;使用MySQL内建的类型如date、datetime、time等而不是字符串来存储日期和时间;使用整型来存储IP地址而非字符串。(3)尽量避免NULL。通常情况下最好指定列为NOT NULL。因为若查询中包含可以为NULL的列,对于MySQL对可为NULL列使用索

2021-05-06 15:31:31 138

原创 MySQL InnoDB的插入缓冲Insert Buffer

MySQL InnoDB关键特性(一) 插入缓冲Insert BufferInsert Buffer是物理页的一个组成部分在InnoDB中,主键是行唯一的标识符,自增主键中行记录的插入顺序是按照主键递增的顺序进行插入的,故插入聚集索引一般是顺序的,不需要磁盘的随机读取。create table t1 (    a int auto_increment,    prim

2021-04-24 23:12:59 192

原创 AQS的应用:基于AQS实现自定义同步器

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等三、基于AQS实现自定义同步器之前学习了这么多关于AQS的原理性的知识,这一期,我们来基于AQS实现一个不可重入的独占锁, 自定义AQS需要重写一系列函数,还需要定义原子变量state的含义。这里我们定义, state=0 表示目前锁没有被线程持有 ,state=1 表示锁己经被某一个线程持有。 由于是不可重入锁,所以不需要记录持有锁的线.

2020-12-24 18:13:16 440 1

原创 AQS——条件变量的支持

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等二、AQS对条件变量的支持1、条件变量之前的推文中,讲解过notify和wait是配合synchronized内置锁来实现线程间同步的,而条件变量的signal和await方法则是通过AQS来实现线程间同步的。两者的不同之处在于:synchronized同时只能与一个共享变量的notify或wait方法实现同步AQS的一个锁可以对.

2020-12-11 18:30:35 340

原创 快速切换Git的用户名和密码,就是这么简单

快速切换Git的用户名和密码,就是这么简单建议使用这种方法,快速简单如果是用https方式clone代码,那么可以通过修改git配置中的用户和邮箱来切换用户:git config --global user.name "xxx"git config --global user.email "[email protected]"...

2020-12-09 13:17:04 2936

原创 AQS对锁的底层支持

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、AQS对锁的底层支持AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的。1、概述首先看看AQS的类图:其中Node节点的类图是:结合两张图和源码,我们可以知道AQS以及Node的特性:AQS是一个FIFO的双向队列,其内部通过节点he.

2020-11-26 18:23:05 357

原创 锁原理分析系列——LockSupport工具类

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等前面学习了很多Java并发编程的知识,很多知识点都离不开锁的支持,从这期开始,主要讲解一些Java并发包中的锁的原理,让我们来一起揭开它的神秘面纱吧。LockSupport工具类LockSupport是JDK中rt.jar包里的工具类,其主要作用是挂起和唤醒线程,它也是创建锁和其他同步类的基础。LockSupport类与每个使用它的线.

2020-11-25 19:30:35 373

原创 高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!

​微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、ArrayList线程不安全在Java的集合框架中,想必大家对ArrayList肯定不陌生,单线程的情况下使用它去做一些CRUD的操作是非常方便的,先来看看这个例子:public class ListTest { public static void main(String[] args) { List&lt.

2020-11-21 15:56:10 677 2

原创 浅谈比LongAdder功能更强大的LongAccumulator

一、前言上一期分析了LongAdder的原理,这期我们来学习下比LongAdder功能更强大的LongAccumulator。要是上期LongAdder不记得的同学就再看看这篇:高并发下解决AtomicLong性能瓶颈的方案——LongAdder 来回顾一下~LongAdder是本期要学习的LongAccumulator的一个特例,下面我们一起来探究下LongAccumulator。二、浅谈LongAccumulator1、LongAccumulator的结构如图,LongAccumulator类同

2020-11-16 20:53:11 248

原创 高并发下解决AtomicLong性能瓶颈的方案——LongAdder

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、 LongAdder简介LongAdder类是JDK1.8新增的一个原子性操作类。上一节说到,AtomicLong通过CAS提供了非阻塞的原子性操作,相比用阻塞算法的synchronized来说性能已经得到了很大提升。在高并发下大量线程会同时竞争更新同一个原子变量,但由于只有一个线程的CAS操作会成功,这就造成了大量线程竞争失败后,会通.

2020-11-15 22:42:33 1059 2

原创 JUC中原子操作类原理分析

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、前言java.util.concurrent 包里提供了一系列的原子性操作类,这些类都是使用CAS机制实现的,相当于使用锁实现原子性操作在性能上有了很大的提高。由于原子性操作类的原理都大致相同,所以本文主要讲解AtomicLong类的常用方法的分析。二、原子变量操作类AtomicLongAtomicLong是原子性递增或者递减类,其.

2020-11-12 20:21:32 389

原创 闯祸了,我用了一个‘<>’操作符引发的线上Bug

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、发现问题昨天下午四点多的时候,一位同事找到我说,我所负责的系统中修改机器状态的功能不可用了。我当时是感到非常开心的,因为摸了这么多天的鱼,终于有活干了!于是我在正式环境发了一个请求给出问题的接口,谷歌浏览器按F12,发现接口报错了,Http的返回码是500,很显然这是服务端报错。然后我查看报错的信息,发现:原来报错的原因是:'&.

2020-11-11 16:56:57 214

原创 浅谈Java中的“八锁”——概述、常见实现方式与使用场景

​微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等一、锁锁其实是操作系统中的一个概念。在多线程编程中,操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。所谓的锁,可以理解为内存中的一个整型数,拥有两种状态:空闲状态和上锁状态。加锁时,判断锁是否空闲,如果空闲,修改为上锁状态,返回成功;如果已经.

2020-11-10 19:15:40 802

原创 非计算机科班如何系统学习Java后端开发技术栈

​微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验、生活感悟等大三、大四的同学还可以找我帮忙【虎牙】内推噢。一、前言前不久,也就是国庆期间,我受信科党支部副书记的邀请(因为我是党支部的一名预备党员),给20级的师弟师妹们分享一些就业经验。因为新生入学了,我们党支部要给新生开展入党动员,其中有个环节是关于大学生活的经验分享环节,在现任支部成员里面,我在技术和就业方面还行,所以被邀请到给信科的师弟师妹.

2020-11-07 14:37:27 1073

原创 毕业后,选择国企“养老”还是互联网“打工”,我用亲身经历告诉你。

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验等…大三、大四的同学还可以找我帮忙【虎牙】内推噢。一起实习的同学决定回到老家的中国电信今天,一起在同个组里实习的同学准备离职了。离职的原因很简单,一是秋招已经结束,公司的校招HC已经没有了,二是他的岗位性质是无法走内部转正的,实习三个月后即可提出离职。既然这样,对于应届毕业生而言,再花上更多的时间和经历在这里并没有太大的意义。当然,他技术真心不错,.

2020-11-04 19:44:03 1356 3

原创 解决多线程间共享变量线程安全问题的大杀器——ThreadLocal

微信公众号:Zhongger我是Zhongger,一个在互联网行业摸鱼写代码的打工人!关注我,了解更多你不知道的【Java后端】打工技巧、职场经验等…大三、大四的同学还可以找我帮忙【虎牙】内推噢。上一期,讲到了关于线程死锁、用户进程、用户线程的相关知识,不记得的小伙伴可以看看:字节跳动面试官问我:你知道线程死锁吗?用户线程、守护线程的概念与区别了解吗?这期,我们来聊一聊一个在Java并发编程中很重要的类:ThreadLocal 在多线程应用程序中,对共享变量进行读写的场景是很常见的。如果不使用.

2020-11-04 19:34:00 1397

原创 别只做CRUD程序员,收下这篇操作系统干货(二)——进程管理!

别只做CRUD程序员,收下这篇操作系统干货(二)——进程管理!一、进程的概念1.进程的定义现代操作系统的重要特点是程序的并发执行,及系统所拥有的资源被共享和系统的用户随机地使用。通常,操作系统的重要任务之一是使用户充分、有效地利用系统资源。进程是描述程序的执行过程和作为资源分配的基本单位。2.程序的并发执行(1)程序是一个在时间上按严格次序前后相继的操作序列,是一个静态的概念。(2)程序的顺序执行Repeat IR ← M [pc] pc ← pc+1 〈 Execute (instr

2020-10-08 10:23:10 322

原创 IDEA中Maven经常下载Jar包失败,反复出现LastUpdate文件的解决办法

IDEA中Maven经常下载Jar包失败,反复出现LastUpdate文件的解决办法这个问题一直困扰着我,直到我加了这样的参数后,这个问题迎刃而解!-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true...

2020-10-02 16:28:49 3065 11

空空如也

空空如也

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

TA关注的人

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