<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[2201_75920541的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/2201_75920541</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; 2201_75920541]]></copyright><item><title><![CDATA[认识Electron 之开启探索世界二（绝对干货！！！）]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145570871</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145570871</guid><author>2201_75920541</author><pubDate>Tue, 11 Feb 2025 18:00:09 +0800</pubDate><description><![CDATA[前三行代码的作用是导入必要的模块，其中app是用来控制应用的生命周期，BrowserWindow是用来创建和管理应用程序窗口，readFileSync是node.js中的文件读取方法，允许同步的读取文件内容，path是用来处理和转换文件路径的node.js模块。1.窗口的基本概念：每个窗口都是一个独立的浏览器窗口，由主进程通过BrowserWindow模块创建和管理，每个窗口对应一个渲染进程负责加载和显示网页内容。父窗口：通过parent属性指定父窗口，子窗口会始终显示在父窗口的上方。]]></description><category></category></item><item><title><![CDATA[项目发布的三大方式]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145567260</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145567260</guid><author>2201_75920541</author><pubDate>Tue, 11 Feb 2025 11:47:34 +0800</pubDate><description><![CDATA[项目在逻辑上分为AB组，在进行项目升级时，首先将A组从负载均衡中摘除进行新版本的部署，B组仍然继续提供服务，A组升级完成上线B组从负载均衡中摘除。：只升级部分的服务，让一部分用户继续使用老版本另外一部分使用新版本，如果用户对新版本没什么问题那么九逐步扩大范围，把所有用户都迁移到新版本上。：每次只升级一个或者多个服务，升级完成后加入生产环境，不断执行这个过程知道集群的旧版本全部升级成新版本。部署周期长且发布策略复杂不易回滚。缺点：对自动化的要求比较高。用户无感知，平滑过渡。用户无感知，平滑过渡。]]></description><category></category></item><item><title><![CDATA[Kubernetes集群搭建之部署Etcd集群]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145556322</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145556322</guid><author>2201_75920541</author><pubDate>Mon, 10 Feb 2025 20:04:20 +0800</pubDate><description><![CDATA[以上操作时先下载下cfssl所需要的相关的软件包，其中第一个安装包的作用是创建证书、签发证书和管理证书，第二个安装包的作用是处理和转换cfssl输出的json数据，第三个安装包用于查看和解析证书的详细信息。上述命令操作表示该服务会在网络服务启动之后启动并且会确保服务在网络完全可用时启动，之后的命令操作表示指定环境配置文件的路径，etcd启动时会读取此文件中的配置并且定义了启动服务的命令，之后设置了服务端的证书和私钥用于加密通信以及设置了与集群成员通信的证书和私钥。• ETCD_DATA_DIR：数据目录。]]></description><category></category></item><item><title><![CDATA[Ansible自动化部署K8s集群一 Ansible的基础使用实战]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145547517</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145547517</guid><author>2201_75920541</author><pubDate>Mon, 10 Feb 2025 13:57:20 +0800</pubDate><description><![CDATA[1.安装ansible:        yum  install  ansible -y2.ansible的架构图：3.ansible四部分：inventory:ansible管理的主机信息，包括ip地址、ssh端口、账号和密码等modules:任务均由模块完成plugins:增加ansible的核心功能playbooks:模块化当以一些列任务供外部调用5.命令行使用：ad-hoc可以输入内容快速执行某个操作上述的密钥信息也可以在ansible.cfg配置文件中指定。]]></description><category></category></item><item><title><![CDATA[认识Electron 开启新的探索世界一]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145535732</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145535732</guid><author>2201_75920541</author><pubDate>Sun, 09 Feb 2025 19:56:33 +0800</pubDate><description><![CDATA[在创建窗口时，我们传入了配置对象 webPreferences: {nodeIntergration: true},此配置对象告诉electron需要为页面集成node.js环境并赋予index.html页面中的javascript访问node.js的能力。1.electron给index.js提供了完整的node.js环境的访问能力，index.js可以像所有node.js程序一样，通过require引入其他的js文件。2.启动窗口：在项目的根目录下创建index.js文件。]]></description><category></category></item><item><title><![CDATA[Kubernetes之kube-proxy运行机制分析]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145533456</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145533456</guid><author>2201_75920541</author><pubDate>Sun, 09 Feb 2025 17:11:29 +0800</pubDate><description><![CDATA[此外，kube-proxy在iptables中为每个Service创建了由Cluster IP+Service端口到kube-proxy所在主机+service的代理服务所监听的端口的转发规则。，如果不存在，则会按照RR算法为该请求挑选一个Endpoint,并创建一个affinityState对象，记录请求的IP和指向的Endpoint,后面的请求就会。KUBE-NODEPORT-HOST：从主机中通过Service的Nodeport端口号访问service的请求。，另外在此算法的基础上。]]></description><category></category></item><item><title><![CDATA[Netty初学九 心跳与空闲检测]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145530557</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145530557</guid><author>2201_75920541</author><pubDate>Sun, 09 Feb 2025 13:45:20 +0800</pubDate><description><![CDATA[如果在一段时间内客户端没有收到服务端发来的数据包，则可以判定这个连接为假死状态，因此，服务端的Pipeline中需要再加上一个Handler,这个处理无需登录，所以一般会将这个Handler放在AuthHandler前面。连接假死的现象是：在某一端看来，底层的Tcp连接已经断开，但是应用程序没有捕获到，会认为这条连接仍然是存在的。对于服务端来说，客户端的连接如果出现假死，那么服务端将无法收到客户端的数据，反之，这个连接还是活的，服务端对于连接假死的应对策略是空闲检测。非假死状态下确实没有发送数据。]]></description><category></category></item><item><title><![CDATA[Netty初学八 群聊消息的收发及Netty性能优化]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145529853</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145529853</guid><author>2201_75920541</author><pubDate>Sun, 09 Feb 2025 12:24:59 +0800</pubDate><description><![CDATA[因为上述服务端的代码，在Pipeline中，绝大部分都是与指令相关的handler,Handler越多其链越长，事件传播过程性能损耗会逐渐被放大，因为解码器decode出来的每个Packet对象都要在每隔Handler上经过一遍，因此我i们需要缩短这个事件传播路径。netty的逻辑是，每次有新连接到来的时候都会调用ChannelInitializer的initChannel()方法，与指令相关的Handler每次都会被创建一次。这样每次来一个新连接，添加Handler的时候就不需要每次都创建。]]></description><category></category></item><item><title><![CDATA[Netty初学七 Pipeline与ChannelHandler && 构建客户端与服务端的Pipeline]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145518121</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145518121</guid><author>2201_75920541</author><pubDate>Sat, 08 Feb 2025 17:44:55 +0800</pubDate><description><![CDATA[上述代码的作用是接收上一个Handler的输出，里面的mag是上一个Handler的输出，其默认情况下的Adapter会通过fireChannelRead()方法直接把上一个Handler的输出结果传递到下一个Handler,Outbound同理。调用父类的write()方法，父类的write()方法会自动调用下一个outboundHandler的write()方法，并且会将outboundHandler里处理完毕的对象传递给下一个outboundHandler。]]></description><category></category></item><item><title><![CDATA[Netty初学六 客户端登录以及客户端与服务端收发消息]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145513354</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145513354</guid><author>2201_75920541</author><pubDate>Sat, 08 Feb 2025 15:47:11 +0800</pubDate><description><![CDATA[思路：给客户端连接Channel绑定属性，通过channel.attr().set()方式，在登录成功之后给Channel绑定一个登录成功的标志位，然后再判断登录成功的时候取出这个标志位。客户端拿到数据之后，调用PacketCodeC进行解码操作，如果类型是登录响应包，即在控制台打印出一条消息。客户端首先构建一个登录请求对象，然后通过编码把请求对象编码为ByteBuf,写到服务端。客户端接收服务端的响应数据之后解码ByteBuf,获得登录响应的对象判断是否登录成功。]]></description><category></category></item><item><title><![CDATA[Netty初学五 客户端与服务端通信协议编解码]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145512603</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145512603</guid><author>2201_75920541</author><pubDate>Sat, 08 Feb 2025 12:46:07 +0800</pubDate><description><![CDATA[第一个字段魔数，通常情况下是固定的几个字节，该字段的作用是服务端可以根据这个字段的信息进行比对，可以判断出这个数据包并非遵循自定义协议的，即无效的数据包。1.客户端与服务端的通信是基于tcp通信的数据包格式均为二进制，协议指的是客户端和服务端事先商量好的，每一个二进制包中每一段字节分别代表什么含义。以上过程为java对象的定义，可以根据一种规则把一个java对象转换成二进制数据，即java对象的序列化。第三个字段的序列化算法表示如何将java对象转换成二进制数据以及如何将二进制数据转换成java对象。]]></description><category></category></item><item><title><![CDATA[Netty初学四 数据载体ByteBuf]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145508285</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145508285</guid><author>2201_75920541</author><pubDate>Sat, 08 Feb 2025 11:39:58 +0800</pubDate><description><![CDATA[slice()  duplicate()  copy():第一个方法是截取readerIndex到writeIndex之间，并且返回的ByteBuf的最大容量是原始的readableBytes(),第二个方法是把整个ByteBuf都截取出来，前两个方法的相同点是底层是与原始的ByteBuf共享，即经过返回的ByteBuf的对象调用write方法都会影响到原始的ByteBuf,但是它们维持的与原始的读写指针不同的指针，最后一个方法会直接从原始的ByteBuf中复制信息。]]></description><category></category></item><item><title><![CDATA[Netty初学三 客户端与服务端双向通信]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145502596</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145502596</guid><author>2201_75920541</author><pubDate>Sat, 08 Feb 2025 09:18:00 +0800</pubDate><description><![CDATA[首先获取一个Netty对二进制数的抽象ByteBuf,ctx.alloc()获取一个ByteBuf的内存管理器，然后将二进制数据填充到ByteBuf,最后调用ctx.channel().writeAndFlush()把数据写到服务端。从以上代码中可以看出，Netty里的数据是以ByteBuf为单位的，所需要写的数据必须放在一个ByteBuf中，读数据也如此。ch.pipeline()返回的是和这条连接相关的逻辑处理链，采用的是责任链模式。服务端覆盖的方法是channelRead()方法。]]></description><category></category></item><item><title><![CDATA[Netty初学三 客户端启动流程]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145500418</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145500418</guid><author>2201_75920541</author><pubDate>Fri, 07 Feb 2025 18:59:52 +0800</pubDate><description><![CDATA[上述代码中，定时任务调用的是 bootstrap.config().group().schedule()，其中bootstrap.config()这个方法是对bootstarp配置参数的抽象化，bootstrap.config().group()返回的是线程模型workerGroup()在一般情况下，连接失败不会立即重连，会调用自身重连，但是通常情况下，连接失败不会立即重连，而是每隔1秒 2秒 4秒 8秒，以2的幂次来建立连接，到达一定次数之后就放弃连接。和服务端一样需要需要指定线程模型，驱动连接的读写。]]></description><category></category></item><item><title><![CDATA[Netty初学二 服务端启动流程]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145499200</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145499200</guid><author>2201_75920541</author><pubDate>Fri, 07 Feb 2025 18:17:44 +0800</pubDate><description><![CDATA[1.服务端启动的最小代码：


        上述代码：        2.自动绑定递增端口：                上述示例中绑定了8000端口，但是，在一般情况下这个端口可能被占用，因此找一个没有被占用的端口号还是比较有概率性的，那我们如何将这件事情做到自动化呢？即我们只需要给一个起始的端口号，然后自动向上找一个可用的端口为止，以此类推。以下为实现代码：                


              其中serverBootstrap方法为一个异步（不会等到端口绑定完成后再继]]></description><category></category></item><item><title><![CDATA[Netty初学二 即时聊天系统简介]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145493252</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145493252</guid><author>2201_75920541</author><pubDate>Fri, 07 Feb 2025 15:07:52 +0800</pubDate><description><![CDATA[这段代码是服务端首先创建一个serverSocket来监听8000端口，然后创建一个线程，线程里不断调用阻塞方法serverSocket.accept()获取新连接，当获取新连接之后，为每一个新连接都创建一个新线程，这个线程负责从该连接中读物数据（以字节流的方式读取）IO读写面向流，一次性只能从流中读取一个字节或者多个字节，并且读完之后流无法再读取，需要自己缓存数据，NIO的读写是面向Buffer的，可以随意读取里面的任何字节数据，不需要自己缓存数据，只需要移动读写指针即可。1.每个小朋友都配一个老师。]]></description><category></category></item><item><title><![CDATA[Netty入门初学一]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145492660</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145492660</guid><author>2201_75920541</author><pubDate>Fri, 07 Feb 2025 13:09:45 +0800</pubDate><description><![CDATA[刚开始，打开那个博主的网站源码之后两眼一抹黑，这么长，怎么都是英文，注释都看不懂啊，这写都是什么意思，想要学习的好奇心瞬间减半，但是还是坚守初心，硬着头皮尝试通过各种方式（看博客、看视频等）让自己理解，最后发现自己所领悟的少之甚少，浪费时间，撤退。于是，对于netty的学习就搁置下来。这里说一下原因，首先，语言描述还算自然，另外还有原理图等，这样会更加形象，最后，它是以一种问答式的当时来推进，可以让自己先大概思考一下如果是自己会怎么解决，如果是在想不出来，那自己也会非常好奇的想要继续读下去。]]></description><category></category></item><item><title><![CDATA[DNS探秘之一 nslookup]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145489955</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145489955</guid><author>2201_75920541</author><pubDate>Fri, 07 Feb 2025 12:28:46 +0800</pubDate><description><![CDATA[每个dns服务器里都有一个高速缓存区，这里面存放这这台dns服务器最近经手的域名ip的映射关系，以及获得这些映射关系的查询出处，这样做的好处是如果下次还有请求是询问查询过的域名和ip的信息时，这台dns服务器就不需要再次发起递归查询或迭代查询而是直接在缓存中寻找，但是缓存信息一般会有一定的信任时间。于是上连dns服务器会求助于根dns服务器，然后该请求会主机转发，顺序是cn的dns服务器-->edu.cn的dns服务器--->bupt.edu.cn的dns服务器。]]></description><category></category></item><item><title><![CDATA[docker容器编排工具 docker compose]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145463157</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145463157</guid><author>2201_75920541</author><pubDate>Wed, 05 Feb 2025 23:39:22 +0800</pubDate><description><![CDATA[1.docker compose 是一个用于定义和运行多容器docker应用程序工具定义服务：使用yaml格式的配置文件来定义一组相关的容器服务，每个容器可以指定镜像、端口映射、环境变量、存储卷等参数。]]></description><category></category></item><item><title><![CDATA[Docker数据卷管理及优化]]></title><link>https://blog.youkuaiyun.com/2201_75920541/article/details/145451273</link><guid>https://blog.youkuaiyun.com/2201_75920541/article/details/145451273</guid><author>2201_75920541</author><pubDate>Wed, 05 Feb 2025 21:15:03 +0800</pubDate><description><![CDATA[docker run --volumes-from  datavol  -v `pwd`:/backup  busybox  tar zcf /backup/data1.tar.gz  /data1        将当前目录挂载到本地容器中用于和容器交互保存要备份的容器，备份数据到本地。docker volume  create test,这条命令执行会在默认的数据卷目录下（/var/lib/docker/volumes/）创建test目录，并在该目录下创建_data目录。性能差并且生命周期和容器相同。]]></description><category></category></item></channel></rss>