fyzn12
RSS SITEMAP

Articles

  • 单词学习

    单词学习 allocate /ˈæləkeɪt/ 分配;拨出 Buffer使用时,静态方法,用于分配Buffer内存资源 // 分配Buffer的capacity的字节为48 ByteBuffer buf = ByteBuffer.allocate(48); capacity /kəˈpæsəti/ 能力;容量;资格,地位;生产力 指定一些容器的大小值 transient /ˈtrænziənt/ 短暂的;路过的 java如果一个类型的多数字段可以复制但个别字段不用复制(比如,它实际上是通过其它字段计算出来的),我们可以把它标记为 transient。 invoke /ɪnˈvəʊk/ 调用;祈求;引起;恳求 special /ˈspeʃl/ 特别的;重要的;特设的;专用的,特有的;特派的;格外的 variable /ˈveəriəbl/ 变量的;可变的;易变的,多变的;变异的
  • 菜单树

    业务中有很多时候需要用到菜单树的结构,比如菜单、评论系统等 菜单树 菜单树的实现分析 1.递归 菜单树的实现最原始的方法就是递归实现 数据量不是很到大的时候可以采用一次性将数据读取出存到list集合中,然后对该集合进行遍历。 /** * 根据父节点的ID获取所有子节点 * * @param list 分类表 * @param parentId 传入的父节点ID * @return String */ public List<Menu> getChildPerms(List<Menu> list, Long parentId) { List<Menu> returnList = new ArrayList<Menu>(); list.stream().forEach(menu -> { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 if (menu.getPId().equals(parentId)) { recursionFn(list, menu); returnList.add(menu); } }); return returnList; } /** * 递归列表 * * @param list * @param t */ private void recursionFn(List<Menu> list, Menu t) { // 得到子节点列表 List<Menu> childList = getChildList(list, t); t.
  • K8s日志采集

    k8s日志采集架构选型 1,Node方式:每台节点采用DaemonSet部署agent: 原理:每台节点采用DaemonSet部署一个采集日志的agent,从/var/log/containers/目录采集所有容器的日志,而容器中的日志需要遵循docker的日志规范,把日志打入pid为1的主程序的stdout/stderr,这样k8s会自动在/var/log/containers/目录生成对应容器的日志。 优点:部署维护简单,且能收集所有容器的日志 缺点:需要应用程序日志支持stdout/stderr输出,如果每个节点的日志规模过多,单个采集日志的agent可能成为瓶颈,不太灵活。 2,pod的SideCar方式: 原理:每个pod通过SideCar方式部署一个采集日志的agent 优点:每个pod可单独配置agent,灵活性高 缺点:每个pod都需要一个SideCar比较麻烦 3,应用程序直接推送日志到日志存储: 原理:部署在pod的应用程序支持把日志直接推送到日志存储程序 优点:不用维护日志采集程序,运维简单 缺点:开发成本较高。 三种日志采集模型比较 原生方式 DaemonSet方式 Sidecar方式 采集日志类型 标准输出 标准输出+部分文件 文件 部署运维 低,原生支持 一般,需维护DaemonSet 较高,每个需要采集日志的POD都需要部署sidecar容器 日志分类存储 无法实现 一般,可通过容器/路径等映射 每个POD可单独配置,灵活性高 多租户隔离 弱 一般,只能通过配置间隔离 强,通过容器进行隔离,可单独分配资源 支持集群规模 本地存储无限制,若使用syslog、fluentd会有单点限制 中小型规模,业务数最多支持百级别 无限制 资源占用 低,docker engine提供 较低,每个节点运行一个容器 较高,每个POD运行一个容器 查询便捷性 低 较高,可进行自定义的查询、统计 高,可根据业务特点进行定制 可定制性 低 低 高,每个POD单独配置 适用场景 测试、POC等非生产场景 功能单一型的集群 大型、混合型、PAAS型集群 容器内日志 和主机采集(daemonset)方式相比,容器内日志的采集方案一般使用 sidecar,好处是:
  • Ubuntu搭建单机版k8s

    ubuntu18搭建单机版k8s 环境配置 1、 添加kubernetes的源 echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list 或者直接vim /etc/apt/sources.list 在后面添加deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main 2、 为源申请key 执行 apt-get update 这一步一般执行都会报错 因为不同版本的keys不同,执行之后会报如下错误 查看到这个错误之后 执行sudo gpg –keyserver keyserver.ubuntu.com –recv-keys 后面是错误提示的keys 再执行 sudo gpg –export –armor 上面相同的keys | sudo apt-key add - 注意 --在markdown 编译后会变成一条横杠,其实这里是两条横杠 3、更新源 sudo apt-get update 4、关闭虚拟内存 sudo swapoff -a #暂时关闭 nano /etc/fstab #永久关闭,注释掉swap那一行,推荐永久关闭 5、执行安装 (sudo视操作者情况决定是否加)apt-get install kubelet kubeadm kubectl kubernetes-cni
  • CAS

    CAS Compare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁 因为经常配合循环操作,直到完成为止,所以泛指一类操作 cas(v, a, b) ,变量v,期待值a, 修改值b ABA问题,你的女朋友在离开你的这段儿时间经历了别的人,自旋就是你空转等待,一直等到她接纳你为止 解决办法(版本号 AtomicStampedReference),基础类型简单值不需要版本号 Unsafe AtomicInteger: public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; if (compareAndSet(current, next)) return next; } } public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } Unsafe: public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); 运用: