<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[csdnYF的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/csdnYF</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; csdnYF]]></copyright><item><title><![CDATA[每个程序员必备的基础设施--Codeium]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/130843649</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/130843649</guid><author>csdnYF</author><pubDate>Wed, 24 May 2023 11:28:19 +0800</pubDate><description><![CDATA[自从 chartGPT3 横空出世以后，AI 技术越来越深入到每个人的生活中，这里不谈 AI 到底是不是真的存在着类人的思想和智慧，也不谈是否取代人类的问题。本着实用主义的原则，先让它能为我所用。
]]></description><category></category></item><item><title><![CDATA[2023年，当我们谈论架构时，我们要聊什么]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/129418944</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/129418944</guid><author>csdnYF</author><pubDate>Thu, 09 Mar 2023 11:04:53 +0800</pubDate><description><![CDATA[架构是一个非常宽泛的话题，从组织结构上来说，涉及到前端、后端、运维；从软件设计上来说，涉及到需求分析、设计、编码、测试；从物理结构上来说，涉及到CDN、负载均衡、网关、服务器、数据库。当前一些架构方面的书籍，一般都从单体架构讲起，逐步过渡到微服务、云原生等，但这难免会让人疑惑，是否微服务就是最好的架构，或者说，当我从零设计一款系统时，面对现在各领域层出不穷的框架、技术，我到底应该如何选择？时代在变化，架构在演化。]]></description><category></category></item><item><title><![CDATA[一起来聊聊 Go 的核心竞争力]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/129196398</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/129196398</guid><author>csdnYF</author><pubDate>Fri, 24 Feb 2023 10:49:16 +0800</pubDate><description><![CDATA[现在，越来越多的人了解 Go 语言，学习 Go 语言，越来越多的公司开始尝试采用 Go 语言。我也是一直在用 Go 作为服务端开发的主力语言，也了解过 Java 和 Spring 那一整套服务端开发体系，时常在想，Java 的这一套体系，在长时间的迭代下，技术沉淀和业务覆盖已经非常完善，为什么 Go 还能脱颖而出？让大家所熟知。我知道，这中间存在一些从众效应，尤其是大公司的带头使用带来的引领作用，这为 Go 的声名带来了正向反馈，使 Go 越来越被人们所了解。]]></description><category></category></item><item><title><![CDATA[实现“第 24”种设计模式]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/129196342</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/129196342</guid><author>csdnYF</author><pubDate>Fri, 24 Feb 2023 10:47:39 +0800</pubDate><description><![CDATA[但是，机器学习的目标主要是怎么通过大量的数据，识别和构造出一个决策树，也就是图中这些条件本来是不存在的，需要通过学习去自动生成。首先， 如果真的只是例子中这种扁平的（指一层）if-else，即使它加到 100 个，也不会很复杂，本来也就很符合人类的思维习惯，一个个往下看就是了（人类很喜欢顺序和规律）。思考一下，这种嵌套的 if-else 是不是构成了一棵分支树，树的叶子节点就是某种操作，树的非叶子节点就是某个判断。我们还定义了一个节点 Map，保存了这棵树的所有节点，这与一般的树实现不同，这是为什么呢？]]></description><category></category></item><item><title><![CDATA[如何做好一个配置中心]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/127746602</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/127746602</guid><author>csdnYF</author><pubDate>Tue, 08 Nov 2022 10:56:42 +0800</pubDate><description><![CDATA[最后，引用那句经典的“软件开发里没有银弹”，我想补充一句：“你要知道你手里有哪些类型的子弹。”通过对比和分析，来确定当时，当地，最适合项目的那个方式，比如项目着急上线，先直接把配置文件写死在代码里，都不是不可以的，后期可以再改。如何做好一款配置中心？希望看完本文你能有自己的答案。]]></description><category></category></item><item><title><![CDATA[请小心ETCD的Compact]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/126931121</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/126931121</guid><author>csdnYF</author><pubDate>Mon, 19 Sep 2022 11:58:45 +0800</pubDate><description><![CDATA[本文想讨论一些ETCD的使用注意事项，ETCD作为一个分布式KV数据库，作用有很多，下面以用ETCD作为配置中心来举例，用到了ETCD关键的两个功能：Watch和Revision。Watch可以实时推送配置变更，而Revision可以回溯配置的历史变更列表。关于Revision的概念，请参考在ETCD中，老实说对Revision的概念支持的不是很好，虽然标榜自己是可以回溯历史版本的，但我找了半天，除了一个--rev参数，没有找到更多的API来利用这些历史版本。可以通过。]]></description><category></category></item><item><title><![CDATA[从权限系统的菜单管理看算法和数据结构]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/126247187</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/126247187</guid><author>csdnYF</author><pubDate>Tue, 09 Aug 2022 14:38:03 +0800</pubDate><description><![CDATA[菜单管理，感觉上是个小模块，但实际做下来的感触是，要做的好用，不容易。算法和数据结构，长期活跃在面试题中，实际业务中好像接触的不多，但如果能用好，可以解决大问题。如上图，是我在开源世界找到的一个菜单管理的设计页面，其上可以看到，菜单管理主要管理一颗菜单树，可以增删改查、排序等功能。接下来，我们就一步一步的实现菜单管理的各个功能，这里我主要介绍后端的设计方案，不涉及前端页面的处理和展示。可以看到，菜单管理模块主要分三块，一是对菜单的增删改查、二是菜单的导入导出、三是菜单的排序。...]]></description><category></category></item><item><title><![CDATA[LPG（Loki+Promtail+Grafana） 日志收集系统实践和踩坑经历]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/125723027</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/125723027</guid><author>csdnYF</author><pubDate>Tue, 12 Jul 2022 01:02:26 +0800</pubDate><description><![CDATA[日志收集系统，一般以ELK架构居多，现在很多也会考虑用 Fluentd 组成EFK。但对于资源有限的集群来说，部署一个ElasticSearch的成本实在太高，幸好现在已经有一套新的低成本开源方案，那就是LPG。也同样能达到日志收集和检索的目的，占用的资源还少。Loki是Grafana公司出的一款开源的日志存储和检索系统，对标的是ElasticSearch，但是设计理念完全不同，ElasticSearch核心是倒排索引，而Loki的核心是基于KV标签的索引+原始日志存储。在存储占用上，Loki的占用量天生就]]></description><category></category></item><item><title><![CDATA[延时队列如何实现？ETCD vs Redis]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/124589028</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/124589028</guid><author>csdnYF</author><pubDate>Thu, 05 May 2022 15:00:39 +0800</pubDate><description><![CDATA[前言
日常开发中，我们经常会碰到有延时任务的场景，譬如30分钟后关闭订单、在指定时间上架某个活动等，如果是最简单的场景，不考虑服务水平扩容、服务宕机等因素，可能内部用github.com/robfig/cron加MYSQL存储延时信息即可。当然，一般线上服务，不可能不考虑道这些因素的影响，所以才有很多任务调度框架，比如：Quartz、xxl-job、Temporal等。但这次这里想讨论的是中间情况，也就是，既想保证服务能水平扩容、服务宕机任务不丢失，又不想使用那些调度框架（毕竟有部署成本和学习成本）。
延时]]></description><category></category></item><item><title><![CDATA[如何低成本的搭建一个真实的Kubernetes集群]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/123122014</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/123122014</guid><author>csdnYF</author><pubDate>Thu, 24 Feb 2022 21:56:28 +0800</pubDate><description><![CDATA[引言：kubernetes作为当前事实上的容器编排标准，其势头可谓是如日中天，然而，kubernetes一直以来被人诟病的就是其复杂的搭建成本，作为个人，除了用miniKube等工具在个人电脑上模拟一个集群，或者通过虚拟机模拟一个集群，但终归，真实集群和虚拟集群是不同的。我一直在想，如今云服务器已经十分成熟，难道就不能作为搭建kubernetes平台的基础设施吗？

一、架构规划
其实对于现在的云服务来说，各家竞争激烈，价格也打得比较低，但是存在一个问题：为了吸引新用户，云服务厂商一般都对产品首单、新用户.]]></description><category></category></item><item><title><![CDATA[Go 服务端开发总结]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/121884823</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/121884823</guid><author>csdnYF</author><pubDate>Mon, 20 Dec 2021 09:13:36 +0800</pubDate><description><![CDATA[服务端开发一般是指业务的接口编写，对大部分系统来说，CURD的操作占了绝大部分。然而，网络上总有调侃“CURD工程师”的梗，以说明此类开发技术并不复杂。我个人认为，如果仅仅为了找个框架填充点代码完成任务，确实是简单，但是人类贵在是一根“会思考的芦苇”，如果深入的思考下去，在开发过程中还是会碰到很多通用的问题的。如用go的开发框架举例子，就有两种分化形式：
一种以beego为代表的，goframe继续发扬广大的框架类型，它们的特点就是大而全，提供各种各样的功能，你甚至不需要做多少选择，反正按照文档使用就是了。]]></description><category></category></item><item><title><![CDATA[凤凰架构读书笔记]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/121350117</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/121350117</guid><author>csdnYF</author><pubDate>Tue, 16 Nov 2021 10:19:12 +0800</pubDate><description><![CDATA[演进中的架构笔记：
    我理解的架构之道，一定是在了解架构发展的历史基础上扩展，非历史而不能明真理。
    最先和最初的单体架构，老而弥坚。很赞同作者说的单体并不是反例，实际上我们很多系统刚开始就是单体架构，单体只意味着：
    1. 随时间维度增长带来的维护困难
    2. 技术栈的单一
    3. 一荣俱荣一损俱损
    对一些小系统而言，单体无疑是最简单正确的选择。同时，单体不意味着维护困难，这点要格外注意。只有在时间增长带来的系统复杂度增长的情况下，才会出现维护困难。同时，技术栈单一也]]></description><category></category></item><item><title><![CDATA[ETCD源码分析（三）Raft协议入门]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/120512014</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/120512014</guid><author>csdnYF</author><pubDate>Mon, 27 Sep 2021 18:18:18 +0800</pubDate><description><![CDATA[适合阅读本文的人群

对Raft协议感兴趣的人
看过一些Raft相关介绍的博文，但是看不懂的（比如我）


很多Raft相关的分析文章，或者是著名的《In Search of an Understandable Consensus Algorithm》 论文，都会把下面的一张图放出来：

再介绍选主、日志复制、状态机等一系列概念，恕我直言，真是看的人昏昏欲睡。也许有的表述确实看懂了，可正如古人所说，纸上得来终觉浅，要知此事需躬行。Raft协议跟我们日常写代码有什么关系，我们到底能不能用上它呢？
我个人觉得.]]></description><category></category></item><item><title><![CDATA[分布式任务调度框架（Temporal）介绍]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/120367446</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/120367446</guid><author>csdnYF</author><pubDate>Sat, 18 Sep 2021 15:02:28 +0800</pubDate><description><![CDATA[分布式任务调度框架基本能力：

任务管理能力（增删改查、执行、定时执行、延时执行、健康监控）
集群管理能力（扩展简单、效率高）
编程能力（运行代码）
Web界面管理


目前市面上有很多可用于处理分布式任务的开源框架，比如Elastic-Job、XXL-Job、Quartz等等，它们或多或少都能满足以上列出的各项基本能力，然而，它们都是以Java系语言编写的，这不禁让人产生疑问，难道Go就没有自己的开源任务调度框架吗？
经过在网络上一番翻箱倒柜，找到了类似gocron、gocraft/work、robfi.]]></description><category></category></item><item><title><![CDATA[ETCD源码分析(二)Client端Watch流程分析二]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/120251649</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/120251649</guid><author>csdnYF</author><pubDate>Sat, 18 Sep 2021 09:57:23 +0800</pubDate><description><![CDATA[书接上文，继续分析Client端Watch流程的关闭流程的处理。首先我们再回顾下Watch中的关键角色和设计理念：




角色
说明




watcher
对外接口Watcher的实现，重点是Watch()方法


watchGrpcStream
桥梁，管理内部GRPC连接、管理内部的虚拟Stream、消息接收和分发


watchClient
对应底层的GRPC连接客户端


watcherStream
虚拟的Stream，处理服务端和客户端的通信


要分析关闭流程，我们首先来找找有哪些情况会导致关]]></description><category></category></item><item><title><![CDATA[ETCD源码分析(二)Client端Watch流程分析一]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/120212013</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/120212013</guid><author>csdnYF</author><pubDate>Wed, 15 Sep 2021 11:05:01 +0800</pubDate><description><![CDATA[书接上文，我们在《ETCD源码分析Client端启动流程分析》中，深入源码查看ETCDClient端如何启动，如何向Server建立GRPC连接的。在本文中，我们继续探究ETCD的Client端是如何实现Watch逻辑的。
由于Watch逻辑整体还是比较复杂的，建议观看本文的小伙伴，把ETCD的V3.5版本源码打开，对比着文章查看。
ETCD源码Watch启动流程
首先对Watch流程进行分解，先介绍下ETCD客户端是如何启动Watch的。

Watch模块通过Watcher接口对外提供三个功能：

Wat]]></description><category></category></item><item><title><![CDATA[ETCD源码分析Client端启动流程分析]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/120304392</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/120304392</guid><author>csdnYF</author><pubDate>Wed, 15 Sep 2021 11:04:27 +0800</pubDate><description><![CDATA[ETCD源码基于v3.5，在分析之前，需要搭建好源码分析的环境。首先，从GitHub的仓库中克隆下ETCD的源码，再利用docker搭建我们的ETCD测试集群，命令如下：
REGISTRY=quay.io/coreos/etcd
NAME_1=etcd-node-0
NAME_2=etcd-node-1
NAME_3=etcd-node-2
# IP在不同机器上不同，请查看docker的子网网段
HOST_1=172.20.0.2  
HOST_2=172.20.0.3
HOST_3=172.20.0.4
]]></description><category></category></item><item><title><![CDATA[对设计模式中工厂模式的理解和感悟]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/119059397</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/119059397</guid><author>csdnYF</author><pubDate>Sat, 24 Jul 2021 15:49:09 +0800</pubDate><description><![CDATA[回想刚开始学习设计模式时，被23种设计模式冲昏头脑，很想学好，但是越看越晕。工作几年后，回头在看，略有些心得，因此做个小总结，也希望能带给后来的小伙伴一点点启发。

一、设计模式之道
  很喜欢一些大佬们对知识的分类法，他们会把知识分成“道法术器”（也是源自道家的思想）。所谓“道”，我理解指的就是根源和初心了，它的特点就是高度概括，包罗万象；所谓“法”，我理解就是运行的法度、制度、规章，它的特点就是保证系统的正确运转；所谓“术”，就是一些做事的方法，它的特点就是有条理，有步骤；所谓“器”，则是一些辅助工具.]]></description><category></category></item><item><title><![CDATA[Goreleaser + TraivsCI 发布 gopo 项目]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/113095820</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/113095820</guid><author>csdnYF</author><pubDate>Sun, 24 Jan 2021 19:47:26 +0800</pubDate><description><![CDATA[很久没有更新过博客，想来也是十分惭愧，每日都在公司和家庭之间来回往返，闲下来时也浑浑噩噩。古人云吾日三省吾身，博客就是一个很好的反省和总结的手段，只是难的不是写一篇或两篇，而是那份滴水穿石的毅力。以上扯了些废话，下面进入分享正题。
Goreleaser和TraivsCI 这边就不再过多介绍，可以去它们官网上了解。这边主要是介绍gopo以及如何把它发布出去供人使用。那这篇文章也相应的分为两个部分。
gopo
gopo 说白了就是解析go中的结构体，生成对应的结构体字段常量表。也就是说：
type SomeTa]]></description><category></category></item><item><title><![CDATA[Flutter学习 ---- TravisCI加持]]></title><link>https://blog.youkuaiyun.com/csdnYF/article/details/80678461</link><guid>https://blog.youkuaiyun.com/csdnYF/article/details/80678461</guid><author>csdnYF</author><pubDate>Wed, 13 Jun 2018 14:20:08 +0800</pubDate><description><![CDATA[
  Flutter号称统一Android端和IOS端开发，做到一份代码同时运行在两个平台上，从实际效果来看，流畅的体验、完善的文档，还是很值得一试的。不过其中却藏了一个神坑（对我来说），那就是你的Flutter应用要在IOS上运行，必须在macOS主机上打包才可以，吃着苹果的童鞋自然不用担心了。然而本人一台y400征战多年，目前资金池也处于资源紧缩状态，换苹果机这种高消耗的任务基本是排在优先级队...]]></description><category></category></item></channel></rss>