目录

chen 的个人博客

VX:TiAmo151028
Phone:13403656751
Email:zxydczzs@gmail.com

RPC框架实现原理 置顶!

一、什么是 RPC 框架 RPC,全称为 Remote Procedure Call,即远程过程调用,是一种计算机通信协议。 比如现在有两台机器:A 机器和 B 机器,并且分别部署了应用 A 和应用 B。假设此时位于 A 机器上的 A 应用想要调用位于 B 机器上的 B 应用提供的函数或是方法,由于 A 应用和 B 应用不在一个内存空间里面,所以不能直接调用,此时就需要通过网络来表达调用的方式和传输调用的数据,也即所谓的远程调用。 二、RCP 框架的实现原理 1、建立通信 首先要解决通讯的问题:即 A 机器想要调用 B 机器,首先得建立起通信连接。主要是通过在客户端和服务器之间建立 TCP 连接,远程过程调用的所有相关的数据都在这个连接里面进行传输交换。 通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。 2、服务寻址 解决寻址的问题:即 A 机器上的应用 A 要调用 B 机器上的应用 B....

发票开具 置顶! 有更新!

金税盘 增值税普通发票(卷式) 参数说明 可折叠 索引 ID 名称 长度 必须 说明 1 yylxdm 应用类型代码 1 是 1:国税 2:地税 2 fplsh 发票流水号 20 否 用于防止重复开票,相同流水号直接返回报文 3 jspbh 金税盘编号 12 4 fplxdm 发票类型代码 2 是 5 kplx 开票类型 1 是 0:正数发票开具 1:负数发票开具(红冲) 6 tspz 特殊票种标识 2 是 “00”不是“01”农产品销售“02”农产品收购 7 xhdwsbh 销货单位识别号 20 是 8 xhdwmc 销货单位名称 80 是 9 xhdwdzdh 销货单位地址电话 是 10 xhdwyhzh 销货单位银行帐号 是 11 ghdwsbh 购货单位识别号 20 是 12 ghdwmc 购货单位名称 80 是 13 ghdwdzdh 购货单位地址电话 是 14 ghdwyhzh 购货单位银行帐号 是 15 bmbbbh 编码表版本号 16 fphxz 发票行性质 ....

Linux搭建confluence企业级WIKI(破解) 置顶! 有更新!

前言 从今天开始安装 confluence 的小伙伴一定要记得安装固定版本,因为在八月底 confluence 的某些版本有缺陷,经过身份验证的攻击者(在某些情况下未经身份验证的攻击者)通过构造恶意请求,造成 OGNL 注入,实现远程代码执行,所以官方给出了几个修复这个问题的版本,附截图和连接: https://confluence.atlassian.com/doc/confluence-security-advisory-2021-08-25-1077906215.html https://www.huaweicloud.com/notice/2021/20210826160403127.html 我这里安装的是 confluence v7.4.11 版本。 一、安装 MySQL 1、去官网下载 rpm 包,建议下载好在传到服务器中。 https://downloads.mysql.com/archives/community/ 描述一下我们下载了那些 rpm 2、上传至/usr/local/src 目录下,如下图所示。 3、安装,需要联网,使用如下命令: 1yum inst....

Stomp协议 关键点(持续更新) 有更新!

监听 如果需要添加监听,我们的监听类需要实现 ChannelInterceptor 接口,在 springframework 包 5.0.7 之前这一步我们一般是实现 ChannelInterceptorAdapter 抽象类,不过这个类已经废弃了,文档也推荐直接实现接口。 https://www.jianshu.com/p/4762494d42f1 https://www.jianshu.com/p/9103c9c7e128 https://spring.io/guides/gs/messaging-stomp-websocket/ 1package org.springframework.messaging.support; 2 3import org.springframework.messaging.Message; 4import org.springframework.messaging.MessageChannel; 5 6public interface ChannelInterceptor { 7 // 在消息发送之前调用,方法中可以对消息进行修改,如果....

swagger-ui页面接口的入参出参与代码实体类不一致有差异

Swagger 发现 Swagger 请求示例的参数和代码层面的请求实体不一致。 一、清除浏览器缓存,如果不能解决问题,看第二条。 二、这个接口请求实体的@ApiModel 命名有相同命名。 1@ApiModel("查询详细信息入参") 2public class PerionInfo implements Serializable{ 3 private static final long seriUID = -1L; 4 @ApiModelProperty("姓名") 5 private String name; 6 @ApiModelProperty("性别") 7 private String sex; 8 @ApiModelProperty("生日") 9 private String birday; 10} 11 1@ApiModel("查询详细信息入参") 2public class CarInfo implements Serializable{ 3 private static final long seriUID = -1L; 4 @ApiMode....

Spring AOP的实现原理以及应用场景。

AOP 应用场景 记录日志; 监控方法运行时间(监控性能); 权限控制; 缓存优化(第一次调用查询数据库,将查询结果放入内存对象,第二次调用则直接从内存对象返回,不需要查询数据库); 事务管理(调用方法前开启事务,调用方法后提交关闭事务); AOP 实现原理 Spring 中 AOP 的两种实现方式: JDK 动态代理; Cglib 动态代理; JDK 动态代理 引入依赖,有 Spring、单元测试和日志管理; 1<dependencies> 2 <!-- Spring --> 3 <dependency> 4 <groupId>org.springframework</groupId> 5 <artifactId>spring-context</artifactId> 6 </dependency> 7 8 <!-- 单元测试 --> 9 <dependency> 10 <groupId>junit</groupId&....

Java设计模式 有更新!

设计模式简介 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如果大厦的一块块砖石一样。项目中合理的运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。------摘自菜鸟教程 设计模式的类型 根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式-可复用的面向对象软件元素)中所提到的,总共有 23 种设计模....

Java 多态

首先来看什么是多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。 多态性是对象多种表现形式的体现。 多态的优点 消除类型之间的耦合关系; 可替换性; 可扩充性; 接口性; 灵活性; 简化性; 多态存在的三个必要条件 继承; 重写; 父类引用指向子类对象:Parent p = new Child(); 1package com.zxy.demo.Test; 2 3public class DuoTai { 4 public static void main(String[] args) { 5 Shape s1 = new Circle(); 6 Shape s2 = new Square(); 7 Shape s3 = new Triangle(); 8 9 s1.draw(); 10 s2.draw(); 11 s3.draw(); 12 } 13} 14 15class Shape{ 16 void draw(){} 17} 18 19class Circle extends Shape{ 20....

Layui下线

Layui 镜像站:https://layui.11dz.cn/

简单学习数据结构 有更新!

数据结构简介 数据结构是为实现对计算机数据有效使用的各种数据组织形式,服务于各类计算机操作。不同的数据结构具有各自对应的适用场景,旨在降低各种算法计算的时间与空间复杂度,达到最佳的任务执行效率。 常见的数据结构可分为[线性数据结构]和[非线性数据结构],线性数据结构:[数组]、[链表]、[栈]、[队列];非线性数据结构:[树]、[图]、[散列表]、[堆]。 数组 数组是将相同类型的元素存储与连续内存空间的数据结构,其长度不可变。 1// 初始化一个长度为5的数组arr 2int[] arr = new int[5]; 3// 元素赋值 4arr[0] = 1; 5arr[1] = 2; 6arr[2] = 3; 7arr[3] = 4; 8arr[4] = 5; 或者可以使用直接赋值的初始化方法 1int[] arr = {1,2,3,4,5}; 可变数组 [可变数组]是经常使用的数据结构,其基于数组和扩容机制实现,相比普通数组更加灵活。常用操作有:访问元素、添加元素、删除元素。 1// 初始化可变数组 2List<Integer> arr = new ArrayLis....

悲观锁、乐观锁、自旋锁、读写锁、共享锁、排它锁、统一锁、分段锁。 有更新!

悲观锁 1、定义 具有强烈的独占和排它特性,它指的是对数据被外界(包括本系统当前的其他食物,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。 2、Java 悲观锁实现之 synchronized synchronized 就是典型的悲观锁,相当于不管哪一个线程(例如线程 A),运行到这个方法时,都要检查有没有其他线程 B 或者 C、D 等正在用这个方法(或者该类的其他同步方法),有的话要等正在使用 synchronized 方法的线程 B 或者 C、D 运行完这个方法后再运行此线程 A,没有的话,锁定调用者,然后直接运行。 补充 1/** 2 * @author ZhangXiaoYu 3 * @date 2021/5/13 9:25 4 */ 5public class Thumbnail { 6 Object obj = new Object(); 7 //synchronized修饰普通方法,锁对象是this对象。 8 public synchronized void test(){ 9 10 } 11 12 //sy....

MacOS brew安装mysql报错【tar: Error opening archive: Failed to open xxx】 有更新!

解决方案 更改环境变量,将 HOMEBREW_BOTTLE_DOMAIN 改正确即可。 1echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottles' >> ~/.zshrc 2source ~/.zshrc 此刻 brew 已经换源为中科大源。 参考资料:https://www.cnblogs.com/zupernova/p/15138881.html

MacOS安装brew

网上搜了好多安装 brew 的方式,包括官网的方式、中科大镜像啊啥的都不行,最后找到了一种可行的方案。 终端执行下方命令,会让你选择镜像源,我选择的是清华大学镜像源,然后等待就好了。 1/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2

MacOS启动SpringBoot项目时报错【Logging system failed to initialize using configuration from 'logback.xml '】 有更新!

由于是第一次操作 MacOS 系统,在将 Java 环境变量配置好,IDEA 等一系列都安装好后,把项目代码拉了下来,然后运行,结果报错 1Logging system failed to initialize using configuration from 'logback.xml ' 反复找解决方案,最终定位到了 logback.xml 中创建日志文件目录的问题,因为原先在 windows 环境下,logback.xml 中的日志文件存放在/home/xxx 目录下,切换到了 MacOS 系统后由于 home 是不允许创建任何东西的,所以需要以下步骤。 1、进入根目录; 2、编辑 auto_master 文件 1sunshiqiang@sunshiqiangdeMac-mini / % cd / 2sunshiqiang@sunshiqiangdeMac-mini / % sudo vim /etc/auto_master 3、将 home 一行注释掉。 1# 2# Automounter master map 3# 4+auto_master # Use directory....

css给图片加阴影的两种方式 有更新!

1、box-shadow 方式 1{ 2 box-shadow: rgb(249 254 184) 0px 0px 20px; 3} 效果差强人意 2、filter 方式 1{ 2 filter: drop-shadow(rgb(249, 254, 184) 0px 0px 8px); 3} 效果达到了预期

[system] DOMException: Failed to execute 'open' on 'XMLHttpRequest': Invalid URL 有更新!

报错如图 解决 问题出现原因为某个请求缺了个“/”,所以在自己的项目中找到了缺失的地方。 1//更新学习到的红外码信息 2// /iot/tuya/oAuth/updateLearningCode报错时是iot/tuya/oAuth/updateLearningCode 3//将“/”加上即可 4function updateLearningCode(data, resultFunction, failFunction){ 5 requestUtils.doPostRequestToTuYa("/iot/tuya/oAuth/updateLearningCode", data, resultFunction, failFunction); 6}

Stack && LinkedList 有更新!

栈是一种具有[先入后出]特点的抽象数据结构,可以使用数组或链表实现。 1Stack<Integer> stack = new Stack<>(); 我们知道 Java 是不推荐使用 Vector 以及它的子类 Stack 的,因为有更好的替代品,比如:ArrayList、LinkedList,CopyOnWriteArrayList......,当然它也有它的有点,就是它是线程安全的,但也得结合使用场景,比如在单线程无竞争的场景它就是额外的开销了,但是在多线程的环境下也有更好的替代它实现线程安全的方法,所以这里不建议使用。 栈的特性:先入后出也可以使用 LinkedList 来实现,具体实现方法: Stack 1/** 2 * @author ZhangXiaoYu 3 * @date 2021/9/6 11:50 4 */ 5public class TestStack { 6 public static void main(String[] args) { 7 //栈,先入后出,最先入栈的最后出栈。 8 Stack<Integer&g....

尝试一下mysql索引优化!!! 有更新!

最近看了不少的 MySQL 调优,其中提到了索引,现在来尝尝鲜。 这是一个 10W+ 数据的表,没有带任何索引的时候去精准查询 name,它的执行时间为 11.122s,很慢 运行的 SQL 语句为: 1select * from book_chapter where chapter_name = '第两千五百三十六章 玄雷之命(终章)'; 这个时候它的执行计划是 ALL,也就是全表扫描。 然后尝试给这个字段加索引 使用命令 1alter table book_chapter add index chapter_name(chapter_name); 加完索引咱们再次尝试。执行时间为 0.139s。这里貌似触发了回表操作,可以知道我这个版本的 MySQL 默认存储引擎为 innodb,底层数据结构为 B+ 树,而 MySQL 一个索引就是一颗 B+ 树,默认主键就是一个索引,也就是一棵树,而 chapter_name 为另一颗 B+ 树,innodb 在存储数据和索引的时候,只有一颗 B+ 树存储的是主键 + 数据,而 chapter_name 这颗 B+ 树存储的是主键 ID....

volatile关键字与内存可见性 有更新!

1package com.zxy.demo.thread; 2 3import lombok.Data; 4 5/** 6 * @author ZhangXiaoYu 7 * @date 2021/9/2 9:26 8 */ 9public class ThreadDemo1 { 10 //volatile关键字与内存可见性 11 /* 12 * new一个线程子类实例并start,线程内部睡眠200毫秒后将flag设置为true 13 * 主线程使用while循环,如果线程子类的成员变量flag为true时,输出一句话后break出循环。 14 * 问题1:在主线程while循环时,flag已经为true,却没有跳出循环,为什么? 15 * 这是内存可见性的问题。当多个线程操作共享数据时,彼此不可见。 16 * 基本可以理解为,ThreadDemo线程先从主存中把数据读取过来,读取到的是false,然后修改为true,就在还未来得及把true同步到主存 17 * 时,main进来了,这是main读取到的还是false,所以形成死循环,就在main循环时,ThreadD....

int和Integer的区别以及自动装箱\拆箱机制 有更新!

Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。 Java 为每个原始类型提供了包装类型: 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double 测试用例: 1/** 2 * @author ZhangXiaoYu 3 * @date 2021/8/31 14:29 4 */ 5public class AutoUnboxingTest { 6 public static void main(String[] args) { 7 Integer a = new Integer(3); 8 Integer b = 3; 9 int....