学习是一种快乐, 学习是一种未来, 学习带给你未来竞争力

人生路上, 工作路上跑第一,第一梯队, 才有竞争力! 如何办到,合理抢跑是诀窍, 抢跑还得合理才行, 若能在小学或者初中阶段让孩子学会大学毕业后工作中要用的知识和技能, 就可以达到合理抢跑的目标,我们开辟了0基础java编程培训系列课程, 邀请您免费试听, 满意再报名。先到先跑,领先更多!人生路上跑第一?容易?看下面合理抢跑 是秘诀

20年开发经验一线程序员 专注6-16岁青少年编程培训

讲故事学编程,让孩子爱上编程

 

少儿编程时代已经到来

为什么要学编程?
222 333 555 666
提升逻辑思维能力
了解程序思维
了解计算机工作原理
为未来埋下种子
面向过程分析
提升问题分析能力
面向未来
提高未来竞争力

 

循序渐进螺旋式课程体系

自然进阶,效果更出众 999

20年互联网开发工程师授课,讲故事方式教授,交互式指导

实战派讲师授课,想学不会都难!

成果展示

小学员真实案例作品
  

我们的优势

为什么选择快乐成长?

55 22 33
讲故事式授课
讲授基础原理
20年专业开发经验
从未来从业方向讲授
交互式
分阶段教学

优惠活动     课程体系    详细信息
 

儿童计算机编程

孩子是我们的希望, 他们的未来就是我们的未来
让他们有竞争力, 才是自己有竞争力, 那么编程从孩子抓起,也许是个好主意, 很多地方都已经在行动了, 都在孩子阶段开始学习了编程, 我们绝对不能落后!
我们说不要孩子输在起跑线上, 我们要合理抢跑,赢在起跑线

Helm 从入门到实践

  categories:资料  author:

一、概述

Helm 是 Kubernetes 的软件包管理工具。本文需要读者对 Docker、Kubernetes 等相关知识有一定的了解。 本文将介绍 Helm 中的相关概念和基本工作原理,并通过一些简单的示例来演示如何使用Helm来安装、升级、回滚一个 Kubernetes 应用。

Helm 是什么??

Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。

Helm 解决了什么痛点?

在 Kubernetes中部署一个可以使用的应用,需要涉及到很多的 Kubernetes 资源的共同协作。比如你安装一个 WordPress 博客,用到了一些 Kubernetes (下面全部简称k8s)的一些资源对象,包括

阅读全文

10 个 Linux 中最好的 Visio 替代品

  categories:资料  author:

如果你正在 Linux 中寻找一个好的 Visio 查看器,这里有一些可以在 Linux 中使用的微软 Visio 的替代方案。

微软 Visio[1] 是创建或生成关键任务图和矢量表示的绝佳工具。虽然它可能是制作平面图或其他类型图表的好工具 —— 但它既不是免费的,也不是开源的

此外,微软 Visio 不是一个独立的产品。它与微软 Office 捆绑在一起。我们过去已经看过 MS Office 的开源替代品[2]。今天我们将看看你可以在 Linux 上使用哪些工具代替 Visio。

适用于 Linux 的最佳 微软 Visio 备选方案

用于 Linux 的微软 Visio 备选方案

用于 Linux 的微软 Visio 备选方案

此处为强制性免责声明。该列表不是排名。排名第三的产品并不比排名第六的好。

阅读全文

DNS BIND之直接域名、泛域名与子域

  categories:资料  author:

本节将主要针对常用的几种特殊(直接域名、泛域名与子域)的域名解析记录介绍。

一、直接域名

许多用户有直接使用域名访问Web网站的习惯,即在浏览器中不输入www等主机名,而是直接使用如http://baidu.com/或http://csdn.net/等域名来访问。然而,并不是所有的Web网站都支持这种访问方式,只有DNS服务器能解析直接域名的网站才可以使用。可以在csdn.net区域文件中加入以下内容实现直接域名解析。
csdn.net.               600     IN      A       114.112.73.194


此时,域名csdn.net可以解析为114.112.73.194,与www.csdn.net域名的解析结果一样,配置如下:
www.csdn.net.               600     IN      A       114.112.73.194
csdn.net.                600     IN      A       114.112.73.194


二、泛域名

如果在shop.taobao.com中加入以下语句,还可以实现一种泛域名的效果。
*.shop.taobao.com.      1800    IN      CNAME   shop.taobao.com.

泛域名是指一个域名下的所有主机和子域名都被解析到同一个地址上。在以上配置中,所有以”.shop.taobao.com”为后缀的域名的地址都将解析为shop.taobao.com。另外,默认情况下泛域名解析的优先级最高,如果区域文件中存在其他主机的资源记录,它们都将失效。图中所示的是泛域名的测试结果。

从图中可以看到,不管采用什么样的主机名,只要后缀是”.shop.taobao.com”,地址都将解析为shop.taobao.com。
三、子域
子域(Subdomain),是域名层次结构中的一个术语,是对某一个域进行细分时的下一级域。例如,shop.taobao.com是一个顶级域名,可以把aaa.shop.taobao.com配置成是它的一个子域。配置子域可以有两种方式,一种是把子域配置放在另一台DNS服务器上,还有一种是子域配置与父域配置放在一起,此时也称为虚拟子域。

配置如:

  1. $ORIGIN shop.taobao.com.
  2. *.shop.taobao.com.      1800    IN      CNAME   shop.taobao.com.

转至:http://book.51cto.com/art/200912/169363.htm… 阅读全文

BookKeeper 原理浅谈

  categories:资料  author:

接着之前的一篇文章 BookKeeper 集群搭建及使用,本文是 BookKeeper 系列的第二篇,短期来看应该也是最后一篇,本篇文章主要聚焦于 BookKeeper 内核的实现机制上,会从 BookKeeper 的基本概念、架构、读写一致性实现、读写分离实现、容错机制等方面来讲述,因为我并没有看过 BookKeeper 的源码,所以这里的讲述主要还是从原理、方案实现上来介绍,具体如何从解决方案落地到具体的代码实现,有兴趣的可以去看下 BookKeeper 的源码实现。

BookKeeper 基础

正如 Apache BookKeeper 官网介绍的一样:A scalable, fault-tolerant, and low-latency storage service optimized for real-time workloads。BookKeeper 的定位是一个可用于实时场景下的高扩展性、强容错、低延迟的存储服务。Pulsar-Cloud Native Messaging & Streaming – 示说网 中也做了一个简单总结:

  1. 低延迟多副本复制:Quorum Parallel Replication;
阅读全文

RabbitMQ的应用场景以及基本原理介绍

  categories:资料  author:

1.背景

RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现。

2.应用场景

2.1异步处理

场景说明:用户注册后,需要发注册邮件和注册短信,传统的做法有两种1.串行的方式;2.并行的方式
(1)串行方式:将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有必要等待的东西.
这里写图片描述
(2)并行方式:将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个任务完成后,返回给客户端,并行的方式能提高处理的时间。
这里写图片描述
假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处理时间,但是,前面说过,邮件和短信对我正常的使用网站没有任何影响,客户端没有必要等着其发送完成才显示注册成功,英爱是写入数据库后就返回.
(3)消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处理
这里写图片描述
由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,响应时间是串行的3倍,是并行的2倍。

2.2 应用解耦

场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口.
这里写图片描述
这种做法有一个缺点:

  • 当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱^ ^)
  • 订单系统和库存系统高耦合.
    引入消息队列
    这里写图片描述
  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
  • 库存系统:订阅下单的消息,获取下单消息,进行库操作。
    就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了).

流量削峰

流量削峰一般在秒杀活动中应用广泛
场景:秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
作用:
1.可以控制活动人数,超过此一定阀值的订单直接丢弃(我为什么秒杀一次都没有成功过呢^^)
2.可以缓解短时间的高流量压垮应用(应用程序按自己的最大处理能力获取订单)
这里写图片描述
1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.
2.秒杀业务根据消息队列中的请求信息,再做后续处理.

3.系统架构

这里写图片描述
几个概念说明:
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息的载体,每个消息都会被投到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing

阅读全文

RabbitMQ 作用及模式

  categories:资料  author:

RabbitMQ 作用

你好! 你知道RabbitMQ是什么吗,是干什么用的呢,就让我们来学习一下吧。

1.什么是RabbitMQ

RabbitMQ采用了AMQP高级信息消息队列协议的一种消息对列技术,特点就是消费并不需要确保提供方的存在,大大的实现了对服务之间的高度解耦

2.为什么要用RabbitMQ

1.在分布式系统下具备异步,削峰,负载均衡等一系列的功能。
2.拥有持久化的机制,进程信息,队列中的信息也可以保存下来。
3.实现消费者和生产者之间的解耦。
4.可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。
  • 3.使用场景
1. 服务见异步通信
2. 顺序消费
3. 定时任务
4. 请求削峰
  • 1
  • 2
  • 3
  • 4

4.如何确保消息正确地发送至RabbitMQ? 如何确保消息接收方消费了消息

发送方:
将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
  • 1
  • 2

一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。
如果RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(not acknowledged,未确认)消息。
发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。
接受方:
接收方消息确认机制:消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。保证数据的最终一致性;
下面罗列几种特殊情况:
如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,然后重新分发给下一个订阅的消费者。(可能存在消息重复消费的隐患,需要去重)
如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,将不会给该消费者分发更多的消息。

阅读全文

RabbitMQ快速入门(详细)

  categories:资料  author:

在介绍RabbitMQ之前,我们先来看下面一个电商项目的场景

  • 商品的原始数据保存在数据库中,增删改查都在数据库中完成。
  • 搜索服务数据来源是索引库(Elasticsearch),如果数据库商品发生变化,索引库数据不能及时更新。
  • 商品详情做了页面静态化处理,静态页面数据也不会随着数据库商品更新而变化。

如果我们在后台修改了商品的价格,搜索页面和商品详情页显示的依然是旧的价格,这样显然不对。该如何解决?  

我们可能会想到这么做:

  • 方案1:每当后台对商品做增删改操作,同时修改索引库数据及更新静态页面。
  • 方案2:搜索服务和商品页面静态化服务对外提供操作接口,后台在商品增删改后,调用接口。

这两种方案都有个严重的问题:就是代码耦合,后台服务中需要嵌入搜索和商品页面服务,违背了微服务的独立原则。

这时,我们就会采用另外一种解决办法,那就是消息队列

商品服务对商品增删改以后,无需去操作索引库和静态页面,只需向MQ发送一条消息(比如包含商品id的消息),也不关心消息被谁接收。 搜索服务和静态页面服务监听MQ,接收消息,然后分别去处理索引库和静态页面(根据商品id去更新索引库和商品详情静态页面)。

什么是消息队列

MQ全称为Message Queue,即消息队列。“消息队列”是在消息的传输过程中保存消息的容器。它是典型的:生产者、消费者模型。生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,这样就实现了生产者和消费者的解耦。

 

开发中消息队列通常有如下应用场景:

1、任务异步处理:

高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。减少了应用程序的响应时间。

2、应用程序解耦合

MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。

 

AMQP和JMS

MQ是消息通信的模型,并发具体实现。现在实现MQ的有两种主流方式:AMQP、JMS。

两者间的区别和联系:

  • JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
  • JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
  • JMS规定了两种消息模型;而AMQP的消息模型更加丰富

常见MQ产品

阅读全文

Pulsar初入门(一)

  categories:资料  author:

Pulsar初入门(一)


参考–Apache-Pulsar官网—http://pulsar.apache.org/

-选择pulsar而不是Kafka的7个原因—https://kafkaesque.io/7-reasons-we-choose-apache-pulsar-over-apache-kafka/

-选择pulsar而不是Kafka的7个原因–infoQ中文版–https://baijiahao.baidu.com/s?id=1634132982881230076&wfr=spider&for=pc

-推荐阅读—–CSDN网友/Pulsar官网文档翻译计划参与者–稀有气体–Kafka的时代已经过去了,未来是Pulsar的吗?等系列文章

简介:

Apache Pulsar是一个开源的分布式的pub-sub消息系统,最初是雅虎创建的,现在是Apache Software Foundation的一部分。

关于pulsar:

1.pulsar函数,使用开发人员友好的API部署轻量级计算逻辑,无需运行自己的流处理引擎

2.低延迟,耐用-设计用于大规模的低延迟发布(<5ms),具有强大的耐用性保障

3.持久存储,基于Apache Bookkeeper的持久消息存储。提供写和读操作之间的IO隔离。

4.生产中证明,Pulsar在雅虎生产超过3年,每秒百万条消息设计百万个主题

5.地域复制,跨地理位置,异地数据中心复制支持

6.客户端库。灵活的消息传递模型,支持java,c++,py,Go

7.水平扩展,水平无缝扩展到数百万个节点

8多租户,原生支持多租户,支持隔离,验证,授权和配额

9可操作性,REST Admin API ,用于配置管理,工具和监视。可以部署在本地和k8s上。

tips:

>多种订阅模式(独占,共享和failover)–默认独占

>broker无状态

>数据老化时,分层存储可以将数据从hot  /   warm存储卸载到cold  /  longterm存储(s3,GCS)

架构:

èå²æç»æå¾

一、Messaging Concepts(消息概念)

pulsar基于pub-sub模式,类似于Kafka(支持点对点和pub-sub)和其它的消息系统。

Messages是Pulsar的基本”单位“,它们是生产者向主题发布的内容以及消费者随后从主题中消费多的内容(并在消息处理时确认)。Messages类似于邮政系统中的信件。

Pulsar的消息构成
Component Purpose
阅读全文

Slf4j MDC 使用和 基于 Logback 的实现分析

  categories:资料  author:

前言

如今,在 Java 开发中,日志的打印输出是必不可少的,Slf4j + LogBack 的组合是最通用的方式。

关于 Slf4j 的介绍,请参考本博客http://ketao1989.github.io/posts/Java-slf4j-Introduce.html

有了日志之后,我们就可以追踪各种线上问题。但是,在分布式系统中,各种无关日志穿行其中,导致我们可能无法直接定位整个操作流程。因此,我们可能需要对一个用户的操作流程进行归类标记,比如使用线程+时间戳,或者用户身份标识等;如此,我们可以从大量日志信息中grep出某个用户的操作流程,或者某个时间的流转记录。

因此,这就有了 Slf4j MDC 方法。

Slf4j MDC 介绍

MDC ( Mapped Diagnostic Contexts ),顾名思义,其目的是为了便于我们诊断线上问题而出现的方法工具类。虽然,Slf4j 是用来适配其他的日志具体实现包的,但是针对 MDC功能,目前只有logback 以及 log4j 支持,或者说由于该功能的重要性,slf4j 专门为logback系列包装接口提供外部调用(玩笑~:))。

logback 和 log4j 的作者为同一人,所以这里统称logback系列。

先来看看 MDC

阅读全文

软件测试基础知识整理

  categories:资料  author:

一、软件测试工程师须知

良好的沟通和表达能力
具有怀疑与破坏的精神
扎实的软件测试基础知识
缜密的业务逻辑分析能力
处在用户的角度进行换位思考
足够的耐心、细心、信心、责任心
积极乐观向上的心态和团队协作能力
要有严谨、敢于承担责任、稳重的做事风格
善于自我总结、自我督促和不断学习的能力

二、软件测试职业规划 & 转职

产品总监(ProductOwner)

项目经理 (ProjectManager) / 技术经理 (Technical Manager)
QA (Quality Assurance) 或者法律法规部门
测试开发 (TestingDeveloper)
(领域)业务专家 (BusinessExpert )

手工测试(Manual testing)唯一和最后的出路,但此路其实很光明

销售( Sales )
售后技术支持 (TechnicalSupport Engineer)
运营 (Operation)
培训师 
阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1