自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 微服务的概念、优缺点和一些使用过的思考

什么是微服务?最早没有参加过工作的时候,不太理解微服务是什么。毕竟之前自己做的项目都比较小,还没有到“单体地狱”那么麻烦的程度。后面参加工作,经历了40多后端服务搭建成的一个产品线,突然就理解微服务的概念了。服务本身是一个小巧但是功能齐全的应用程序,它实现的是一组相关功能,比如订单管理,身份识别,用户中心等等。这些服务可以根据需求进行用例部署层面的实例扩展,或者是使用路由将请求发给不同namespace的服务。微服务的理念就是 将服务拆分为一组服务的架构风格微服务的特点服务直接都是松耦合的

2021-04-10 15:42:21 227

原创 k8s的helm

之前部署一个应用的基本过程编写yaml文件使用deployment暴露端口建立Service服务Ingress:负载均衡缺点如果是部署单一应用,或者是少数的应用服务的情况下,使用这种方法是比较合适的当有些应用场景比如微服务,在这种情况下可能会有几十个服务,每个服务都有一套yaml文件,这样就会导致需要维护大量的yaml文件,即便是做一个版本管理在这种情况下也会特别的不方便。helm介绍helm是一个k8s的包管理工具,就像Linux下的包管理器,图yum/apt等,可以很方便的将之前

2020-10-19 17:34:58 250

原创 leetcode刷题之76.最小覆盖子串

题目给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。tag:Sliding windowdiffculty:Hard示例输入:S = “ADOBECODEBANC”, T = “ABC”输出:“BANC”难点如何确定这些元素都在win当中?如何去缩减这些元素?最开始的思路【弃】使用一个hash表来存储这些旧元素的位置,然后如果这些元素都有位置了,表面当前window里面都存在这些元素

2020-10-15 18:35:10 298

原创 leetcode刷题之424.替换后的最长重复字符

题目给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。注意:字符串长度 和 k 不会超过 104。输入:s = “ABAB”, k = 2输出:4解释:用两个’A’替换为两个’B’,反之亦然。思路这道题我第一次做类似的,并没有什么头绪。于是借鉴了评论区的一个solution,大神写的很清楚。这个思路和求字符串中最长连续子串的思路差不多,只是关键的一些判断条件有改变。当出现较

2020-10-14 12:23:41 243

原创 leetcode刷题之3.无重复字符的最长子串

题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。分析这道题目和昨天做的239滑动窗口最大值在解法上的思路有相同的地方,那道题使用的是deque来完成的,这道题目使用set和index来完成

2020-10-13 18:32:27 129

原创 k8s中service和secret

Service存在意义防止pod失联,基于服务发现例如将前端的服务和后端的服务分别部署在不同的pod上面的,前端访问后端的ip地址就需要通过service给他pod IP来获得其实际需要访问的地址,service和注册中心网有异曲同工的地方。定义一组关于pod的访问策略(负载均衡)负载均衡的策略可以根据很多指标来指定,每次都将任务分给较空闲的podPod与Service的关系service会根据标签对pod进行处理,selector中会记录标签对应的一些pod,每个pod上都绑定一个label。

2020-10-13 16:36:46 341

原创 leetcode刷题之239.滑动窗口的最大值

正确的解法是使用双端队列来处理这个window的功能。c++ deque有现成的stl可以使用需要注意几个点1. 需要维护队列内部的最大值在队首的位置,每次想要添加一个新元素的时候就循环和前面的元素做比较2. 判断一个元素是否过期,可以直接用当前队首和应该淘汰的数字进行对比如果一致就去除主要逻辑:1. 如果该数据小于新加入的数据,再上一步就应该被清除所以不需要考虑过期的问题2. 如果当前的数据大于新加入的数据,但是又恰好等于i -k这个位置的数据,那么在确定最大值之前就需要将它.

2020-10-12 20:58:11 131

原创 k8s资源类型

集群资源分类名称空间级别:各个命名空间之间是隔离的集群级别:资源被定义后在全集群都可以被看见元数据型:不属于名称空间级别和集群级别,通过某些指标进行操作(比如分析系统的cpu指标)名称空间级别下资源工作负载型资源: Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job\CronJob服务发现型以及负载均衡资源: Service、Ingress配置与存储资源:Volume、CSI(容器存储接口)特殊类型的存储卷:ConfigMap(当配置中

2020-10-09 18:50:53 819

原创 k8s的系统组件构成

k8s的前身borgBorgMaster类似于是中心调度的大脑,Borglet是一些真正运行服务的节点,其中包含某些节点的副本,一般来说节点的数量都是奇数的为了防止投票的时候出现平手的现象一般都是用奇数个节点。scheduler调度器scheduler将数据写入Paxos数据库当中之后再发给Borglet去消费这些数据。K8s的架构master服务器分为三部分scheduler : 调度器replication controller :配置控制器,负责控制副本数量得,伸展和收缩容器的数量

2020-09-30 19:06:03 498

原创 mapreduce的内部核心的工作机制

mapreduce框架的工作机制划分输入切片:Job客户端负责划分扫描输入目录中的所有文件遍历每一个文件按照128规格划分范围生成arrayList序列化程job.split文件根据job.split知道创建几个mapTask ,明确每个mapTask会处理某个文件某一部分的内容Map程序的启动过程TextInputFormat类:文本文件类型的读取工具类。mapTask会调用TextInputFormat类得到一个LineRecordReader类调用next方法从in

2020-09-30 13:32:25 108

原创 如何使用mr程序统计数量前几大数据样本?

一次mr程序的执行流程数据输入到map程序做拆解的处理生成kvreduce会对数据做统计reduce程序执行完毕之后会调用cleanup程序一个reduce程序在reduce的过程中可以将统计的结果放在hashmap当中,然后在最后reduce处理完毕之后调用cleanup的过程中对所有的hashmap进行统计排序。因为每次reduce调用之后都回调用cleanup程序,所以如果想到的得到唯一的结果,就只能使用一个reduce程序。缺点:实现是可以实现这个功能,但是会失去分布式的意义,其次用

2020-09-29 18:35:18 331

原创 如何手写一个简单的加减乘除的ast树

首先我们需要知道到底怎么给一个树排序的基本规则优先级高的要放在最下面的位置,新节点优先级低于当前比较的节点向上调整直到达到优先级合适的位置,优先级等于或大于当前节点的优先级则向下调整更新。尽量将所有的带有operator的节点放在左边举个例子4 * 1 / 2 + 3 - 2首先我们解析到第一个符号第二个符号是÷,因为除法和惩罚是同等优先级的,所以在经过判断之后,优先级一致向下调整这里要说明的是一个运算当中因为运算符优先级是不一样的所以一个数字应该与哪个符号结合也是问题那么11 / 2中

2020-08-01 21:07:12 572

原创 Go 语言结构体初始化的一些规则

Go语言的风格Go是一门看似简单但是依旧有自己的倔强的语言,对于一些小的细节,在初次学习的以后需要作详细的比较的尝试才可以逐渐熟练的使用这门语言。Go的结构体初始化列一下一个结构体结构type MyStruct struct { Num int Name string}正常的初始化有哪些//1.只声明,后做初始化var s MyStructs.Name = "xiaoming"s.Num = 20//2. 初始化的以后希望给变量赋值var s MyStruct = MySt

2020-07-24 20:44:02 489

原创 Lucene语言的常用API的使用

Lucene获得文档原始文档:要基于原始文档的数据内容建立索引搜索引擎:使用爬虫获得原始文档站内搜索:数据库内的数据查询构建文档对象对应每个文件创建document对象每个document对象都包含多个域(field)域中保存就是原始文档的数据,域包括名称和数据。每一个文档都包含一个编号ID分析文档分词:根据空格进行拆分句子,得到单词的列表把单词转为小写去掉标点符号去掉一些停用词(the a等)每个关键词都封装到一个Term对象当中,Term中包含两部分,关键词所在的

2020-07-13 23:23:22 216

原创 Yarn设计机制和使用方式

Yarn是什么yarn是一个分布式程序的运行调度平台yarn中有两大核心角色:1、Resource Manager接受用户提交的分布式计算程序,并为其划分资源(调度者)管理、监控各个Node Manager上的资源情况,以便于均衡负载Resource Manager最好不要放在namenode上面,因为resource不需要读取数据,resource manager非常重要所以需要单独放在一个机器上面。2、Node Manager管理它所在机器的运算资源(cpu + 内存)负责接受Re

2020-07-09 15:21:47 141

原创 mapreduce框架学习

Map和Reduce阶段都是分离的map阶段–程序mapTaskmapTask可以运行在多个服务器上面,具体启动的数量取决于数据的数量。将文件化分给不同的mapTask的过程叫做切片。因为每个文件的大小不一致,所以并不是单纯的按照文件的个数进行分配。所以其实是将文件分为一些固定大小的数据块,并且将数据块分配给不同的map程序。首先是对文件的大小进行扫描,之后根绝文件的整体的大小启动相应数量的map程序需要给map程序提供一个接口类,map将数据直接传给接口类,之后接口类处理完的数据内容再递交给ma

2020-07-07 15:47:53 99

原创 使用HDFS完成一个简单的wordcount程序

wordcount业务需要的执行步骤在hdfs中读取文件:一次读取一行调用一个方法对每一行进行业务处理将处理的结果放入一个缓存当中最后将缓存中的统计结果输出到HDFS中的结果文件内HDFS的客户端//可以使用反射等方式从配置文件读取应该初始化的Handler的类型//或者直接初始化WordCountHandler wcHandler = new WordCountHandler();//获取文件系统FileSystem fs = FileSystem.get(new URI("

2020-07-02 22:06:14 507

原创 自学MIT 6.828心得:(一)jos的bootloader过程

唠叨一下没想到第一课的信息量就这么大,如果是没有接触过汇编的同学可能会有些难度,这里不仅要求对系统有一定的了解,还得会通过调试的方法来查看整个程序的运行过程。我的环境还没有搭建好,看了一些大佬的在环境搭建的时所到的坑,多有点耐心一定可以的。不知道你们有没有看PPT,第一课的教案内容也十分丰富,人家的绪论一点都不水反而是整体的总结了一下系统的各个层次和设计难点。作业可以看成是实践教学了,美国的这种教育体系很和我的胃口不会觉得无聊,有挑战性!作业笔记第一步很人性化的教你如何建立一个git上的仓库,这一

2020-06-24 17:20:00 763

原创 hadoop客户端指令

hdfs客户端的常用操作命令上传文件到hdfs中hadoop fs -put /本地文件 /aaacopyFromLocal作用相同下载文件到客户端本地磁盘hadoop fs -get /hdfs中的路径 /本地磁盘目录copyToLocal命令效果一致在hdfs中创建文件夹hadoop fs -mkdir -p /aaa/xxx移动hdfs中的文件(更名)hadoop fs -mv /hdfs的路径1 /hdfs的另一个路径2复制hdfs中的文件到hdf

2020-06-24 01:54:42 143

原创 Linux 查询进程、网络、ssh、awk && sed

查询进程信息ps -aux ps -le pstree 进程树 pstree -p 显示进程PID pstree -u 显示进程所属用户查看当前网络状态netstat -ntlp | grep httpd 查询httpd的端口信息 netstat -atnp | grep httpd netstat -atnp | grep 80 查看端口远程连接工具scp //安全拷贝 scp filename/dir1 user@远程服务器ip:dir2 (冒号和IP之间没有空格) 如果

2020-05-22 20:04:55 454

原创 c++函数指针 对象内部的函数指针的使用

函数指针函数指针在c语言定义就比较方便举个例子,如果需要指向一个返回值为void参数为int , int的函数,可以如下定义函数指针类型void sum(int a , int b) { //其实啥也不干,调用了个寂寞}//1. 直接定义的时候就给初始化void (*p)(int , int) = sum;//2. 使用typedeftypedef void (*pfun)(...

2020-03-12 20:43:30 403

原创 个人学习 -- KMP算法

如此愚钝 一天才学会KMP算法的思想就是,如果已经匹配的模式串内部有重复的部分,那么我们移动的时候就能多移动几步,而且由于模式串的大小都是固定的,所以我们可以提前的求出有哪些部分是重复的。这里说的重复是指,前缀子串和后缀子串举个例子: e x a m p l e前缀子串: e , ex, exa, exam , examp , exampl后缀子串: e , le , ple, ...

2020-01-04 16:19:29 89

原创 AVL树学习

AVL树为什会出现?我们之前有学习使用二叉查找树,但是二叉查找树在使用的时候也会出现一些问题,当恰好所有的数据都是按照大小顺序插入的话,就有可能将我们的二叉树编程链表,就导致树结构退化为链表结构。什么是不平衡其实不平衡就是一个节点下面的左子树和右子树的高度相差太多,没有雨露均沾,导致出现了不平衡的现象。如何解决不平衡?其实我们从局部看,不平衡的情况其实就归为四种。左—左类型其实对于...

2020-01-02 16:31:32 96

原创 服务端开发被我忽略的点

Linux c++服务端设计菜而不自知才是无药可救 —> 说我呢/(ㄒoㄒ)/这几天一直在看muduo库的代码,结合着陈硕老师的书《Linux多线程服务端编程 – 使用muduo c++ 网络库》。还记得我第一次使用网络库是在大二下学期的时候,用了boost库,但是用的我也是一脸懵逼,很多都是照着官网的例子去做修改,最后反正能完成服务功能就是谢天谢地。这次学习成功的让我又多了一位崇拜的...

2020-01-01 16:08:45 165

原创 go test benchmark

benchmark使用方式func Benchmark(b * testing.B) { //与预测无关的代码 b.ResetTimer() for i := 0; i < b.N ; i++ { // 测试代码 } b.StopTimer() //与测试无关的代码}指令方式go test -bench=.go test -bench=. -benchmem ...

2019-12-09 17:22:51 108

原创 go 用channel实现对象池并且与sync.Pool对比

标题对象池的实现原料channelselect对象本身import ( "time" "errors" ) type MyObject struct { Value interface{}}type ObjectPool struct { objectChan chan *MyObject}//初始化程序func PoolInit(size int) (...

2019-12-09 15:49:11 424

原创 go 单例模式

go的单例模式可以使用系统自带的sync的包。import "sync"type Singleton struct {}var one sync.Oncevar SingletonInstance * Singletonfunc (this* Singleton) getInstance() *Singleton{ one.Do(func() { SingletonIns...

2019-12-07 23:55:14 66

原创 go 写个协程池 慎入写的不好

##思路讲解开辟几个固定的协程可供调度,这个大小也是可以指定的channel的作用,用于唤醒协程处理并发关系协程执行的函数结构的存储问题###threadPool的数据结构type ThreadPool struct { ch chan int /*channel*/ size int threadNum int tasks *list.List /*list容器,需要...

2019-12-07 18:58:36 133

原创 8 go中的结构体struct

go里面的结构体其实和c++差别不太大,但是仍然有go的特色1.结构体的定义type Human struct{ name string age int weight int}type Student struct{ Human //匿名字段,表示human里面的所有的字段都包含在内 speciality string}2.结构...

2019-09-13 13:11:24 120

原创 7 go中的异常处理

go中的异常处理有三个关键字defer panic recoverdefer是用来解决异常发生之后有关资源的释放问题,抛出异常之后仍然会执行defer所作用的函数,可以用原来释放资源。panic是用来抛出异常然后如果没有捕获异常的处理,就会导致程序终止。应该养成比较好的习惯,就是每一个资源打开之后就使用defer关闭资源import( ”fmt“)func main...

2019-09-13 13:09:43 192

原创 6 go中defer关键字的用法

defer关键字defer是go里面处理异常的一个关键字,应用场景类似于java里面的finally,使用的时候就是所有的其他的正常的函数进程执行完毕之后都要执行defer。也就是被defer修饰的函数或者语句都是等到所有的作用域内部的函数执行完毕才会执行。而且defer修饰的语句应该是以压栈的方式存储在某一个指令栈里面,先放进去的后执行。func main{ for...

2019-09-13 13:08:01 199

原创 5 go中的range

C++11里面开始使用的range的便利方法,go肯定有而且更加的简单粗暴赋予了更多的功能Go 语言范围(Range)Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。package main...

2019-09-13 12:57:59 156

原创 4 go的函数

函数的定义函数的结构func [function name] (paramters , ...) (return type) {}//func add(a int , b int)func add(a, b int) int { //代表两个变量是一样的类型 return a + b}func swap(a , b int) (int int) { return...

2019-09-13 12:56:36 167

原创 3 go中数组和切片之间的区别

数组数组的概念之前在c里面就有所以并不会很陌生,但是仍然有些区别。数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在c++里面我们使用数组在传参的时候传递的都是指针,但是在go里面对数组进行赋值或者是穿参都是传值的行为。所以效率会有所降低。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。定义的方法...

2019-09-13 12:53:39 237

原创 2 golang中变量的定义

个人理解的是,go里面的变量和const修饰的常量其实是不同的概念,做了一个彻底的区分。对变量的定义:引入了关键字var对变量进行声明var a intvar b stringvar c float64var e [4] int // 数组var f [] int //数组切片var f * int //正确var v1 int = 5 //正确var v2 = 5...

2019-09-13 12:50:03 159

原创 1 go语言介绍的简单的示例

Go语言的语言特性1.2.1 并发编程Go 语言引入了goroutine,它是 Go 实现快速高效的并发编程的关键。通过调用 go 关键字,我们就可以让函数以 goroutine 的方式进行运行,也就是以协程为单位进行运行。协程比线程更加的轻量级,也更节省系统资源,这使得我们可以创建大量的 goroutine,从而进行轻松且高质量的并发编程。同时,goroutine 内部采用管道chann...

2019-09-13 12:45:30 373

原创 mysql启动错误 ERROR 2002 (HY000) 以及service mysql start莫名其妙来的验证

之前在ubuntu等其他的系统上使用mysql并没有出现这些问题,但是今天使用公司的一个服务器的时候需要自己先下载安装mysql,这时就出现错误了。mysql服务启动出问题显示如下验证界面[xx@alarm01v ~]$ service mysql startRedirecting to /bin/systemctl start mysql.service==== AUTHENTIC...

2019-08-23 15:18:07 5410

原创 2.线程的创建、结束

程序结束的标志一个进程的结束的标志就是主线程是否执行完毕,当属线程执行完毕时,意味着整个程序已经结束。这样我们其他的线程的任务执行可能会被强行的终止。所以如果我们想要保持指现场的正常运行,我们需要主线程的寿命大于等于子进程时候,这样才能将子进程的任务全部执行完。当然如果想要让主线程和其他线程是分离的状态,也就是说想要让线程自己去回收自己的资源也不是不可以。这种状态我们一般称之为detach...

2019-07-28 16:31:55 152

原创 多进程 多线程的概念

1.并发两个或多个任务同时发生一个程序,同时执行多个独立的任务被称作为并发。在以往的计算机终端和CPU在某一个时刻其实只能执行同一个任务,这个是由它的系统统一调度居你们给每个任务分配固定的时间,对于单核的CPU来说,只要切换的时间频率够快够短,就看起来像是同时在执行好几个程序。这个其实不算是真正的并发,这种切换是要有时间开销的,因为要保存一些局部的变量,状态执行进度等等都需要保存下来。...

2019-07-28 15:40:37 116

原创 c++ decltype关键字的使用

使用这个关键字的作用是找到某一个表达式的类型。其实是类似于typeof但是没有typeof,其实每一个类型是有一个typeid的其实是你是可以获得这个id并且打印出来的,但是ID打印出来也没有什么意义。c++11导入了一个新的关键字,就是decltype具体的使用可以看下方当我们想要知道一个容器里面包含了什么类型的元素的时候我们可以使用decltype来获取里面的数据类型,通过对象来取...

2019-07-27 15:27:24 780

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除