用户您好!请先登录!

Archives1月 2020

Spring Cloud Gateway 2.0

为什么很多人觉得spring cloud gateway难用?因为它的背后用的是webflux,涉及到响应式编程,而不是传统的过程式编程。

我们把背后的技术梳理一下,不难发现,这个晦涩的根源,就来自于project reactor,与spring项目并驾齐驱的,”面向未来”的响应式编程框架。

结果最后的代码,都长的和lambda一样。其背后的思想,是观察者模式和非阻塞杂交的产物,学习曲线相对陡峭

万字Spring Cloud Gateway2.0,面向未来的技术,了解一下?

阅读更多

Hbase架构全解

依然是hadoop组件的讲解,今天说到HBase 架构,都是一字一句打出来的,希望各位转发加关注,会一直给大家写优质的内容。

物理上,Hbase 是由三种类型的 server 组成的的主从式(master-slave)架构:

  • Region Server,负责处理数据的读写请求,客户端请求数据时直接和 Region Server 交互。
  • HBase Master,负责 Region 的分配,DDL(创建,删除 table)等操作。
  • Zookeeper,作为 HDFS 的一部分,负责维护集群状态。

当然底层的存储都是基于 Hadoop HDFS 的:

  • Hadoop DataNode 负责存储 Region Server 所管理的数据。所有的 HBase 数据都存储在 HDFS 文件中。Region Server 和 HDFS DataNode 往往是分布在一起的,这样 Region Server 就能够实现数据本地化(data locality,即将数据放在离需要者尽可能近的地方)。HBase 的数据在写的时候是本地的,但是当 region 被迁移的时候,数据就可能不再满足本地性了,直到完成 compaction,才能又恢复到本地。
  • Hadoop NameNode 维护了所有 HDFS 物理 data block 的元信息。

阅读更多

Netty架构原理

对于高性能的 RPC 框架,Netty 作为异步通信框架,几乎成为必备品。例如,Dubbo 框架中通信组件,还有 RocketMQ 中生产者和消费者的通信,都使用了 Netty。今天,我们来看看 Netty 的基本架构和原理。

Netty 的特点与 NIO

Netty 是一个异步的、基于事件驱动的网络应用框架,它可以用来开发高性能服务端和客户端。

以前编写网络调用程序的时候,我们都会在客户端创建一个 Socket,通过这个 Socket 连接到服务端。

服务端根据这个 Socket 创建一个 Thread,用来发出请求。客户端在发起调用以后,需要等待服务端处理完成,才能继续后面的操作。这样线程会出现等待的状态。

如果客户端请求数越多,服务端创建的处理线程也会越多,JVM 如此多的线程并不是一件容易的事。

Netty架构原理,不怕你看不懂

使用阻赛 I/O 处理多个连接

阅读更多

Kubernetes的设计准则

今天我要带给大家的是2018年底,在西雅图举办的Kubecon的一场分享,来自谷歌K8s团队的工程师Saad Ali分享的《Kubernetes设计原则》。这场会议虽然已经过去一年多了,但是我觉得本会议的内容非常值得学习,我们大都知道K8s是如何工作的,但是本文带我们了解k8s背后的设计原则,以及为什么要这样设计。

对于跨云和本地环境在分布式系统上管理和部署工作负载,Kubernetes很快变得不可或缺。

虽然现在大多数人都熟悉如何使用Kubernetes,但很少有人知道其背后的“为什么”?为什么Kubernetes API看起来是这样的?为什么Kubernetes组件仅通过Kubernetes API相互交互?当您可以轻松地直接从pod引用卷时,为什么会有PersistentVolumeClaim对象?

阅读更多

C++常用库

关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。

标准库

C++标准库,包括了STL容器,算法和函数等。

  • C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。
  • Standard Template Library:标准模板库
  • C POSIX library : POSIX系统的C标准库规范
  • ISO C++ Standards Committee :C++标准委员会

阅读更多

数据库异地多活解决方案

异地多活指分布在异地的多个站点同时对外提供服务的业务场景。异地多活是高可用架构设计的一种,与传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。

以一个简单的业务单元的IT系统为例,整个IT系统的异地多活方案如下图所示。

数据库异地多活解决方案「转」

整个方案将各站点分为:分流量层、应用层和数据层。

阅读更多

分布式缓存设计那点事

在高并发的分布式的系统中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的底层,系统是很难撑住高并发的冲击,所以分布式系统中缓存的设计是很重要的一环。下面就来聊聊分布式系统中关于缓存的设计以及过程中遇到的一些问题。

缓存的收益与成本

使用缓存我们得到以下收益:

  • 加速读写。因为缓存通常是全内存的,比如Redis、Memcache。对内存的直接读写会比传统的存储层如MySQL,性能好很多。举个例子:同等配置单机Redis QPS可轻松上万,MySQL则只有几千。加速读写之后,响应时间加快,相比之下系统的用户体验能得到更好的提升。
  • 降低后端的负载。缓存一些复杂计算或者耗时得出的结果可以降低后端系统对CPU、IO、线程这些资源的需求,让系统运行在一个相对资源健康的环境。

阅读更多

iptables那点事

linux 的包过滤功能,即 linux 防火墙,它由 netfilter 和 iptables 两个组件组成。netfilter 位于内核空间,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 是一个命令行工具,位于用户空间,它使得插入、修改和删除信息包过滤表中的规则变得容易。

我们知道 iptables 是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

阅读更多

DevSecOps的常用工具

几年前,DevSecOps 成为敏捷应用安全(AppSec)模块中最受欢迎的新成员。尽管有许多组织仍在寻找如何在整个 DevOps 周期中通过左移和集成确定安全性的方法,但将安全性嵌入到 DevOps 周期中已成为标准。

采用 DevSecOps 方法需要组织转变态度,并将其应用于流程、人员及他们使用的工具。

自动化是 DevSecOps 方法的核心

尽管这种组织变革一直是一个挑战,但是越来越多的企业和组织正在齐心协力地将安全实践向左迁移,并将其纳入 DevOps 周期,以确保实施必要的安全检查而不会影响产品上市时间。

DevSecOps 方法的一个主要组成部分是自动化:在整个 SDLC 中,尽早并尽可能频繁地确保安全性贯穿于整个开发生命周期,从而节省时间和金钱,并减少安全团队和开发团队之间的摩擦。

阅读更多

使用Podman、Skopeo和Buildah下一代容器新架构

很多人可能遇到过开机重启时,由于Docker守护程序在占用多核CPU使用100%C使用的情况,导致所有容器都无法启动,服务都不能用的情况。很悲催的是这事儿虫虫也遇到了,之前文章中虫虫介绍过利用Docker重构WP博客的新架构。由于VPS机器不是很稳定,时常会重启,重启时候就会遇到这个事情,VPS负载很高,容器都没有起来,网站就无法访问了。这时候只能杀掉所有容器并重启守护进程,才能恢复。经过了解该问题是由于Docker守护进程引起,而且Docker守护进程是以root特权权限启动的,是一个安全问题,那么有什么方法解决呢?

为什么Docker需要一个守护进程呢?

阅读更多

加速 Web 开发的 23 款前端开发工具

1. Novi Builder

加速 Web 开发的 23 款前端开发工具

Novi Builder 是一个拖放式构建器,它对于经验丰富的 Web 开发人员而言是一个不错的选择。它为开发人员提供了访问源代码的权限,并允许开发人员在 Web 设计中进行多项更改。你能用它完全控制你的 Web 项目,并且可以充分利用它的各项功能。尽管这款工具对于初学者来说可能很难入门,但在它的众多优势面前这一不足也就不值一提了。

特性:

  • 高级代码编辑器
  • 附加应用集成
  • 多种预制主题
  • 拖放界面
  • 电商功能支持
  • 预览工具

下载链接: https://novibuilder.com/

阅读更多

Dapper,大规模分布式系统的跟踪系统

概述

当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具。

Dapper–Google生产环境下的分布式跟踪系统,应运而生。那么我们就来介绍一个大规模集群的跟踪系统,它是如何满足一个低损耗、应用透明的、大范围部署这三个需求的。当然Dapper设计之初,参考了一些其他分布式系统的理念,尤其是Magpie和X-Trace,但是我们之所以能成功应用在生产环境上,还需要一些画龙点睛之笔,例如采样率的使用以及把代码植入限制在一小部分公共库的改造上。

阅读更多

Prometheus普罗米修斯那点事

DevOps工程师或SRE工程师,可能都知道Prometheus普罗米修斯。Prometheus于2012年由SoundCloud创建,目前已经已发展为最热门的分布式监控系统。Prometheus完全开源的,被很多云厂商(架构)内置,在这些厂商(架构)中,可以简单部署Prometheus,用来监控整个云基础架构设施。比如DigitalOcean或Docker都是普罗米修斯作为基础监控。

希腊神话中,普罗米修斯是最具智慧的神明之一,是泰坦巨神后代,其名字意思为”先见之明”,那么以该名字命名的监控系统究竟怎么样呢?今天虫虫给大家讲讲这个以神之名命名的监控系统。

完美的分布式监控系统——普罗米修斯

阅读更多

SonarQube那点事

SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十几种编程语言的代码质量管理与检测。

SonarQube特性

持续检查

  • 项目整体的健康程度
    项目的主页面会给出,项目整体的Bugs、Vulnerabilities、Code Smells
  • 专注于漏洞
    water-leak-paradigm可以有效的管理代码质量:新特性,增加的,改变的
    (water-leak-paradigm是sonarqube研究的一种代码管理方法)
    在项目监测报告中,需要密切关注:New Bugs、New Vulnerabilities
  • 实施质量阈值
    在团队项目中,可以设置质量阈值(Quality Gate),用于监管质量
  • 分支分析
    确保干净的代码才会被合并到主分支中
阅读更多

敏捷项目的可视化

敏捷事关“整体团队”经验。我们在一起做计划、在一起编码、在一起测试、在一起检视过去,以便团队中的每一个人都能达成一致的共识。然而,随着项目增大,团队开始迷失在大堆的用户故事里,很难让每个人都能看到相同的全景图(big picture)。本文讨论了可视化全景图的各种方法。不仅可用于负责人和管理者,更可以用于每一个人。

在理想的情况下,敏捷团队应该针对当前迭代提出清晰的计划,而后续的发布计划可以较为粗略。而事实上很多情况是,团队在当前迭代只是急于实现下一步的小创意。他们完全忽略了全景图。通常会有这样一种情况:这张图保存在一个角色的脑中,比如团队领导、业务分析师、项目经理、产品经理、甚至是ScrumMaster。这往往是由于他或她没有真正地推动自组织所导致的。这一现象在某些情况下还是可以接受的,比如一个不重要的短期项目,但在许多情况下,这会造成恶劣的后果,当团队偏离轨道时他们也什么也察觉不到,因为他们觉得所有的工作都还在正常地运转。

阅读更多

模拟超过 5 万用户的并发访问

本文将从负载测试的角度,描述了做一次流畅的5万用户并发测试需要做的事情.

快速的步骤概要

  1. 编写你的脚本
  2. 使用JMeter进行本地测试
  3. BlazeMeter沙箱测试
  4. 使用一个控制台和一个引擎设置Users-per-Engine的数量
  5. 设置并测试你的集合 (1个控制台和10-14 引擎)
  6. 使用 Master / Slave 特性来达成你的最大CC目标

如何模拟超过 5 万用户的并发访问?

阅读更多

「无服务器架构」Knative Eventing

Knative Eventing是一个旨在满足云原生开发的常见需求的系统,并提供可组合的原语以启用后期绑定事件源和事件使用者。

设计概述

Knative Eventing是围绕以下目标设计的:

  1. 原始事件服务是松散耦合的。这些服务可以在各种平台上(例如Kubernetes,VM,SaaS或FaaS)独立开发和部署。
  2. 事件生产者和事件消费者是独立的。任何生产者(或源)都可以在有活动的事件使用者监听之前生成事件。在有生产者创建事件之前,任何事件消费者都可以对事件或事件类别表示兴趣。
  3. 可以将其他服务连接到Eventing系统。这些服务可以执行以下功能:创建新的应用程序而无需修改事件生产者或事件使用者。从生产者那里选择事件的特定子集并将其作为目标。
  4. 确保跨服务的互操作性。 Knative Eventing与由CNCF Serverless WG开发的CloudEvents规范一致。

阅读更多

从VSCode看IDE技术架构

谈起 Web IDE,没人能绕开 VSCode,它非常流行,同时又完全开源,总共 350000 行 TypeScript 代码的巨大工程,使用了 142 个开源库。市面上选择基于 VSCode 去修改定制的 IDE 比比皆是:Weex Studio、白鹭Egret Wing、快应用IDE…

我们从 VSCode 身上看到什么?

  • 大型复杂 GUI 软件(如 IDE 类)如何组织功能模块代码
  • 如何使用 Electron 技术将 Web 软件桌面化
  • 如何在打造插件化开放生态的同时保证软件整体质量与性能
  • 如何打造一款好用的、流行的工具软件

一、VSCode 是什么

官方定义:

从 VSCode 看大型 IDE 技术架构

阅读更多

用.map() .filter() 和.reduce()给代码做“减法”

世间纷乱复杂,我们在不断给自身做“加法”的同时,也要学会对周围的事物做“减法”,将复杂的东西简化,为我所用,并发挥超出原本程度的增幅效果,这才是真正的“高手”。

在“码农圈”,学习如何使用.map()、.filter()和.reduce()函数,我们读到、看到和听到的一切都很复杂,无法理解这些概念,因为它们是独立的学习单元。

听说这些是意味着上升至启蒙状态的入门知识。真希望自己听到的是实话:早点明白这三种方法其实都是识别和实现过程,循环遍历迭代的原因通常属于三个功能类别之一。

回顾之前编写的代码,笔者发现95%的情况下,在对字符串或数组进行循环时,自己都会执行以下操作之一:将语句序列映射(map)到每个值,过滤(filter)满足特定条件的值,或者将数据集减少(reduce)到单个聚合值。

阅读更多

深入浅出分析 PriorityQueue

Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。

总体介绍

前面以Java ArrayDeque为例讲解了StackQueue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器Comparator,类似于C++的仿函数)。

阅读更多

白话微服务架构

微服务是什么?

微服务是一种细粒度(Fine-Grain)的SOA

或许在座的高朋了解过其概念。个人认为,与其说微服务是一种技术,不如将其定义为一种架构,而架构则是"技"的实现与"术"的策略相辅相成。
"术"的策略需要分析使用场景,进行合理地划分业务边界,实现"业以类聚",然而"技"的实现则通过特定的技术在实现业务逻辑之时,更多的考虑实现过程中的效率性、测试的便利性、维护的可持续性,达到"技以群分"的目的。

由此而论,我个人偏好将其定义为:”微服务是一种细粒度的SOA”。

这样定义的好处在于,没必要去重复地”抹黑””单体应用”(Monolithic,也有人翻译成”巨石应用”),缘于SOA技术的衍化过程中早已提及。那么,细粒度更多的体现在”取其精华,去其糟粕”。

阅读更多

MySQL亿级数据同步在小米的运用

MySQL由于自身简单、高效、可靠的特点,成为小米内部使用最广泛的数据库,但是当数据量达到千万/亿级别的时候,MySQL的相关操作会变的非常迟缓;如果这时还有实时BI展示的需求,对于MySQL来说是一种灾难。

为了解决sql查询慢,查不了的业务痛点,我们探索出一套完整的实时同步,即席查询的解决方案,本文主要从实时同步的角度介绍相关工作。

早期业务借助Sqoop将MySQL中的数据同步到Hive来进行数据分析,使用过程中也带来了一些问题:

  • 虽然Sqoop支持增量同步但还属于粗粒度的离线同步,无法满足实时性的需求;
  • 每次同步Sqoop以sql的方式向MySQL发出数据请求也在一定程度上对MySQL带来一定的压力;
  • 同时Hive对数据更新的支持也相对较弱。

为了更有效地连接前端业务数据系统(MySQL)和后端统计分析系统(查询分析引擎),我们需要一套实时同步MySQL数据的解决方案。

阅读更多

最佳内存缓存框架Caffeine

Caffeine是一种高性能的缓存库,是基于Java 8的最佳(最优)缓存框架。

Cache(缓存),基于Google Guava,Caffeine提供一个内存缓存,大大改善了设计Guava’s cache 和 ConcurrentLinkedHashMap 的体验。

1 LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
2     .maximumSize(10_000)
3     .expireAfterWrite(5, TimeUnit.MINUTES)
4     .refreshAfterWrite(1, TimeUnit.MINUTES)
5     .build(key -> createExpensiveGraph(key));

缓存类似于ConcurrentMap,但二者并不完全相同。最基本的区别是,ConcurrentMap保存添加到其中的所有元素,直到显式地删除它们。另一方面,缓存通常配置为自动删除条目,以限制其内存占用。在某些情况下,LoadingCache或AsyncLoadingCache可能很有用,因为它是自动缓存加载的。

Caffeine提供了灵活的结构来创建缓存,并且有以下特性:

  • 自动加载条目到缓存中,可选异步方式
  • 可以基于大小剔除
  • 可以设置过期时间,时间可以从上次访问或上次写入开始计算
  • 异步刷新
  • keys自动包装在弱引用中
  • values自动包装在弱引用或软引用中
  • 条目剔除通知
  • 缓存访问统计

阅读更多


1 2