docker 入门笔记
dockerDocker使用概念: docker就是一个容器,可以类比于Windows上的虚拟机, 别人把image都弄好了传到社区里我们只要pull下来进入容器就可以用了。
显示可用的容器
docker images
删除指定镜像
docker rmi <镜像Id>
下载镜像
docker pull hello-world
不指定版本号默认拉取latest版本的
删除指定镜像
docker rmi <镜像Id>
查看容器
docker ps [OPTIONS]
列出当前正在运行的容器, 结果的第一列是container_Id, 第2列是容器名称.
参数:
a :显示所有的容器,包括未运行的。
f :根据条件过滤显示的内容。
–format :指定返回值的模板文件。
l :显示最近创建的容器。
n :列出最近创建的n个容器。
–no-trunc :不截断输出。
q :静默模式,只显示容器编号。
s :显示总的文件大小。
停止指定的容器
docker stop container_id/container-name
该容器Id或名称可以从docke ...
k8s 日常笔记
k8sK8S学习笔记K8S : 自动化运维管理docker程序
主从架构模型:Master 负责核心调度、管理、运维,Worker(上图的minions)节点则是执行用户程序 所有的Master Node 和Worker Node组成了K8S集群
Master Node
API Server : k8s的请求入口服务
Scheduler : k8s所有的Worker Node的调度器
Controller Manager : k8s所有Worker Node的监控器。有很多具体的controller , 例如Node Controller、Service Controller、Volume Controller 等。 Controller负责监控和调整worker node上部署的服务状态。
Etcd : k8s的存储服务。存储关键配置和用户配置,只能通过API Server才能读写数据。其他组件需要通过APIServer 才能读写数据
Worker Node
Kubelet: Worker Node的监视器和Master Node的通讯器。定期向master汇报自己node上运行服 ...
后台日常笔记
k8ssidecar : istio-proxy
配置docker
后台:整体概念: 处理什么事情 - > 转发、路由(主流怎么用 )->
主要内容后台主要解决的事情
网络包
定时器
存储
网络包从包的生命期开始:来源、解析 、去向
来源
上级服务是如何将包投递过来的
这个过程包的正确性
投递速度
健壮性如何保证(丢包、宕机)
恶意攻击
高负载情况
解析
效率
正确性
校验
完整性
去向
包的下一级如何处理的
如何投递的
具体给谁
与下一级的关系
效率(线程、如果有锁的话粒度如何)
定时器主要关心:精度、追frame
思考方式
需求背景
RabbitMQ 知识库
RabbitMq基础略咯~~ 网上很多的
队列模式RabbitMq队列具备两种模式:default和lazy。在队列声明的时候可以通过x-queue-mode参数来设置队列的模式,取值为default和lazy。
RabbitMQ从3.6.0版本开始引入了惰性队列的概念,即将接受到的消息直接存入文件系统中,而在消费者消费到相应的消息时才会被加载到内存中,它的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储。惰性队列虽然减少了内存的消耗,但是增加了I/O的使用,因此对于持久化的消息,本身就不可避免磁盘I/O,使用惰性队列是较佳的选择。要注意的是,如果惰性队列中存储的是非持久化的消息,重启之后消息一样会丢失。
默认情况下,消息会先存放在内存中,即使是持久化消息也会在内存中驻留一份备份,这部分是由Mq内部的存储结构决定的,后面有写~ 当mq需要释放内存的时候,会将内存中的消息换页(page)到磁盘中,这个操作比较耗时,也会阻塞队列的操作,无法接受新的消息,严重的话甚至会长达几分钟。
官方说明文档:
https://www.rabbitmq.com/lazy-queues.h ...
Shell脚本编写笔记
Shell脚本编写笔记读取外部输入echo -n "enter:" ##-n :不换行
read 存放的变量
控制流 if / while / for读取文件内容
while read line
do
body ##通常对变量line进行处理
done < 文件名
循环n次
while [ $i -lt $num]
do
body
done
判断文件夹不存在的情况:
if [ ! -d "文件夹" ]; then
body
fi
变量使用$变量名
var=$(command) #变量接收命令值
在echo命令中使用变量需要用双引号:
echo "print my $变量"
echo "print my ${变量}"
在shell中,会对双引号里面的内容进行转义,但是对单引号的不会
变量运算let '++i'
let '--i'
函数编写function func(){
body
}
##参数我一般直接用全局变量
## 返回值用echo $? 获取
Awkawk '{[pattern] action}' {filenames}
例子:
aw ...
muduo网络库的实现(1)
概述通过绑定回调函数的办法实现当请求到来的时候可以响应业务代码,避免侵入底层网络库。
常用模型
单线程服务器Reactor模式,其实简单来说就是将非阻塞IO绑定到IO复用模型(epoll,select,poll)上,当有请求到来的时候就通知我们去处理,这是同步的方式。其实有更先进的办法就是Proactor模式,即异步回调。像epoll 这类的IO复用模型都是有事件就会产生通知,但是如何处理,是否读取数据就需要在用户态来执行。Proactor不然,它在调用的时候同时需要传入缓冲区,这样一来当事件发生的时候同时数据也会一并读到用户态缓冲区中,就不用我们再手动去read/recv这样从用户态切换到内核态来进行拷贝,效率更高一些。可惜的是,我在Linux的系统API中并没有发现支持这一模式的API,据说Asio实现了,但是具体没用过。
多线程服务器同样是非阻塞IO,这时候就是每个线程分配一个IO复用模型了。即:one loop per thread. 这里面的loop其实是上述的Reator模型。
一些误区
线程越多越好吗?肯定不是呀。根据不同的应用场景,一昧的提高线程数没有意义,例如并发连 ...
skylu网络库 开发日志
skylu网络库主要参考sylar和handy的实现
时间戳2020-4-25快速浏览一遍github上其他人的网络库实现,挑选出比较适合自己的来进行参考。其中将sylar 的日志模块和配置模块删去一些冗余复杂的内容之后作为自己的日志模块和配置模块。sylar 看了好久他的这两个模块,写的太好了,学到了很多东西,不用实在对不起自己前段时间的学习。
2020-4-26完成内容封装锁、线程池、网络地址、文件管理类等模块。
线程类没有使用c++11的线程,而是用自己封装的Thread类,里面包含锁。通过再构造函数中使用信号量来实现当系统创建完线程后构造函数才会退出。(简单来说就是在构造函数中放一个信号量等待,当线程创建完后发送信号量)
线程池使用安全队列存放task,线程在创建的时候阻塞等待队列不为空的情况。
网络地址抽象了一个地址类,目前只实现了ipv4的地址。
文件管理类主要管理文件句柄,使用单例模式。一般来说,从文件管理类中获取所需要的文件句柄(socket)来进行设置是否阻塞、阻塞IO的超时时间.
后续可以的优化:[ ]线程池可以参考之前实现的线程池、java线程池来完善扩容、缩容[ ...
C++ 11 新特性(1)智能指针(转)
概述众所周知 ,指针是C/C++ 最大的特点,同时也是C/C++ 程序员最头疼的地方,因为你总是会在内存释放、内存泄露这些老生常谈的问题上面出问题,java最受我羡慕的就是它有一个完整的内存管理器,不用我们去头疼内存的管理问题。C++ 中智能指针的出现就是为了缓解我们对于内存管理方面的焦虑。
auto指针从C++98开始便推出了auto_ptr,对裸指针进行封装,让程序员无需手动释放指针指向的内存区域,在auto_ptr生命周期结束时自动释放,然而,由于auto_ptr在转移指针所有权后会产生野指针,导致程序运行时crash。
如下例子:
auto_ptr<int> p1(new int(10));
auto_ptr<int> p2 = p1; //转移控制权
*p1 += 10; //crash,p1为空指针,可以用p1->get判空做保护
C++11 智能指针unique_ptrunique_ptr是auto_ptr的继承者,对于同一块内存只能有一个持有者,而unique_ptr和auto_ptr唯一区别就是unique_ptr不允许赋值操作,也就 ...
翻过那座山,让他们听到你的故事。
2019.11 - 2020.4.15
花了好长时间在准备腾讯的暑假实习,大概第一次 听到是在大二上左右吧,那时候还在培训,听说一个学长说可以暑假进腾讯之后成为正式员工的机会更大。之后就慢慢的一直在发力。
有一说一,他妈的从去年的11月份排球联赛打完后一直准备到3月份,期间放弃了很多玩的机会吧,我还记得大一的时候贼浪,到处玩,到处打球。其实放弃这些东西感觉没那么难,因为之前就已经慢慢的对这些东西失去了热情。2月份的时候感觉是我进步最多的时候,我看了很多视频,将数据结构、算法这些基础的东西巩固得更深,回来的时候从学校借的书也派上了用场,我都是当工具书查阅,没有完全看过(除了深入探索C++模型,神书啊~)。越学越觉得学不完,太多了。再加上刷牛客上面的面经帖,看着好多都不懂,焦虑了吧。
后面慢慢发现,很多面经是研究生、应届毕业生的,我是找实习的,问的问题不会到这么难的程度。之后我就看本科实习生的面经,难度果然一下子下降了很多。慢慢的,保持一天一道leetcode medium,完善项目 时间也过得很快。
下面是干货说说春招实习的结果吧,真的就海投大厂,双非真的真的很难,并不是难在技术 ...
高性能服务器框架 (1)日志模块
github地址: https://github.com/sylar-yin
UML类图
详解首先整个日志模块主要分为Logger、LogEvent、LogAppender、LogFormatter四个器件,是不是和log4j很像,没错,sylar 就是仿log4J设计的。如果了解log4J的代码的话可以跳过了。
首先整体就是Logger存储日志等级(Level)、格式(Formatter)以及输出的位置(Appender)这些信息,调用log()这个方法格式输出到Appender所实现的子类中。但是调用log()需要LogEvent作为传入参数。而LogEvent的作用是通过stringstream字符串流获得输入内容,既可以直接<<输入也可以调用format()方法进行格式化输入(类似于printf(“%d”,i)这样)。
接下来分部分来看。
LogFormatter这个是格式器。主要就是用来对对每个格式进行format格式解析的。
构造函数中必须传入一个string 来初始化m_pattern,m_pattern就是输出的格式,之后会在init()方法中对m_pa ...
10分钟快速 学会UML 类图 (附视频)
觉得看文字比较费解的可以看视频视频地址:https://www.bilibili.com/video/BV1P741127u7from=search&seid=3523200275187714663
UML类图统一建模语言(Unified Modeling Language,缩写UML)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。
属性的表示方法+: 表示为public-: 为private
: 为protected~:表示packetage 比较少用
我们要在一个类中表示返回值等等内容:
依样画葫芦就可以了。对于接口一般用斜体表示,static函数 下面加一个下划线。
关系这部分比较重要,下面介绍 关联、泛化(继承)、聚合、组合、依赖和实现这几种关系
注意看箭头方向
关联关联就是强调两个类之间的联系,关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A。我觉得只要是成员变量的关系就会存在一个关联关系。
泛化就是继承,如上 ...
cmake 编写 从实战中学习
cmake关于cmake 和make 的区别以及什么是cmake这里就不赘述了
实战下面是我学习sylar 大佬的框架课程中日志模块部分,他写的一个cmake 文件。
其中文件的目录结构为:
bin –二进制build – 中间文件路径cmake – cmake 函数文件夹CMakeLists.txt – cmake 的定义文件lib – 库的输出路径sylar – 源代码路径tests – 测试代码路径
cmake_minimum_required(VERSION 2.8) # 指定使用的版本
project(sylar) # 项目名称 一般和项目文件夹相对应
set(CMAKE_VERBOSE_MAKEFILE ON) # 显示编译的过程
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -rdynamic -O0 -ggdb -std=c++11 -Wall -Wno-deprecated -Werror -Wno-unused-function") # 设置 编译选项 set 设置变量的意思
set(LIB_SRC
sylar/lo ...