叶笋的博客

  • 主页

  • 标签

  • 分类

  • 归档

我的技能树

Posted on 2019-07-01 | In 个人

技能树

  • 编程基础
    • 版本控制
      • Git
  • 后端
    • 语言
      • Node.js
    • 包管理
      • NPM(Node.js)
    • 框架
      • Koa(Node.js)
      • express(Node.js)
      • egg(Node.js)
      • LoopBack(Node.js)
    • 数据库
      • 关系型数据库
        • MySQL
      • 非关系型数据库
        • MongoDB
    • Web Server
      • Nginx
  • 运维

关于测试

Posted on 2019-06-19 | In 技术

压力测试

ApacheBench

  • 关于压力测试
    • 吞吐量
    • 用户平均等待时间
    • 服务器平均等待时间
  • 关于ab的connect time
    • Connect :socket链路建立消耗,代表网络状况好坏
    • Processing :写入缓冲区消耗+链路消耗+服务端消耗+读取数据消耗
    • Waiting :写入缓冲区消耗+链路消耗+服务端消耗
    • Total :单个事务总时间

算法笔记

Posted on 2019-06-18 | Edited on 2019-07-01 | In 技术 , 笔记

栈和队列

重点

  1. 了解 FIFO 和 LIFO 处理顺序的原理
  2. 实现这两个数据结构
  3. 熟悉内置的队列和栈结构
  4. 解决基本的队列相关问题,尤其是 BFS
  5. 解决基本的栈相关问题
  6. 理解当你使用 DFS 和其他递归算法来解决问题时,系统栈是如何帮助你的。
  • 队列
    • 定义
    • 实现
    • 循环队列 实现
    • BFS 实现 如何避免无限循环 作用:遍历,求最短路径
    • BFS 注意深度需要靠统计每一层的size来辅助计算
  • 栈
    • 实现 用法
    • 最小栈 留意栈的特性 LIFO
    • 单调栈
    • DFS 作用:查找从跟节点到目标节点的路径
    • BFS和DFS的区别:遍历顺序不同
    • 计算DFS空间复杂度时,考虑系统栈
    • 使用递归实现DFS时,递归深度太高将导致栈溢出,优先使用显示栈实现DFS

哈希表

哈希表分为:哈希集合(非重复值) 哈希映射(键值对)

重点

  1. 哈希表的原理是什么?
  2. 如何设计哈希表?
  3. 如何使用哈希集合来解决与重复相关的问题?
  4. 如何使用哈希映射按键聚合信息?
  5. 如何在使用哈希表时设计正确的键?
  • 哈希表原理: 哈希函数将键映射到存储桶
  • 设计哈希表的关键
    • 哈希函数(散列函数)
      • 键值的范围
      • 桶的数量
    • 冲突解决
      • 冲突小 数组
      • 冲突大 高度平衡的二叉树
      • 删除时 从数组中删除i位置的元素 将时间复杂度从O(n)降为O(1)的两种方法: 1.交换 2.链表
  • 复杂度分析
  • 内置哈希表的原理
    • 利用高度平衡的二叉树将数据量大的桶的插入和搜索复杂度从O(n)降到O(logN)

数组和字符串

重点

  1. 了解数组和动态数组之间的区别
  2. 熟悉数组和动态数组中的基本操作
  3. 理解多维数组并能够掌握二维数组的使用
  4. 明白字符串的概念以及字符串所具有的不同特性
  5. 能够运用双指针技巧解决实际问题

待总结

  • 二叉树的前序中序后序遍历

node笔记

Posted on 2019-04-15 | In 技术 , 笔记

关于node中的几种路径问题

  • __dirname返回被执行文件的目录(绝对路径)
  • __filename返回被执行文件的路径(绝对路径)
  • process.cwd()返回当前工作目录的路径
  • 相对路径在require中相对于被执行文件的位置,在其他情况下,如readFile,相对于当前工作目录的位置

sql笔记

Posted on 2019-04-09 | Edited on 2019-04-11 | In 技术 , 笔记
  • truncate用法
  • join七种用法
  • distinct用法
  • create function用法

node内存泄漏如何定位

Posted on 2019-04-09 | In 技术

目标

定位内存泄漏问题,一般方案就是找那些不被使用又不会被释放的变量,处理了这些变量,问题一般就可以解决了。

重现问题的方法

  • --expose-gc
  • global.gc()
  • process.memoryUsage().heapUsed

微服务架构

Posted on 2019-04-08 | Edited on 2019-04-09 | In 技术 , 笔记

微服务定义

  • 六个特点
    • 一小组服务
    • 独立进程
    • 轻量级通信
    • 基于业务能力
    • 独立部署
    • 无集中式管理
  • 定义
    • 松散耦合
    • soa
    • bounded context

微服务的利弊

  • 利
    • 强模块化边界
    • 可独立部署
    • 技术多样性
  • 弊
    • 分布式复杂度
    • 最终一致性
    • 运维复杂性
    • 测试复杂性

康威法则

设计系统的组织,其产生的设计和架构,等价组织的组织架构。

微服务架构的适用性

  • 考虑生产力和系统复杂度
  • 单块优先

微服务组织架构

  • End-end ownership
  • 跨职能微服务产品团队 -> API <- 平台团队

微服务中台

  • 业务前台
    • 应用: web app ( 渠道: 第三方接入 )
  • 业务中台
    • 核心业务层
  • 技术中台

    • PaaS云平台: 应用监控 持续交付 服务框架 资源调度 后台服务 ( 大数据 AI )
    • IaaS云平台: 计算 存储 网络 监控 安全 IDC
  • 大中台小前台

服务分层(逻辑)

  • 外部设备
  • 微服务(SOA)
    • 聚合服务(适配服务 边界服务): Web BF, Mobile BFF, Pubilc BFF
    • 基础服务(核心领域服务 公共服务 中间层服务)

微服务技术架构体系

  • 接入层
    • 外部+内部 LB
  • 网关层
    • 作用:反向代理 限流熔断
    • 组成:内部GW H5GW 无线GW 第三方GW 开放平台GW
  • 业务服务层
    • 聚合服务 基础服务
  • 支撑服务
    • 组成:注册发现 集中配置 容错限流 认证授权 日志聚合 监控告警 后台服务
  • 平台服务
    • 组成:发布系统 集群资源调用 镜像治理 资源治理 IAM
  • 基础设置
    • 计算 网络 存储 NOC监控 安全 IDC
  • 六层体系中的纵向能力
    • 微服务开发框架
    • 持续交付流水线
    • 端到端工具链
    • 工程实践与规范

服务发现机制

三种主流服务发现模式

  • 传统LB模式
    • DNS –Discover–> Consumer –Invoke–> Load Balancer –Load Balancing Invoke–> Service Provider
  • 进程内LB模式
    • Service Registry –Discover–> Consumer(LB) –Load Balancing & Invoke–> ServiceProvider –Registry & Keep Alive–> Service Registry
  • 主机独立LB模式
    • Service Registry –Discover–> Host( Consumer -> LB ) –Load Balancing & Invoke–> ServiceProvider –Registry & Keep Alive–> Service Registry

网关

  • 四项基本功能
    • 反向路由
    • 安全认证
    • 限流熔断
    • 日志监控

网关架构

Http Request -> pre filters -> router filters -> origin server -> router filters -> post filters -> Http Response

路由发现体系

  • 服务注册中心 -> 服务治理

配置中心

  • 统一配置
  • 动态配置
  • Config Server -> Service

微服务中两种典型通信方式

RPC REST
耦合性 强耦合 松散耦合
消息协议 二进制 thrift,protobuf 文本 xml, json
通讯协议 TCP HTTP/HTTP2
性能 高 一般低于RPC
接口契约IDL thrift,protobuf IDL swagger
客户端 强类型客户端,一般自动生成,多语言 一般HTTP客户端可访问,可自动生成强类型客户端,多语言
案例 Dubbo,motan,Tars,grpc,thrift spring mvc/boot, Jax-rs,drop wizard
开发者友好 客户端比较方便,但二进制消息不可读 文本消息开发者可读
对外开放 对外一般需要转换成REST/文本协议 直接可以对外开放

微服务框架和治理

  • 服务注册发现
  • 负载均衡、软路由
  • 日志
  • Metrics
  • 调用链埋点
  • 限流熔断
  • 安全&访问控制
  • REST/RPC
  • 序列化 xml/json/二进制
  • 代码生成
  • 统一异常处理
  • 文档
  • 配置集成
  • 后台服务集成 DB/MQ/Cache

微服务分层监控和架构

  • 监控分层
    • 技术设施监控
      • 网络 交换机
      • 网络流量 丢包 错包 连接数
    • 系统层监控
      • 物理机 虚拟机 os
      • cpu memory network disk
    • 应用层监控
      • url service sql cache可用率 响应时间 qps
    • 业务监控
      • 登录 注册 下单 支付
    • 端用户体验监控
      • 性能 返回码 城市 地区 运营商 版本 系统
  • 监控点
    • 日志监控
    • Metrics监控
    • 健康检查
    • 调用链监控
    • 告警系统
  • 监控架构
    • 微服务 agent -> kafka
    • kafka –log–> ELK
    • kafka –metrics–> Influx DB/Grafana

微服务调用链监控

  • 调用链监控原理:span tree
  • 开源工具:CAT、Zipkin、Pinpoint

微服务限流熔断

  • 核心概念
    • 熔断
    • 隔离
    • 限流
    • 降级
  • 了解Hystrix如何实现限流熔断

容器部署 持续交付 发布模式

  • 容器的优势
    • 解决环境一致性问题
    • 镜像部署
  • 持续交付流水线
    • git –Jenkins 构建 单元测试 打镜像–> 镜像治理中心(docker registry)
    • 测试环境 –> UAT环境 –> 生产环境(蓝绿/灰度部署)
  • 蓝绿部署、灰度部署

容器调度以及基于容器的发布体系

  • mesos容器调度
    • ZooKeeper –> Master Leader/Master Standby
    • Master Leader –> Slave
  • 发布体系

js设计模式

Posted on 2019-04-06 | Edited on 2019-04-08 | In 技术 , 笔记

Constructor(构造器)模式

1
2
3
4
5
6
7
8
9
10
11
function Person(name, age) {
this.name = name;
this.age = age;
}

Person.prototype.sleep = function() {
return 'zzzzzzzzz';
};

let wangys219 = new Person('wangys219', 219);
console.log(wangys219.sleep());
  • sleep()在所有Person对象间共享

Module(模块)模式

js中实现模块的方法

  • 对象字面量
  • Module模式
  • AMD模块
  • CommonJS模块
  • ECMAScript Harmony模块

对象字面量

1
2
3
4
let someObjectLiteral = {
variableKey: variableValue,
functionKey: function () {},
};

Module模式

1
2
3
4
5
6
7
8
9
10
11
12
13
let someNamespace = (function () {
// 私有变量
let somePrivateVariableKey = variableValue;
// 私有方法
let somePrivateMethod = function () {};

return {
// 公有变量
somePublicVariableKey: variableValue,
// 公有方法
somePublicMethod: function () {},
};
})();

Module模式变化

引入混入

1
2
3
let someModule = (function (module1, module2...) {

})(module1, module2...);

优缺点

  • 优点
    • 支持私有成员
  • 缺点
    • 私有成员无法测试

Revealing Module(揭示模块)模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let someRevealingModule = (function () {
// 私有成员
let somePrivateVariableKey = somePrivateVariableValue;
// 私有方法
function somePrivateMethod () {}
// 公有成员
let somePublicVariableKey = somePublicVariableValue;
// 公有方法
function somePublicMethod () {}

return {
// 公有指针
publicCursor1: somePublicVariableKey,
publicCursor2: somePublicMethod,
};
})();

优缺点

  • 优点
    • 可读性高?

Singleton(单例)模式

1
2
3
4
5
6
7
8
9
10
11
12
13
let someSingleton = (function () {
let instance;

function init () {}

return {
getInstance: function () {
if (!instance) instance = init();

return instance;
},
};
})();

Observer(观察者)模式

  • Subject(目标): 维护一系列观察者,添加删除观察者
  • Observer(观察者): 为那些在目标状态发生改变时需获取通知的对象提供更新接口
  • ConcreteSubject(具体目标): 状态发生改变时,向Observer发出通知,储存ConcreteObserver的状态
  • ConcreteObserver(具体观察者):

redis知识点记忆速查

Posted on 2019-04-05 | Edited on 2019-04-06 | In 技术 , 笔记
  • Redis -> REmote DIctionary Server
  • Redis三个特点

    • 支持数据持久化
    • 支持string,list,set,zset,hash
    • 支持master-slave模式数据备份
  • 启动redis

    1
    $ redis-server &
  • 查看redis是否启动

    1
    $ ps -ef | grep redis
  • 关闭redis

    1
    redis-cli> shutdown
  • 连接redis

    1
    $ redis-cli -h host -p port -a password
  • redis配置

    • 修改配置的两种方式
      • 修改redis.conf
      • 通过redis-cli config get config set
  • redis数据类型

    • string
      • 命令 set get
    • hash
      • 命令 hmset hget
    • list
      • 命令 lpush lrange
    • set
      • 命令 sadd smembers
    • zset
      • 命令 zadd key score member
  • redis键命令
    • DEL key
    • DUMP key
    • EXISTS key
    • EXPIRE key seconds
    • EXPIREAT key timestamp
    • PEXPIRE key milliseconds
    • PEXPIREAT key milliseconds-timestamp
    • KEYS pattern
    • MOVE key db
    • PTTL key
    • TTL key
    • RANDOMKEY
    • RENAME key newkey
    • RENAMENX key newkey
    • TYPE key
  • string命令
    • SET key value
    • GET key
    • GETRANGE key start end
    • GETSET key value
    • GETBIT key offset
    • MGET key [key2..]
    • SETBIT key offset value
    • SETEX key seconds value
    • SETNX key value
    • SETRANGE key offset value
    • STRLEN key
    • MSET key value [key value …]
    • MSETNX key value [key value …]
    • PSETEX key milliseconds value
    • INCR key
    • INCRBY key increment
    • INCRBYFLOAT key increment
    • DECR key
    • DECRBY key decrement
    • APPEND key value
  • hash命令
    • HDEL key field1 [field2]
    • HEXISTS key field
    • HGET key field
    • HGETALL key
    • HINCRBY key field increment
    • HINCRBYFLOAT key field increment
    • HKEYS key
    • HLEN key
    • HMGET key field1 [field2..]
    • HMSET key field1 value1 [field2 value2 …]
    • HSET key field value
    • HSETNX key field value
    • HVALS key
    • HSCAN key cursor [MATCH pattern] [COUNT count]
  • list命令
    • BLPOP key1 [key2 ] timeout
    • BRPOP key1 [key2 ] timeout
    • BRPOPLPUSH source destination timeout
    • LINDEX key index
    • LINSERT key BEFORE|AFTER pivot value
    • LLEN key
    • LPOP key
    • LPUSH key value [value2 ]
    • LPUSHX key value
    • LRANGE key start stop
    • LREM key count value
    • LSET key index value
    • LTRIM key start stop
    • RPOP key
    • RPOPLPUSH source destination
    • RPUSH key value [value2 ]
    • RPUSHX key value
  • set命令
    • SADD key member1 [member2 …]
    • SCARD key
    • SDIFF key1 [key2 …]
    • SDIFFSTORE destination key1 [key2 …]
    • SINTER key1 [key2 …]
    • SINTERSTORE destination key1 [key2 …]
    • SISMEMBER key member
    • SMEMBERS key
    • SMOVE source destination memeber
    • SPOP key
    • SRANDMEMBER key [count]
    • SREM key member1 [member2 …]
    • SUNION key1 [key2 …]
    • SUNIONSTORE destination key1 [key2 …]
    • SSCAN key cursor [MATCH pattern] [COUNT count]
  • zset命令
    • ZADD key score1 member1 [score2 memeber2 …]
    • ZCARD key
    • ZCOUNT key min max
    • ZINCRBY key increment member

node后端开发灵魂n问

Posted on 2019-04-05 | Edited on 2019-04-08 | In 技术

引子

Q1: 服务端逻辑那么紧密,如何hold住?

Q2: 服务端跟其他系统之间的耦合,如何hold住?

Q3: 请求量太大天天挂如何解决?

Q4: IO瓶颈了如何搞定?

Q5: 缓存该怎么用?

Q6: 应用架构如何设计?

Q7: 分层如何设计?

Q8: 数据库如何优化?

Q9: 代码如何调试?

关于代码调试可查阅官方调试指南

Q10: 如何分析内存泄漏?

Q11: 单元测试写没写过?

Q12: HTTP原理了解多少?

Q13: Nginx配置服务器部署知道几何?

Q14: 性能监控跟踪以及优化

12

wangys219

12 posts
4 categories
12 tags
© 2019 wangys219
Powered by Hexo v3.8.0
|
Theme – NexT.Muse v7.0.1