<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Hpsyche的博客]]></title><description><![CDATA[大四菜鸡码农，分享所学所感。]]></description><link>https://blog.youkuaiyun.com/Hpsyche</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Hpsyche]]></copyright><item><title><![CDATA[go反射之FieldByName、MethodByName什么时候加*]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105971701</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105971701</guid><author>Hpsyche</author><pubDate>Thu, 07 May 2020 14:15:47 +0800</pubDate><description><![CDATA[前言
首先要明白，Go中结构体方法的定义方式有两种，包括指针方法和值方法。

如果一个方法的接收者的类型是其所属类型的指针类型（并非该类型本身），则该方法称为一个指针方法。
如果一个方法的接收者类型就是其所属的类型本身，则该方法称为做值方法。

示例：
//指针方法
func (e *Employee) UpdateAge(newVal int){
	e.Age=newVal
}
//值方法
fu...]]></description><category></category></item><item><title><![CDATA[源码之linux进程：vm_area_struct与虚拟内存的关系]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105865581</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105865581</guid><author>Hpsyche</author><pubDate>Thu, 30 Apr 2020 17:22:07 +0800</pubDate><description><![CDATA[前言
在虚拟内存中，我提到了linux虚拟内存区域的结构，但具体其是如何在linux中表示与实现的呢？
我利用了linux2.6的源码进行了浅显的分析。
正文
task_struct
在linux中，进程控制块即PCB的结构为task_struct，我们以linux2.6为例，其源码如下：
struct task_struct {
    //表示进程当前运行状态
    //volatile避免...]]></description><category></category></item><item><title><![CDATA[CPU中常见寄存器及与内存的交互]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105646357</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105646357</guid><author>Hpsyche</author><pubDate>Mon, 20 Apr 2020 22:28:12 +0800</pubDate><description><![CDATA[本篇博客关于指令集和PSW的内容参考至：https://www.cnblogs.com/f-ck-need-u/p/11141636.html，同时做下了寄存器与内存交互的总结。
指令集
对于每个CPU，其都有一套自己可以执行的专门的指令集（这部分指令由CPU提供）。
正式因为不同CPU架构的指令集不同，使得X86处理器不能执行ARM程序，ARM程序也不能执行X86程序（Inter和AMD都使用x...]]></description><category></category></item><item><title><![CDATA[SpringCloud确保服务由gateway网关转发（服务器端口规则及设置方法）]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105625392</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105625392</guid><author>Hpsyche</author><pubDate>Sun, 19 Apr 2020 23:52:27 +0800</pubDate><description><![CDATA[前言
在前面曾提到一些方法确保SpringCloud中服务接口先通过网关转发，再到达我们的主服务，避免请求越过网关，直接访问我们的主服务。
但除了在转发层面添加header的解决方式之外，我们大可在服务器层面做手脚，开放必要的端口即可，从源头上断绝了对服务接口的直接访问。
正文
首先有如下架构：

Consul于服务器192.168.1.102；
Gateway于服务器192.168.1.103；...]]></description><category></category></item><item><title><![CDATA[基于Jenkins+Docker+Github实现SpringCloud自动化部署]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105329999</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105329999</guid><author>Hpsyche</author><pubDate>Sun, 05 Apr 2020 17:38:13 +0800</pubDate><description><![CDATA[前言
本博文主要介绍了基于Jenkins+Docker+Github实现了对SpringCloud微服务项目的快速打包、部署。
正文
项目准备
首先有如下SpringCloud项目（这里以本人的毕设项目举例），目录结构如下：

bishe_base中的每个module代表一个服务，其中client为后缀的代表的是客户端，其用来暴露server服务中提供的服务接口，给外部的服务使用。
为了让项目最终...]]></description><category></category></item><item><title><![CDATA[《深入理解计算机系统》之虚拟内存总结]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/105205512</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/105205512</guid><author>Hpsyche</author><pubDate>Mon, 30 Mar 2020 18:30:23 +0800</pubDate><description><![CDATA[前言

最近看了《深入理解计算机系统》，重温了许多操作系统和组原的知识。本篇博客主要介绍虚拟内存，让我们先从ELF--&gt;进程引入。

ELF文件

对于每个程序，其在经历预处理、编译、汇编之后，都要经过链接器将其链接成一个单一的可执行文件。在现在Unix和x86-64 Linux系统上，其使用的可执行格式为ELF，如下：





可以看到ELF涵盖了程序中的各种信息，加载器就是通过读取E...]]></description><category></category></item><item><title><![CDATA[MySQL查询缓存与缓冲区的区别]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/104460944</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/104460944</guid><author>Hpsyche</author><pubDate>Sun, 23 Feb 2020 16:05:43 +0800</pubDate><description><![CDATA[前言
最近在研究mysql时，发现查询缓存和缓冲池是两个比较容易混淆的点，在这里简单提一下二者的联系与区别。
正文
查询缓存
首先看下mysql的结构图，如下所示：

可以看到，查询缓存作用于第二层，即核心服务层。
其主要作用是保存查询返回的完整结果。当查询命中该缓存, MySQL会立刻返回结果。跳过了 解析，优化和执行阶段，加快查询速度。
判断缓存命中的方法很简单：缓存存放在一个引用表中，通过一...]]></description><category></category></item><item><title><![CDATA[union当第一个表不存在数据时，再查询第二个表]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/104175223</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/104175223</guid><author>Hpsyche</author><pubDate>Tue, 04 Feb 2020 21:12:41 +0800</pubDate><description><![CDATA[前言
在很多业务场景中，我们会出现如下的需求：在某一个表中查询“热”数据，查询不到再去另一个表中查找“冷”数据，此时我们如何通过sql语句实现呢？
正文


首先，创建student和student_2两个表，如下：
CREATE TABLE `student` (
  `id` bigint(20) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  ...]]></description><category></category></item><item><title><![CDATA[volatile简介及可见性、有序性的保证]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103690885</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103690885</guid><author>Hpsyche</author><pubDate>Tue, 24 Dec 2019 22:42:50 +0800</pubDate><description><![CDATA[volatile简介
volatile是jvm提供的最轻量级的同步机制（相比于synchronized，其要轻量很多）
当一个变量定义为volatile后，其具备两种特性：

此变量对所有线程的可见性

可见性：当一条线程修改了这个变量的值，新值对于其他线程来说是可以立即得知的。


禁止指令重排序优化

指令重排序：JVM为了进行优化，会对变量赋值等操作进行一系列的优化，其只保证了所有依赖赋值结...]]></description><category></category></item><item><title><![CDATA[linux中查看java汇编代码（hsdis+jitwatch）]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103688627</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103688627</guid><author>Hpsyche</author><pubDate>Tue, 24 Dec 2019 19:57:17 +0800</pubDate><description><![CDATA[前言
在研究JVM时，想要研究下volatile关键字的底层实现，需要其对其汇编代码的指令进行观察，故需要查看即时编译器产生的汇编代码。
正文
环境：linux（deepin）
hsdis的配置

进入https://sourceforge.net/projects/fcml/files/fcml-1.1.3/，下载源码并解压（这里可能需要科学上网）
cd fcml-1.1.3
./configu...]]></description><category></category></item><item><title><![CDATA[idea查看java字节码工具（jclasslib Bytecode viewer）]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103534929</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103534929</guid><author>Hpsyche</author><pubDate>Sat, 14 Dec 2019 00:28:21 +0800</pubDate><description><![CDATA[前言
在进行java代码，调试时，有些复杂的情况（如语法糖等）会让我们难以理解JVM的具体执行细节，此时我们可以通过javap反编译来查看JVM字节码，而在ide中，通过jclasslib Bytecode viewer工具，可以更为细节地观察某类的字节码及字节码代表的字段表集合等信息。
正文

首先，在intelij idea中引入工具，具体操作如下：

重启ide后，点击某个类，在工具栏vie...]]></description><category></category></item><item><title><![CDATA[deepin通过nginx+vsftpd搭建文件服务器]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103441322</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103441322</guid><author>Hpsyche</author><pubDate>Sun, 08 Dec 2019 00:45:50 +0800</pubDate><description><![CDATA[Deepin搭建文件服务器
前言
在项目中，需要使用到图片上传等功能，故考虑到自己搭建一个文件服务器，其中nginx用来对我们浏览器中的url解析，映射到linux上的指定目录上去；而vsftpd作为一个ftp服务器软件，能够提供传输文件的服务，服务器安装了vsftpd后，我们即可以很方便地进行不同主机之前的文件传输等。
VSFTPD的安装
apt-get install vsftpd
新建用户
...]]></description><category></category></item><item><title><![CDATA[DTO转VO时，将日期由DATE转String]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103430470</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103430470</guid><author>Hpsyche</author><pubDate>Fri, 06 Dec 2019 22:23:12 +0800</pubDate><description><![CDATA[前言
当后台日期为Date类型时，在进行前端显示时，如果不加以处理，通过会以时间戳的方式进行渲染，在此情况下，为了简化前端对日期数据繁琐的操作，在后端传值的时候，可直接将date转为string类型。
正文
本文主要介绍的是在DTO对象转为VO对象时，如何将DATE转化为String类型。
首先需要引入cglib的包
在复制对象时，我们可以引入转换器
public static void copy...]]></description><category></category></item><item><title><![CDATA[拦截器中注入Feign接口后，报错NullPointerException]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103341194</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103341194</guid><author>Hpsyche</author><pubDate>Sun, 01 Dec 2019 23:09:40 +0800</pubDate><description><![CDATA[前言
在拦截器中，需要通过Feign调用Auth基础服务，判断用户身份；
此时在Feign Api中出现了NPE错误。
正文
之前写过类似的博客日志拦截NLP处理，原因主要是：在注册拦截器时（WebMvcConfig类）直接通过new XXXInterceptor()，并没有触发Spring去管理bean，所以@Autowired没有生效。
在项目中，我使用了主动声明、手动注入的方法，具体如下：
...]]></description><category></category></item><item><title><![CDATA[SpringCloud中gateway对用户身份拦截，Vue axios统一处理状态码出现跨域问题]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103319930</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103319930</guid><author>Hpsyche</author><pubDate>Sat, 30 Nov 2019 00:59:33 +0800</pubDate><description><![CDATA[前言
在项目中，我们很多时候都需要对用户身份进行判断，在用户身份无法被验证时，我们返回{status:401,msg:‘XXX’}等，如若能在axios处统一拦截处理，会方便许多；同样，如果在后台gateway处，也能提前对token进行统一验证，避免异常用户的异常访问。
正文
首先在Vue封装的axios工具类中，统一对axios进行拦截操作
// 添加响应拦截器
axios.intercept...]]></description><category></category></item><item><title><![CDATA[SpringBoot中maven引入本地项目成功，但import找不到包]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/103311545</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/103311545</guid><author>Hpsyche</author><pubDate>Fri, 29 Nov 2019 15:26:56 +0800</pubDate><description><![CDATA[问题引入
在毕设的maven项目中，由于需要将一个工程打包（install到本地maven仓库下），在其他工程中引入此maven使用，但出现了以下问题：
A工程install成功–&gt;B工程pom.xml也引入成功–&gt;在B工程中，import A工程的类失败
解决方案
解决方法很简单
将A工程的pom.xml的打包插件进行修改
原先的插件配置：
&lt;build&gt;
    &lt...]]></description><category></category></item><item><title><![CDATA[SpringCloud+Vue解决跨域Session不一致问题]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/102941377</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/102941377</guid><author>Hpsyche</author><pubDate>Wed, 06 Nov 2019 20:01:06 +0800</pubDate><description><![CDATA[前言
在做项目时，在登录验证码生成环节，后台生成验证码图像返回给前端，并将验证码置于session，用户填入验证码后传入后台并验证。
但在实验时发现，由于前后端分离项目存在跨域问题，session不再相同，通过输出 sessionId也可以看出，不同请求到达服务端时sessionId是不同的，故需要考虑如何解决Session不一致的问题。
正文
CORS
首先简单讲下CORS。
CORS是一个W3...]]></description><category></category></item><item><title><![CDATA[SpringCloud确保服务只能通过gateway转发访问，禁止直接调用接口访问]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/102926010</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/102926010</guid><author>Hpsyche</author><pubDate>Wed, 06 Nov 2019 01:08:23 +0800</pubDate><description><![CDATA[前言
在微服务体系架构中，网关承担着重要的角色，在网关中可以添加各种过滤器，过滤请求，保证请求参数安全，限流等等。如果请求绕过了网关，那就等于绕过了重重关卡，直捣黄龙，所以，在分布式架构中，我们需要有一定的防范，来确保各个服务相互之间安全调用。
正文
思路
1、在网关中给所有请求加上一个请求密钥
2、在服务添加过滤器，验证密钥
首先在网关服务（gateway）中添加过滤器，给放行的请求头上加上判断...]]></description><category></category></item><item><title><![CDATA[Java反射原理及简单的源码解析]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/102783456</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/102783456</guid><author>Hpsyche</author><pubDate>Mon, 28 Oct 2019 16:27:22 +0800</pubDate><description><![CDATA[前言
首先，了解下java类的初始化过程：
编程：将java文件编译为.class字节码文件
加载：类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部，并存储在运行时内存区的方法区，然后将其转换为一个与目标类型对应的java.lang.Class对象实例
连接：细分三步
验证：格式（class文件规范） 语义（final类是否有子类） 操作
准备：静态变量赋初值和内存空间，fin...]]></description><category></category></item><item><title><![CDATA[JVM内存模型和JAVA内存模型的区别]]></title><link>https://blog.youkuaiyun.com/Hpsyche/article/details/102511868</link><guid>https://blog.youkuaiyun.com/Hpsyche/article/details/102511868</guid><author>Hpsyche</author><pubDate>Fri, 11 Oct 2019 23:17:33 +0800</pubDate><description><![CDATA[前言
很多人都以为JAVA内存模型就是JVM内存模式，其实二者是不同的概念，本文针对此，主要讲解JVM内存模型和JAVA内存模型的区别。
正文
其实本身二者就是不同的概念，在此我分开来讲。
JVM内存模型
JVM内存模式主要分为：程序计数器、JAVA虚拟机栈、本地方法栈、堆和方法区，其中JDK1.8之前方法区的实现为永生代，而JDK1.8之后方法区的实现转为元空间。
各个内存区域的作用在很多博客和...]]></description><category></category></item></channel></rss>