万猫学社_社区达人页

个人头像照片
万猫学社
已加入开发者社区1909

勋章 更多

个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
技术博主
技术博主
个人头像照片
江湖侠士
江湖侠士

成就

已发布155篇文章
7条评论
已回答4个问题
0条评论
已发布0个视频
github地址

技术能力

兴趣领域
  • Java
  • 程序员
  • 微服务
擅长领域
  • Java
    高级

    能力说明:

    精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。

  • 微服务
    中级

    能力说明:

    熟悉微服务常用开放框架,理解Spring、Spring Boot,以及Spring Cloud的概念和不同,对Spring Cloud Alibaba有较为全面的认知。对Istio具备基础运维能力,掌握基本组件的知识。

  • 数据库
    中级

    能力说明:

    可对MySQL数据库进行备份与恢复,可较为熟练的使用SQL语句进行单表多表查询等操作,可快速上手阿里云RDS MySQL数据库,可进行MySQL云数据库的创建、设置、数据迁移等工作。了解常见NOSQL数据库,如MongoDB、Redis、Memcached的概念、安装、配置等相关基础知识。

技术认证

暂时未有相关云产品技术能力~

微信搜索「万猫学社」关注后回复「电子书」,免费获取12本Java必读技术书籍。

暂无精选文章
暂无更多信息

2022年01月

  • 01.19 10:12:18
    发表了文章 2022-01-19 10:12:18

    详解在Linux系统中安装JDK

    本文以在CentOS 7.6中安装JDK8为例进行安装,其他系统和版本都是大同小异的。
  • 01.19 10:11:40
    发表了文章 2022-01-19 10:11:40

    大话『字符串逆序』

    窗外的大厦,桌子上的水杯,手中的笔。 面试官:“先来一点基础的吧,用Java写一个方法,入参是一个字符串,返回逆序后的字符串。” 我暗想确实很基础,于是便写下:
  • 01.19 10:11:00
    发表了文章 2022-01-19 10:11:00

    最通俗易懂的Class文件结构(下)

    书接上一回,分享了Class文件的主要构成,同时也详细分析了魔数、次版本号、主版本号、常量池集合、访问标志的构造,接下来我们就继续学习。
  • 01.19 10:09:20
    发表了文章 2022-01-19 10:09:20

    最通俗易懂的Class文件结构(上)

    在Java刚刚诞生的时候就提出了一个非常著名的口号:“一次编写,到处运行。(Write Once,Run Anywhere)”。为了实现平台无关性,各种不同平台的虚拟机都统一使用一种程序储存格式,就是字节码(ByteCode)。它就以二进制字节流的方式
  • 01.19 10:08:35
    发表了文章 2022-01-19 10:08:35

    怎么把CAT客户端的RootMessageId记录到每条日志中?

    为了理解RootMessageId先简单介绍一下CAT的数据结构设计。CAT客户端会将所有消息都封装为一个完整的消息树(MessageTree),消息树可能包括Transaction、Event、Heartbeat、Metric等类型的消息。具体如下:
  • 01.19 10:07:33
    发表了文章 2022-01-19 10:07:33

    阅读JDK源码后,我有了优化它的冲动...

    最近在看concurrent包下线程池的源码,当我看到ThreadPoolExecutor类的时候,发现了JDK源码的一个问题。以下是ThreadPoolExecutor类的addWorker方法的代码片段:
  • 01.19 10:06:09
    发表了文章 2022-01-19 10:06:09

    CAT客户端如何从Apollo中读取配置?

    众所周知,Apollo对CAT是有依赖的,但不是强依赖,而是使用了SPI技术,只有项目里引用了cat-client才会生效。目前我们想把CAT客户端配置放在Apollo里,也就是在CAT客户端初始化之前从Apollo读取相应配置,这就形成了循环依赖,所以首先要去除Apollo对CAT客户端的依赖。
  • 01.19 09:59:11
    发表了文章 2022-01-19 09:59:11

    给女朋友讲 : Java线程池的内部原理

    餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!”
  • 01.19 09:58:14
    发表了文章 2022-01-19 09:58:14

    三分钟后,你将学会在SpringBoot项目中如何集成CAT调用链

    一年一度的双十一购物狂欢节就要到了,又到剁手党们开始表演的时刻了。当我们把种草很久的商品放入购物车以后,点击“结算”按钮时,就来到了买买买必不可少的结算页面了。让我们虚拟一个【买买买结算系统】,为结算页面提供商品、促销、库存等结算信息,就此系统展开如何在SpringBoot项目中集成CAT调用链。【买买买结算系统】包含以下4个项目:
  • 01.19 09:56:39
    发表了文章 2022-01-19 09:56:39

    分布式监控CAT服务端的本地部署

    CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统。美团点评基础架构部希望在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案,CAT 目前在美团点评的产品定位是应用层的统一监控组件,在中间件(RPC、数据库、缓存、MQ 等)框架中得到广泛应用,为各业务线提供系统的性能指标、健康状况、实时告警等服务。
  • 01.19 09:55:52
    发表了文章 2022-01-19 09:55:52

    一篇文章快速搞懂Java中常用的四种线程池

    在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例。不过,在Executors类中,为我们提供了常用线程池的创建方法。接下来我们就来了解常用的四种:
  • 01.19 09:54:57
    发表了文章 2022-01-19 09:54:57

    关于Java线程池构造参数,你该了解这些!

    在ThreadPoolExecutor类中有4个构造函数,最终调用的是如下函数

2021年12月

  • 12.30 10:39:56
    发表了文章 2021-12-30 10:39:56

    一张图快速了解23种设计模式

    The design patterns are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context. 设计模式是对互相通信对象和类的描述,这些对象和类被定制以解决特定场景下的一般设计问题。
  • 12.30 10:37:20
    发表了文章 2021-12-30 10:37:20

    面试官灵魂三问:什么是SOA?什么是微服务?SOA和微服务有什么区别?

    SOA(Service-Oriented Architecture,**面向服务的架构**)是一种高层级的架构设计理念,可通过在网络上使用基于通用通信语言的服务接口,让软件组件可重复使用。 微服务(Microservices)是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic)的API集相互通信。
  • 12.30 10:35:17
    发表了文章 2021-12-30 10:35:17

    昨天面试被问到的 缓存淘汰算法FIFO、LRU、LFU及Java实现

    在高并发、高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对。 第一次请求时把计算好的结果存放在缓存中,下次遇到同样的请求时,把之前保存在缓存中的数据直接拿来使用。 但是,缓存的空间一般都是有限,不可能把所有的结果全部保存下来。那么,当缓存空间全部被占满再有新的数据需要被保存,就要决定删除原来的哪些数据。如何做这样决定需要使用缓存淘汰算法。 常用的缓存淘汰算法有:FIFO、LRU、LFU,下面我们就逐一介绍一下。
  • 发表了文章 2024-05-15

    Spring Boot 的事务控制及示例代码

  • 发表了文章 2024-05-15

    使用 Apache PDFBox 操作PDF文件

  • 发表了文章 2024-05-15

    【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

  • 发表了文章 2024-05-15

    3分钟快速了解使用Java进行对称加密

  • 发表了文章 2024-05-15

    怎么Java进行MD5摘要加密?

  • 发表了文章 2024-05-15

    【从零开始学微服务】07.微服务常用的开发框架

  • 发表了文章 2024-05-15

    【从零开始学微服务】06.微服务架构的建设思路

  • 发表了文章 2024-05-15

    【从零开始学微服务】04.微服务架构的特点

  • 发表了文章 2024-05-15

    【从零开始学微服务】02.初识微服务

  • 发表了文章 2024-05-15

    深入理解Istio流量管理的熔断配置

  • 发表了文章 2024-05-15

    【从零开始学微服务】01.微服务的过去与现在

  • 发表了文章 2024-05-15

    【从零开始学微服务】08.引入微服务架构的时机

  • 发表了文章 2024-05-15

    【从零开始学微服务】05.微服务的优势和不足

  • 发表了文章 2024-05-15

    【从零开始学微服务】03.软件架构的演化过程

  • 发表了文章 2022-08-10

    在 Istio 服务网格内连接外部 MySQL 数据库

  • 发表了文章 2022-08-10

    一张图快速了解 Istio 的 EnvoyFilter

  • 发表了文章 2022-08-10

    在Istio中,到底怎么获取 Envoy 访问日志?

  • 发表了文章 2022-08-09

    5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

  • 发表了文章 2022-08-09

    10个 Istio 流量管理 最常用的例子,你知道几个?

  • 发表了文章 2022-08-09

    图解VirtualBox安装CentOS 7

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2022-04-22

    使用 Docker 基本命令构建和运行镜像时,如何使用 docker run 命令运行镜像?

    docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项; -d: 后台运行容器,并返回容器ID; -i: 以交互模式运行容器,通常与 -t 同时使用; -P: 随机端口映射,容器内部端口随机映射到主机的端口 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name='nginx-lb': 为容器指定一个名称; --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h 'mars': 指定容器的hostname; -e username='ritchie': 设置环境变量; --env-file=[]: 从指定文件读入环境变量; --cpuset='0-2' or --cpuset='0,1,2': 绑定容器到指定CPU运行; -m :设置容器使用内存最大值; --net='bridge': 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]: 添加链接到另一个容器; --expose=[]: 开放一个端口或一组端口; --volume , -v: 绑定一个卷 实例 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。 docker run --name mynginx -d nginx:latest 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。 docker run -P -d nginx:latest 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。 docker run -p 80:80 -v /data:/data -d nginx:latest 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。 $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。 runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
    踩0 评论0
  • 回答了问题 2022-04-22

    使用 Docker 基本命令构建和运行镜像时,如何使用 docker rm 命令删除容器?

    docker rm :删除一个或多个容器。 语法 docker rm [OPTIONS] CONTAINER [CONTAINER...] OPTIONS说明: -f :通过 SIGKILL 信号强制删除一个运行中的容器。 -l :移除容器间的网络连接,而非容器本身。 -v :删除与容器关联的卷。 实例: 强制删除容器 db01、db02: docker rm -f db01 db02 移除容器 nginx01 对容器 db01 的连接,连接名 db: docker rm -l db 删除容器 nginx01, 并删除容器挂载的数据卷: docker rm -v nginx01 删除所有已经停止的容器: docker rm $(docker ps -a -q)
    踩0 评论0
  • 回答了问题 2022-04-22

    如何实现分层存储?

    基于 Block Device 的分层存储方案 该方案完整地实现了以上提到的分层存储中所有的工作,包括虚拟化,IO 性能统计以及数据的迁移。 方案结构 该方案的结构包括一个 Linux 设备驱动程序和若干用户态的控制程序,如图 3 所示。 驱动程序实现存储设备的虚拟化,IO 性能监测统计以及数据的迁移; 用户态控制程序负责创建、删除虚拟设备,手动触发数据迁移,以及设置获取设备状态。 该方案由于 Storage Tiering 所有的功能都在 Linux 内核实现,且需要维护虚拟设备到物理设备的地址映射表,以及保证数据一致性,所以实现难度和工作量比较大,但可扩展性和灵活性也相对较大。 方案实现 该方案的实现主要包括以下内容: 1、管理设备的注册 管理设备主要用于与用户态程序的 IOCTL 交互,可以是一个字符设备或者 Misc 设备。Linux 下可以通过 register_chrdev 或 misc_register 注册,并实现所需要的 IOCTL 接口。 2、虚拟块设备的创建 用户态控制程序通过 IOCTL 向控制设备发起创建虚拟设备的请求,并传入所有的物理磁盘(DEV1,DEV2)的参数,如设备名,磁盘大小,虚拟磁盘的块大小等;驱动程序收到该请求后,进行必要的参数检查,然后调用 register_blkdev 创建一个新的块设备(VDEV)。并设置新设备的相关参数,如 IO 处理函数,队列大小,设备容量等。 3、虚拟设备地址与物理设备地址映射 虚拟设备地址到物理设备的地址映射表在虚拟设备创建是被初始化,并在数据迁移过程中被修改。 虚拟设备和物理设备都被分成固定大小的块,块大小可以固定或通过 IOCTL 由用户指定,但一旦确定,不能更改,一个 Block 是热度统计以及数据迁移的最小单位;每个 Block 包含若干个 sector(512 Byte)。 当 VDEV 收到一个 bio,可以由 bi_sector 和 bi_size 找出所对应的 VDEV 的 Block 以及 Block 内的偏移量,通过查询映射表,找到各个 VDEV Block 所对应的物理设备以及 Block,然后读取物理设备 Block 内的偏移量,如图 4 所示。 地址映射表以及其他的元数据需要存储在物理设备上,以便机器重启时能重构这个虚拟的块设备,且需要采取一定的备份策略,防止断电或磁盘损坏造成数据丢失。 4、IO 热度统计 IO 热度统计也以 Block 为基本单位,每个 Block 内的任何一个 sector 被访问,该 Block 的热度都为增加。由于大 IO 以及顺序 IO 在性能在传统硬盘和 SSD 上的差异并不是特别大,所以在进行热度统计是应该考虑排除大 IO 和顺序 IO。 5、数据迁移 可以采用自动方式或手动方式。自动方式由驱动内的定时器驱动,每隔一定的时间,启动数据迁移的扫描,将 IO 热度统计中的热数据向高性能存储设备迁移,冷数据向低性能存储设备迁移;手动方式由用户指定,将某块数据向高性能存储设备迁移或低性能设备迁移。手动数据迁移方式增加了更大的灵活性和可扩展性。 开源实现 BTier 基于 Block Device 的分层存储方案的开源实现。BTier 最大支持 16 个设备的虚拟化,这些设备被 BTier 简单地捆绑成一个 btier 块设备,因此,其中任何一个设备的失效,都会导致整个 btier 的失效。 编译并以模块形式安装 BTier 之后,会创建一个名为 tiercontrol 的字符设备; 然后使用 BTier 提供的 btier_setup 应用可以创建一个新的块设备 btiera,然后就可以对 btiera 设备进行所有块设备的读写操作,包括分区和创建文件系统。 BTier 还提供了丰富的 sysfs 接口,进行控制和信息获取,如数据迁移的开关,间隔时间,IO 统计信息等。 不过 BTier 每个 Tier 层仅支持 1 个物理设备,同层多个设备的虚拟化需要借助其他的方法,在虚拟化上面,BTier 还有可以改善的空间。 基于 LVM 的分层存储方案 Linux 的逻辑卷管理(LVM)提供了存储虚拟化,可以将多个物理卷(PV)建成一个卷组(VG),然后再在 VG 里创建虚拟卷(VG)。而且 LVM 提供了在不同物理卷之间迁移数据的 API。因此,基于 LVM 的分层存储方案借助 LVM 的虚拟化和数据迁移的能力,实现会更简单。 方案结构 该方案中,数据一致性的问题以及数据迁移时 IO 中断的问题都由 LVM 进行处理,重点在于如何分析并统计 IO 的热度信息,并且不涉及内核态的开发。该方案的结构如图所示。 方案实现 该方案的实现主要包括以下内容: 1、创建虚拟设备 使用 pvcreate 将所有的物理磁盘创建成物理卷(PV);再使用 vgcreate 将所有的 VG 创建成一个卷组(VG);最后使用 lvcreate 在创建出来的 VG 上建虚拟卷。 2、IO 热度统计 IO 热度统计可以使用 blktrace 工具,或者实现一个设备驱动来检测 IO 的热度。使用 blkparse 可以解析 blktrace 的输出,然后分析这些 IO 的分布以及读写频度,从而得到 IO 的热度统计信息。 4、数据迁移 根据 IO 的热度统计信息,使用 LVM 提供的 pvmove 工具,可以在属于同一个 VG 里的不同 PV 之间进行数据迁移,将热数据和冷数据分布存放在不同的物理卷上。 开源实现 LVMTS(LVM Tired Storage)是一个使用 SSD 和 HDD 来创建混合存储的方案,完全在用户态实现,主要由几个守护进程构成。 Lvmtscd 负责监测 blktrace 的输出并统计块设备的访问频度,并将这些统计信息记录在文件中; Lvmtsd 负责根据用户配置的信息,启动其他的守护进程,并完成数据迁移。 实际使用中发现,LVMTS 并不是太稳定,而且在 IO 分析统计上并不是太完善,可开发的空间仍然很大。
    踩0 评论0
  • 回答了问题 2022-04-20

    程序员35岁后的出路

    1.送外卖 2.开网约车 3.回老家种地 4.摆地摊卖煎饼果子
    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息