- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 负载均衡之子集选择算法
目录背景背景目前的场景下,任务管理集群Apiserver有6个节点,agent集群的数量有36w+。之前的算法是agent通过注册中心获取Apiserver全量的节点数,并建立连接,所以每个Apiserver上维护了36w+的连接池。当集群负载高时,扩容Apiserver节点并不能解决负载的问题,因为新节点并不能平摊其他节点的连接数,为此需要采用sharding的方式,让每个agent连接到部分的Apiserver节点,并且这个过程需要是幂等的,就是如果APiserver节点没有变更,.
2020-07-08 21:47:51 856
原创 tcpdump初识
目录背景背景目前所做的项目管理了近36w+的agent,用来接收apiserver集群(存储了任务的相关数据)推送过来的任务信息。当前的流程是agent会和apiserver节点建立grpc双向流式,当apiserver有任务的时候,会push任务信息给agent,并定时发送心跳请求来探活长连接。从现状来看,时不时会出现长连接的问题导致agent接收任务失败。现状在机器上执行netstat可以看到,agent和apiserver节点的44401端口建立了长连接,连接状态为ES..
2020-07-08 21:26:03 302
原创 Tcp 半连接队列和全连接队列
半连接队列和全连接队列概念(图片来源链接:http://jm.taobao.org/2017/05/25/525-1/)这里的重点是两个队列,分别是syns queue和accpet queue。syns queue为半连接队列,accpet queue为全连接队列。1. 在client端发送SYN给server后,server端变成SYN_RCVD状态,并将连接信息放入半连接队列中。2. server端收到client端的ACK后,如果全连接队列没有满,则将连接信息从半连接队列取出,并
2020-07-01 22:43:16 999
原创 rpm和yum常用命令
文章目录常用rpm命令安装rpm包升级rpm包回滚rpm包常用yum命令列出所有已安装的软件包安装软件包删除软件包搜索软件包安装本地的rpm软件包参考链接常用rpm命令安装rpm包rpm -ivh --force xx.rpm升级rpm包rpm -Uvh xx.rpm回滚rpm包rpm -Uvh --oldpackage xx.rpm常用yum命令列出所有已安装的软件包yum list installed安装软件包yum install net-tools删除软件包
2020-07-01 21:50:13 253
原创 gitlab cicd 初体验
文章目录背景Hello world申请仓库创建.gitlab-ci.yml文件执行背景最近在调研devops这一块,看看业内的主流公司都是如何做一块的,看gitlab的ci/cd功能支持的挺完善,还支持pipeline,决定上手试一下。Hello world申请仓库申请一个仓库hello world,在仓库中创建三个文件,分别为main.go,hello.go和hello_test.go...
2020-02-28 22:28:07 535
原创 go mod入门
文章目录背景介绍快速上手创建一个新的module添加依赖更新依赖添加一个新的major版本的依赖更新新的major版本依赖移除未使用的依赖结论背景介绍在Go 1.11版本开始,go支持go modules-(go官方的依赖管理系统),使得依赖版本信息的管理更加简单方便。同时官方给了对应blog,使用户能够快速上手go mod,blog链接可参考Using Go Modules。在go 1.1...
2020-02-27 17:53:58 671
原创 gorm踩坑笔记1
文章目录背景解决过程排查过程解决方案背景最近在用gorm查询满足某个条件的所有记录中最新的记录,代码可参考下面的例子,具体查询语句如下所示,目的是查询满足条件host_id=1的所有记录中按时间倒序,然后返回最新的记录。orm.First(&hostStat, "host_id = ?", 1).Order("time desc").Error完整的casepackage ma...
2020-02-25 15:57:38 1390
原创 Lua 入门教程
文章目录Lua简介Lua入门安装hello world类型nilbooleannumberstringtablefunction表达式关系操作符逻辑操作符字符串连接控制结构if then elseif then elseif then endwhilefor数字型for泛型formetatable与metamethodLua简介Lua作为一种脚本语言(解释型语言),号称性能最高的脚本,被广泛应...
2020-02-13 21:04:06 675
原创 服务限流
文章目录背景核心逻辑代码分析Client基于令牌桶的限流器背景 在去年的年底,组里的项目出了COE。当时的情况是用户在前端点击创建任务,但是接口长时间不返回结果(系统的其他功能都是正常)。第一时间查看了Prometheus监控,发现master组件的goroutine激增,飙到了1w+(正常情况下,goroutine的数量维持在3k-4k)。当时的第一反应是有用户高频率地调用创建任务的接口,...
2020-02-12 21:43:50 347
原创 Golang Channel源码解析
文章目录channelsHow to use ChannelsChannel源码解析代码入口channel的结构体新建channelchannel发送元素channel读取元素关闭channelchannelschannel存在以下四个特性goroutine-safestore and pass values between goroutinesprovide FIFO semanti...
2020-02-11 21:19:39 440 1
原创 golang编译器的//go:解析
文章目录//go:noescape//go:nosplit//go:linkname localname [importpath.name]//go:nowritebarrierrec//go:yeswritebarrierrec//go:noinline//go:norace在阅读golang源码时经常会遇到以//go:开头的注释,其目的就是告诉编译器如何编译这段代码。//go:noesca...
2020-01-14 17:35:09 1396
原创 使用bazel构建golang的项目
文章目录Bazel什么是bazel如何安装bazelinstall Xcode command line toolsdownload the bazel installerrun the installersetup environment搭建项目整体结构使用bazel构建项目WORKSPACE和BUILD.bazelWORKSPACEBUILD.bazel使用bazel运行更新仓库生成并更新各目...
2019-12-27 12:05:59 1471
原创 Linux Cgroups
文章目录什么是CgroupsCgroups组件组件之间的关系Kernel接口众所周知,Docker中的关键技术就是Namespace和Cgroups。本文将讲述一下linux中的cgroups。什么是CgroupsCgroups是Control Groups的缩写,用来对进程进行资源的限制,控制使用量和统计,包括CPU,内存,存储,网络等等。通过Cgroups,可以很方便地限制某个进程的资源...
2019-10-15 10:33:46 179
原创 Docker构建报错:Create more free space in thin pool or use dm.min_free_space option to change behavior.
文章目录问题现象问题分析解决方案参考链接问题现象晚上使用docker进行构建任务的时候,运行docker run xxx命令的时候,返回错误如下所示。docker: Error response from daemon: devmapper: Thin Pool has 264381 free data blocks which is less than minimum required ...
2019-09-03 23:40:52 7958
原创 使用kubeadm安装Kubernetes
使用kubeadm安装Kubernetes环境准备基础配置安装Docker关闭防火墙关闭SELinux关闭swap配置转发参数配置Kubernetes阿里云源安装Kubernetes相关组件加载IPVS内核安装Master节点执行kubeadm init 失败手动下载镜像执行kubeadm init安装Node节点下载镜像添加Node节点本次配置使用kubeadm安装Kubernetes,使用了...
2019-08-07 23:45:17 2803 1
原创 基于java的spring装配
1.创建可被发现的bean首先定义一个接口:package soundsystem;public interface CompactDisc { void play();}创建接口的一个实现,并使用@Component注解,这个简单的注解表明该类会作为组件类,并告知Spring要为这个类创建bean。Spring应用上下文中所有的bean都会给定一个ID,根据类名为其指定一个ID,也就是将类...
2018-06-29 11:18:16 348 1
原创 解决:The import org.springframework.test cannot be resolved
解决:The import org.springframework.test cannot be resolved这年头csdn上好多答案都是复制粘贴,找了好几个才找到正确解,还是Stack Overflow上比较权威。下面给出解决方案,并给出Stack Overflow上的链接,供大家参考。https://stackoverflow.com/questions/30513375/the-impo...
2018-06-10 21:35:53 33396 3
原创 解决:The import org.junit cannot be resolved
解决:The import org.junit cannot be resolved项目右键Properties->Java Build Path->Libraries->add library->Juint->next->finish。
2018-06-10 21:27:34 19061 5
原创 基于注解方式配置bean以及自动转配属性
在classpath中扫描Bean组件组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的Bean组件。特定组件包括:@Component:基本注解,标识了一个受Spring管理的Bean组件@Respository:标识持久层Bean组件@Service:标识服务层(业务层)Bean组件@Controller:标识表现层(控...
2018-05-30 21:00:25 541
原创 通过FacotryBean接口配置bean
实现FactoryBean接口在Spring IOC容器中配置BeanSpring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。public interface FactoryBean<T> { T...
2018-05-29 21:27:23 229 1
原创 Spring 静态工厂方法及实例工厂方法配置bean
通过调用静态工厂方法创建Bean调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中。当客户端需要对象时,只需要简单地调用静态方法,而不关心创建对象的细节。要声明通过静态方法创建的Bean,需要在Bean的class属性里指定拥有该工厂的方法的类,同时在factory-method属性里指定工厂方法的名称。最后,使用<constructor-arg>元素为该方法传递方法参数。...
2018-05-28 20:56:25 3057
原创 Spring IOC容器管理Bean的生命周期以及bean的后置处理器
bean的后置处理器Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务。Spring IOC容器对Bean的生命周期进行管理的过程如下:通过构造器或工厂方法创建Bean实例为Bean的属性设置值和对其他Bean的引用调用Bean的初始化方法(init-method)Bean可以使用了当容器关闭时,调用Bean的销毁方法(destory-me...
2018-05-27 21:37:49 1557 2
原创 Spring表达式语言:SpEL
Spring表达式语言:SpELSpring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言。语法类似于EL:SpEL使用#{...}作为定界符,所有在大框号中的字符都将被认为是SpEL。SpEL为bean的属性进行动态赋值提供了便利。通过SpEL可以实现:通过bean的id对bean进行引用调用方法以及引用对象中的属性计算表达式的值正则表达式的匹配SpEl:字面值整...
2018-05-27 11:55:37 482
原创 Spring使用外部属性文件进行bean属性值的注入
使用外部属性文件进行bean属性值的注入在配置文件里配置Bean时,有时需要在Bean的配置里混入系统部署的细节信息(例如:文件路径,数据源配置信息等)。而这些部署细节实际上需要和Bean配置分离。Spring提供了一个PropertyPlaceHolderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean配置的部分内容外移到属性文件中。可以在Bean配置文件里使...
2018-05-26 21:30:59 1072
原创 Bean的作用域
Bean的作用域在Spring中,可以在<bean>元素的scope属性里设置Bean的作用域默认情况下,Spring只为每个在IOC容器里声明的Bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和Bean引用都将返回这个唯一的Bean实例。该作用域被称为singleton,它是所有Bean的默认作用域。类别说明singletonSpring...
2018-05-25 21:35:26 193 1
原创 bean之间的关系:继承和依赖
bean之间的关系bean之间的关系:继承和依赖继承Spring允许继承bean的配置,被继承的bean称为父bean,继承这个父bean的bean称为子bean。子bean从父bean中继承配置,包括bean的属性配置,也可以覆盖从父bean继承过来的配置父bean可以作为配置模板,也可以作为bean实例,若只想把父bean作为模板,可以设置<bean>的abstract属性为tru...
2018-05-25 20:58:11 1064
原创 Bean的自动装配:autowire
Bean的自动装配Bean的自动装配Spring IOC容器可以自动装配Bean。需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式public class Car { String type; public String getType() { return type; } public void setType(String type) {...
2018-05-25 20:00:02 1323
原创 Spring中IOC容器概述与Bean的配置
Spring中IOC容器概述与Bean的配置IOC容器概述IOC(Inversion of Control):其思想是反转资源获取的方向。传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时地返回资源。Person p=new Person();而应用了IOC之后,则是容器主动地将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式...
2018-05-23 20:53:53 1318
原创 在eclipse中,使用Maven配置spring环境
在eclipse中,使用Maven配置spring环境1.首先在Maven官网上下载maven,下载链接为:https://maven.apache.org/download.cgi。本人下载的版本为apache-maven-3.3.9-bin.zip,并将它解压。2.配置环境变量,鼠标右击计算机->属性->高级系统设置->环境变量添加系统环境变量,MAVEN_HOME,变量值为...
2018-05-18 15:45:53 581
原创 在eclipse中,使用spring tool suite配置spring环境
本人第一次接触spring,在经过一天的努力之后,终于成功配置了spring环境。本人使用的eclipse版本为Version: Mars.2 Release (4.5.2)。使用spring tool suite配置1.打开eclipse,选择help->Eclipse marketplace,在Search中搜索spring tool suite,点击install,在下图中,由于本人已...
2018-05-17 21:40:53 2483 1
原创 StampedLock实例
StampedLock是jdk8中新出现的一种改进的读写锁。下面代码给出StampedLock的使用实例,完成了四个函数功能,其中optimisticRead()是尝试使用乐观锁来读取值,conditionReadWrite()的功能是读取balance的值,并判断是否大于0,若大于0,则对balance更新。详细的源代码分析以后将会展示,关于api的介绍可参考StampedLock官方文档。pa...
2018-05-14 20:30:36 1206
原创 使用CountDownLatch实现一个简单的计数求和功能
使用CountDownLatch实现一个简单的计数求和功能使用CountDownLatch实现一个简单的计数求和功能,主要用到了两个函数,分别为countDown()和await()。下面给出了代码,readfile()函数用来读取文件中每行数字,并保存。calculate()函数用来计算每行的和,getfinalsum()用来计算最终的和。package com.concur.countdown...
2018-05-08 20:10:57 1099
原创 Java实现一个简易的数据连接池
Java实现一个简易的数据连接池下面给出了代码,设置数据连接池的初始大小INIT_CONNECTIONS=10,首先在静态代码块中加载驱动,在Datapool()函数中初始化数据连接池,getConnect()函数为返回数据连接池中的连接,若没有可用的,则等待。release()函数为将用完的连接返回给连接池。package com.concur.threadpool;import java....
2018-05-06 19:46:18 490
原创 使用wait()和notifyAll()实现生产者消费者模型
使用wait()和notifyAll()实现生产者消费者模型下面将实现三个类,Generater为生产者,Consumer为消费者,Taobao为中间平台。给出代码。生产者Generater:package generater_and_consumer;public class Generater implements Runnable{ private Taobao taobao;...
2018-04-24 19:27:51 271
原创 java 多线程 锁降级
锁降级指的是写锁降级为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种并不能称之为锁降级,锁降级指的是把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前有用的)写锁的过程。下面给出一个锁降级的示例,当数据变动时,isUpdate变量被设置为false,此时所有所有readwrite()方法的线程都能感知到变化,但是只有一个线程能够获取到写锁,其他线程会被阻塞在读锁和写锁的lock...
2018-04-19 21:44:22 2938
原创 java 使用AQS写可重入锁
java 使用AQS写可重入锁在上一篇文章中,手动实现了一个可重入锁,在本节中,使用AQS重写这个可重入锁MyLock2类,实现了Lock接口,定义内部类Sync继承自AbstractQueuedSynchronizer,并实现了两个方法,分别为tryAcquire(int arg)和tryRelease(int arg),tryAcquire函数的实现逻辑与上一篇文章"java 手动实现一个可重...
2018-04-18 20:13:29 745
原创 java 手动实现一个可重入锁
手动实现一个可重入锁下面代码给出了一个手动实现的可重入锁,MyLock类,实现了Lock接口,需要编写的两个函数为lock()和unlock()。isLocked变量用来判断当前是否有线程使用,若没有,则为false。lockBy变量保存了当前持有的线程。lockcount变量保存当前持有的线程的计数器。函数中调用wait()和notify()时,需要加上关键字synchronized。packa...
2018-04-17 16:13:34 1428
原创 Java原子类操作
Java原子类操作java的原子类放在java.util.concurrent.atomic包下面,常用的有以下这些类:AtomicBooleanAtomicIntegerAtomicIntegerArrayAtomicIntegerFieldUpdaterAtomicLongAtomicLongArrayAtomicLongFieldUpdaterAtomicReference下面将用代码来展示...
2018-04-16 21:29:06 186
原创 深入理解volatile原理与使用
深入理解volatile原理与使用Volatile称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的,保证不了非原子性操作,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。有volatile变量修饰的共享变量在进行写操作的时候汇编代码中会出现Lock指令Lock指令在多核处理器下会引发两件事情:将当前处理器缓存行的内容写回到系统内存写回到内存的...
2018-04-16 19:10:12 158
原创 java 单例模式与线程安全性问题
饿汉式饿汉式就是在变量申明的时候就完成初始化工作优点:没有线程安全性问题缺点:在程序加载时,单例模式的实体就已经被创建了,存在性能问题public class Singleton { // 私有化构造方法 private Singleton () {} private static Singleton instance = new Singleton(); public stat...
2018-04-15 21:19:40 554
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人