<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>开发者技术小屋</title>
        <link>https://www.developerhome.net/</link>
        <description>This is my cool site</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 16 Sep 2021 01:24:29 &#43;0000</lastBuildDate>
            <atom:link href="https://www.developerhome.net/index.xml" rel="self" type="application/rss+xml" />
        <item>
    <title>我用Github Action为自己网站做了定时快照</title>
    <link>https://www.developerhome.net/archives/637/</link>
    <pubDate>Thu, 16 Sep 2021 01:24:29 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/637/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-637.jpg" referrerpolicy="no-referrer">
            </div><p>,&lsquo;2021-09-15 17:24:29&rsquo;,&rsquo;<em>本篇文章预计阅读时间 6 分钟，使用技术包含：</em>
<em>- Github Action</em>
<em>- Nodejs</em>
<em>- Puppeteer+Chromium</em></p>
<p>最近有空闲，做了一个有意思的小玩意，通过Github Action能定时对我的网站首页做截图并保存起来，具体是怎么实现的呢？这就不得不介绍一个非常实用的插件<strong>Puppeteer</strong> 了。</p>
<blockquote>
</blockquote>
<p>Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.
摘自 puppeteer 官方介绍</p>
<p><strong>Puppeteer</strong> 是一个针对<strong>Chromium API</strong>进行封装的Node包，其可以通过几个简单的函数就实现对网页的操作，而且因为使用的是<strong>Chromium</strong>内核，所以使用<strong>React</strong>、<strong>Vue</strong>或<strong>AngularJS</strong>等前端渲染的页面，也能完全载入不受影响，可以说和我们用浏览器访问的效果是一样的。</p>
<h1></h1>
<h1 id="安装">安装</h1>
<p>安装puppeteer，安装时需要注意，是需要将对应版本的<strong>Chromium</strong>也安装的。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">npm i puppeteer</span></span></code></pre></div></div>
<p>然后需要进入puppeteer包内安装下依赖，这样对应版本的chromium就安装上了。</p>]]></description>
</item>
<item>
    <title>centos7升级openssh以及openssl</title>
    <link>https://www.developerhome.net/archives/607/</link>
    <pubDate>Fri, 04 Jun 2021 17:08:22 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/607/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-607.jpg" referrerpolicy="no-referrer">
            </div><h1></h1>
<h1 id="背景">背景</h1>
<p>在开发过程中，需求甲方提供的服务器还是用的是<code>Centos7</code>系统，其<code>openssh</code>以及<code>openssl</code>版本还很低，安全方面有很多问题，而<code>yum</code>又无法升级，因此我们需要通过下载源码来安装，本文就一步一步教大家如何通过源码升级最新的<code>openssh</code>以及<code>openssl</code></p>
<h1 id="升级openssl">升级openssl</h1>
<p>首先，我们需要去<a href="https://www.openssl.org/source/" target="_blank" rel="noopener noreffer ">openssl官网</a>下载最新的版本源码包</p>
<blockquote>
</blockquote>
<p>作者当前最新稳定版本为 openssl-1.1.1k.tar.gz</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /root
</span></span><span class="line"><span class="cl">curl -o openssl.tar.gz https://www.openssl.org/source/openssl-1.1.1k.tar.gz
</span></span><span class="line"><span class="cl">tar xzf openssl.tar.gz</span></span></code></pre></div></div>
<p>下载之后，我们进入目录</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> openssl-1.1.1k/</span></span></code></pre></div></div>
<p>查看下安装说明</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">more INSTALL</span></span></code></pre></div></div>
<p>现在我们先安装依赖</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yum instal -y gcc zlib-devel pam pcre-devel perl autoconf</span></span></code></pre></div></div>
<blockquote>
</blockquote>
<p>如果不需要安装pam和zlib的话可以不安装这两个</p>]]></description>
</item>
<item>
    <title>推荐一个golang的tcp处理包</title>
    <link>https://www.developerhome.net/archives/560/</link>
    <pubDate>Fri, 11 Dec 2020 15:56:36 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/560/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-560.jpg" referrerpolicy="no-referrer">
            </div><p>在做物联网设备对接中，我们常常要用到<code>TCP</code>长连接来交互数据，而<code>Golang</code>的设计理念，天生适合做<code>TCP</code>连接的处理。</p>
<p>今天推荐一个开源包 <a href="https://github.com/shootingfans/socket" target="_blank" rel="noopener noreffer ">github.com/shootingfans/socket</a> 来更方便的处理<code>TCP</code>连接操作。</p>
<p>这个包中，首先将处理连接分为两种</p>
<ul>
<li><code>AsyncProcessor</code> 异步处理器</li>
<li>
<ul>
<li><code>SyncProcessor</code> 同步处理器</li>
</ul>
</li>
<li></li>
</ul>
<p>其中异步处理器会在处理连接时，分为读协程、写协程以及工作协程，同时工作协程是可以配置多个的，数据流转为</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>连接 -&gt; 读取协程 --Worker通道--&gt; 多个Worker处理 --&gt; 调度器 --写通道--&gt; 写协程--&gt; 连接</code></pre></div>
<p>调度器则作为一个协调器使用，调取内存取了连接、写入通道等，其结构定义如下</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-go">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// Scheduler</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// 调度器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Scheduler</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 连接</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Conn</span><span class="w">            </span><span class="o">*</span><span class="nx">Connection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 上下文</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">Ctx</span><span class="w">             </span><span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 写入通道</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">WriteChan</span><span class="w">       </span><span class="kd">chan</span><span class="o">&lt;-</span><span class="w"> </span><span class="p">[]</span><span class="kt">byte</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">rw</span><span class="w">              </span><span class="nx">sync</span><span class="p">.</span><span class="nx">RWMutex</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nx">values</span><span class="w">          </span><span class="kd">map</span><span class="p">[</span><span class="kd">interface</span><span class="p">{}]</span><span class="kd">interface</span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>同时调度器还提供了存、读、删，以及自增、自减几个功能用于在多个<code>Worker</code>内共享数据</p>]]></description>
</item>
<item>
    <title>使用openssl生成自签证书</title>
    <link>https://www.developerhome.net/archives/547/</link>
    <pubDate>Fri, 11 Dec 2020 14:03:11 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/547/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-547.jpg" referrerpolicy="no-referrer">
            </div><p>在grpc微服务集群中，我们常常使用自签证书来做服务加密，那如何生成自签证书呢？下面就使用<code>openSSL</code>来生成自签证书</p>
<p>首先我们需要生成服务私钥</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>openssl genrsa -out server.key 1024</code></pre></div>
<p>通过私钥生成证书签名文件</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>openssl req -new -key server.key -out server.csr</code></pre></div>
<p>现在按照提示，需要按提示输入<code>Country Name</code>
再按照提示，输入<code>State or Province Name</code>
按提示输入<code>Locality Name</code>
再输入<code>Organization Name</code>
再输入<code>Organizational Unit Name</code>
输入<code>Common Name</code>,此处可以写交互的域名
输入<code>Email Address</code>
之后会提示输入一个密码，对证书做保护
再按提示输入一个可选的公司名
这时可以看到生成了一个<code>server.csr</code></p>
<p>现在我们已经有了证书签名文件，再使用命令申请一个证书</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 365</code></pre></div>
<p>这样就生成一个有效期一年的证书，也可以更改365来变更有效期</p>]]></description>
</item>
<item>
    <title>修改docker的默认存储目录</title>
    <link>https://www.developerhome.net/archives/541/</link>
    <pubDate>Tue, 26 May 2020 15:47:44 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/541/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-541.jpg" referrerpolicy="no-referrer">
            </div><h1></h1>
<h1 id="docker的默认存储">docker的默认存储</h1>
<p>目前docker默认是在<code>/var/lib/docker</code>下存储运行时等数据，当运行容器较大，时间很长时，这个目录会很大，仅做测试还好，当真正去跑的时候，会很大，因此需要我们去修改docker的默认存储位置</p>
<h1></h1>
<h1 id="如何修改docker的默认存储位置">如何修改docker的默认存储位置</h1>
<h1></h1>
<h1></h1>
<h1 id="使用systemctl启动的docker">使用systemctl启动的docker</h1>
<p>使用systemctl启动的docker服务，我们需要修改器服务的<code>service</code>配置</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>mkdir /mnt/docker-runtime
vi /etc/systemd/system/multi-user.target.wants/docker.service</code></pre></div>
<p>找到 <code>ExecStart</code> 这行，我们在启动参数中增加 <code>-g /mnt/docker-runtime</code>，然后保存退出，使用命令刷新服务</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>systemctl enable docker</code></pre></div>
<p>这样就刷新了服务，再使用命令重启</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>systemctl restart docker</code></pre></div>
<h1></h1>
<h1></h1>
<h1 id="直接修改docker的配置">直接修改docker的配置</h1>
<blockquote>
</blockquote>
<p>此方法对systemctl启动的docker不起作用</p>
<p>首先找到docker的配置文件</p>
<ul>
<li>Ubuntu 中的位置是：/etc/default/docker</li>
<li>CentOS 中的位置是：/etc/sysconfig/docker</li>
</ul>
<p>键入配置</p>]]></description>
</item>
<item>
    <title>无标题</title>
    <link>https://www.developerhome.net/archives/537/</link>
    <pubDate>Fri, 24 Apr 2020 23:16:32 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/537/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-537.jpg" referrerpolicy="no-referrer">
            </div><p>有些事情，发生了就再也回不去了。。。</p>]]></description>
</item>
<item>
    <title>沉重哀悼在新冠病毒战疫中牺牲的烈士和逝去的同胞</title>
    <link>https://www.developerhome.net/archives/527/</link>
    <pubDate>Sat, 04 Apr 2020 17:58:14 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/527/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-527.jpg" referrerpolicy="no-referrer">
            </div><p></p>]]></description>
</item>
<item>
    <title>重启吧</title>
    <link>https://www.developerhome.net/archives/509/</link>
    <pubDate>Sun, 22 Mar 2020 20:29:31 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/509/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-509.jpg" referrerpolicy="no-referrer">
            </div><p>好想重启2019啊，回到2018年底，那样，现在或许会不同。</p>
<p>无论如何，
<code>明天总会来临，无论你觉得好不好，明天终会来到，时间终将抹去那些痛苦的记忆和伤痛，未来依然由你自己掌握。</code></p>
<h1 id="加油吧2020">加油吧，2020！</h1>]]></description>
</item>
<item>
    <title>经典啊</title>
    <link>https://www.developerhome.net/archives/496/</link>
    <pubDate>Sat, 21 Mar 2020 21:02:27 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/496/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-496.jpg" referrerpolicy="no-referrer">
            </div><p></p>
<h1 id="im-iron-man">I&rsquo;m iron man</h1>]]></description>
</item>
<item>
    <title>traefik2初体验</title>
    <link>https://www.developerhome.net/archives/423/</link>
    <pubDate>Wed, 01 Jan 2020 23:57:05 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/423/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-423.jpg" referrerpolicy="no-referrer">
            </div><p><code>traefik</code> 作为一款稳定的网关，一直被很多微服务使用，目前<code>traefik</code>升级到了 <strong>2</strong> 版本，增加了针对tcp的支持，因为更新时间不长，还没有针对新版的中文文档，新版的文档在 <a href="https://docs.traefik.io/" target="_blank" rel="noopener noreffer ">官网</a>，如果使用之前的版本，可以参考<a href="https://docs.traefik.cn" target="_blank" rel="noopener noreffer ">中文文档</a>，之前在搭建k8s集群时曾经尝试过使用<code>traefik 1+</code> 的版本，后来因为项目时间问题，最后放弃了使用k8s，也就没有仔细去体会<code>traefik</code>的强大功能。最近因为另一个项目有一些需求，计划使用traefik来做API网关，才翻出来看看，结果发现更新到了2.0版本，竟然支持TCP了，好了，废话不多说，开始体验一下新版的功能吧！</p>
<p>为了方便学习并去除系统差异，我将直接使用Docker来做环境，<code>traefik</code> 中支持 docker 模式，并能支持docker原生的swarm模式，下面我将统一使用docker-compose来做说明</p>
<p>首先我们先创建一个简单的例子，使用官方提供的 <code>containous/whoami</code> 来作为应用镜像，其可以显示请求的具体信息，以便一会做请求时来确认具体访问到的是哪个容器</p>
<p>下面我们来创建一个 <code>docker-compose.yml</code> 编排文件</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>version: &#34;3.4&#34;
services:
    traefik:
        image: traefik:v2.1
        ports:
            - &#34;80:80&#34;
            - &#34;8080:8080&#34;
        volumes: 
            - &#34;/var/run/docker.sock:/var/run/docker.sock&#34;
        command: 
            - &#34;--api.insecure=true&#34;
            - &#34;--api.dashboard=true&#34;
            - &#34;--accesslog=true&#34;
            - &#34;--providers.docker=true&#34;
            - &#34;--entrypoints.web.address=:80&#34;
    whoami:
        image: containous/whoami
        labels: 
            - &#34;traefik.http.routers.app.rule=Host(`localhost`)&#34;
            - &#34;traefik.http.routers.app.entrypoints=web&#34;</code></pre></div>
<p>上面这个编排文件中，我们开放traefik与docker的守护进程通信</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>volumes: 
    - &#34;/var/run/docker.sock:/var/run/docker.sock&#34;</code></pre></div>
<p>在启动命令中，我们首先开启了 <code>dashboard</code> 为了本地调试，我们使用 <code>insecure</code> 来开启不安全接口访问方便我们做本地调试</p>]]></description>
</item>
</channel>
</rss>
