自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 资源 (1)
  • 收藏
  • 关注

原创 设计原则总结

简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细节也依赖于抽象。当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法。

2022-11-16 15:46:33 323

原创 为什么Tomcat需要打破双亲委派机制

tomcat的类加载机制是违反了双亲委托原则的,对于一些未加载的非基础类(Object,String等),各个web应用自己的类加载器(WebAppClassLoader)会优先加载,加载不到时再交给commonClassLoader走双亲委托。对于JVM来说:因此,按照这个过程可以想到,如果同样在CLASSPATH指定的目录中和自己工作目录中存放相同的class,会优先加载CLASSPATH目录中的文件。1. 不打破双亲委派一样可以保证不同web应用加载不同位置的内容,这是通过每个web.

2021-09-26 15:34:21 3548 1

原创 秒杀问题梳理

1.秒杀商品入库审核(后台),把秒杀商品保存到mysql中2.将待选课程载入redis3.用户经过nginx访问redis获取待选课程,获取待选课程页5.通过nginx查询redis判断是否有待选课程,如果有待选课程,检查用户是否登录6.如果用户登录,秒杀服务,排队抢单,记录用户的id和课程id,把排队信息存储到redis中,提示用户正在排队7.多线程抢单开始下单获取redis中排队信息(list类型),开始校验①校验账号是否异常②24小时是否购买过该商品③是否存在未支付的秒杀订单④该秒杀

2021-09-24 21:06:55 795

原创 计算广告读书笔记

1.广告基础1.1广告中的定义广告主(advertiser也叫出资人sponsor)媒介(medium)受众(audience)本质是通过广泛受众的媒介,完成较低成本的用户接触(reach信息传播)1.2广告分类(1)横幅广告(2)文字链广告,一般是搜索广告的主流形式,连接到广告主的落地页(3)富媒体广告,利用视觉冲击力,向用户投送广告素材,比如弹窗,对联,全屏,对用户的使用体验影响很大。(4)视频广告:广告的创意从静态素材变成一段视频。视频花是在线广告的一个重要趋势。.

2021-09-24 15:33:02 7421

原创 RIP协议和OSPF协议

背景:rip的缺陷:1.以跳数评估路由,并不是最优的路径。因为路径的带宽会有差异,跳数少不一定最优。2.rip的最大跳数为15。避免成环。3.每隔30秒,和邻居广播自己完整rip路由表。浪费网络资源。4.收敛速度慢。网络出现临时的环路,为了避免这个现象会有机制抑制(略)。ospf1.基于链路开销选择最优路径。2.出发更新或者隔30min向邻接路由器发送链路状态的信息摘要,增量更新机制。每个路由器将一致的链路状态信息告诉邻居,收敛以后,网络上的的每个路由器对全网的路由状态是

2021-08-29 17:54:36 215

原创 Angular中弹窗内如何分页及limit性能优化的思路

// function viewHistory(type){ // var taskID = Model.oldTask.taskID; // var channelPanel = Model.oldTask.cpdInfo ? Model.oldTask.cpdInfo.mediaChannel : Model.oldTask.brandBidInfo.mediaChannel; // ...

2021-08-08 22:32:51 286

原创 Oauth2.0学习笔记

1. 分布式sessionip hash缺点:不容灾session复制缺点:复制需要时间,session容易混乱session集中存储在redis上面在分布式情况下,从有状态服务(session)转向无状态服务。无状态服务:全部用户信息以token的形式存到客户端。服务端不要session。客户端下一次请求时候只需要在服务端验证一下token即可。无状态就是t1和t2服务器没有任何区别,这样更易于扩展。不用考虑运行当中状态值的区别。后台如何验证token?rsa,公钥 私钥先

2021-07-18 22:13:55 235 1

原创 leetcode151. 翻转字符串里的单词中的split方法

主要的问题是split方法一、待分割字符串待分割字符串为如下:String str = "a b c d e f g"其中,字符串中的的空白分别为:单个空格,多个空格,tab制表符。二、使用一个或多个空格分割字符串正确代码如下:String [] arr = str.split("\\s+");for(String ss : arr){ System.out.println(ss);}作为对比,错误代码如下:String [] arr2 = str.s

2021-07-13 20:44:18 154

原创 RestTemplate

spring提供了一个模板,可以在java代码里访问restful服务,这就是RestTemplate。我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。一个例子:远程调用别的站点的方法@RestControllerpublic class DeptConsumerController { // 理解:消费者,不应该有service层~ // RestTemplate .... 供我们直接

2021-07-13 20:29:46 132

原创 Amdahl‘s Law+ Gustafson-Barsis‘s Law

Amdahl’s LawIf 95% of the program can be parallelized, the theoretical maximumspeedup using parallel computing would be 20×, no matter howmany processors are used, i.e. if the non-parallelisable part takes 1hour, then no matter how many cores you throw

2021-06-14 14:06:21 408

原创 Theorem (Popek and Goldberg)

概要波佩克与戈德堡虚拟化需求(英语:Popek and Goldberg virtualization requirements)是一组充分条件,用于验证某一计算机体系结构可否被有效虚拟化。杰拉尔德·J·波佩克与罗伯特·P·戈德堡于1974年合作论文《可虚拟第三代架构的规范化条件(英语:Formal Requirements for Virtualizable Third Generation Architectures)》中提出。尽管这组条件基于简单化假设获得,但它们仍为判定一个计算机架构是否能够有效支

2021-06-01 10:34:29 450

原创 Connection to pypi.python. org timed out解决方案

在学校服务器部署flask项目的时候,碰到如下报错:WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by ‘ConnectTimeoutError(<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7fbe85e425b0>, ‘Connection

2021-05-01 11:21:11 1946

原创 couchdb无法访问5984端口问题

mac/centos安装couchdb在此不赘述了,brew install couchdb安装完成以后,直接运行下面目录中的couchdb文件/usr/local/Cellar/couchdb/3.1.1_1/bin发现5984拒绝访问,猜测是密码和用户名的配置,或者防火墙端口配置问题(略)。解决方法:进入/usr/local/Cellar/couchdb/3.1.1_1/etc,可以找到local.ini文件,加上用户名和密码即可。COUCHDB_USER = adminCOUCHD

2021-04-22 21:13:24 1021

原创 Docker12: 总结

swarn集群的管理和编排(好比厨房),docker可以初始化一个swarm集群,其他节点可以加入;(分为管理节点,工作节点)命令->管理节点->api->调度->工作节点(创建task容器,维护创建)Node一个Dokcer节点(好比餐桌),多个节点就组成一个网络集群;(管理节点,工作节点)Service任务群(好比一个做菜清单),可以在管理节点或者工作节点来运行;核心。用户访问Task容器内的命令=细节任务(好比做菜清单的一道菜);一个Service有多个ta

2021-04-19 22:23:02 119

原创 Docker11: raft协议+弹性创建项目

raft协议问题:假设一个节点挂了,其他节点是否可用?Raft协议:保证大多数节点存活;>1,集群>3以下01 02 03 03 指的是四台服务器#将docker1机器停止,宕机#docker-01systemctl stop dockerdocker-02 docker-04docker node ls[root@VM-0-8-centos ~]# docker node lsError response from daemon: rpc error: code = Dea

2021-04-19 21:15:08 221

原创 Docker11: docker swarm

docker swarmhttps://docs.docker.com/get-started/overview/How nodes work扩缩容操作都在manager上。就像redis,从机是没办法操作的。至少三个,因为2个才多数。2-1就没有意义了。raft:一致性算法搭建集群#docker-01/02/03/04 查看网络情况、命令使用方法docker network lsdocker swarm --help--------------------------------

2021-04-19 18:53:09 133

原创 Docker10: docker compose

docker compose定义并运行多个容器YAMLfile配置文件; 命令有哪些?;所有环境都可以使用Compose原先:Dockerfile build run ,手动操作单个容器;微服务100个;现在:DockerCompose来轻松高效地管理容器,定义运行多个容器。三步骤:Dockerfile: 保证项目在任何地方可以运行docker-compose.yml 如何写;定义什么是服务docker compose up 启动项目(类似于docker run)总结:批量容器编排.

2021-04-19 16:36:48 375

原创 Docker08: docker网络

理解Docker 0清空下前面的docker 镜像、容器# 删除全部容器$ docker rm -f $(docker ps -aq)# 删除全部镜像$ docker rmi -f $(docker images -aq)我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!https://www.cnblogs.com/bakari/p/10613710.html

2021-04-18 21:14:07 116

原创 Docker07: Tomcat镜像实现

1、准备镜像文件准备tomcat 和 jdk 到当前目录,编写好README2、编写dokerfile$ vim dockerfileFROM centos # 基础镜像centosMAINTAINER cao<1165680007@qq.com> # 作者COPY README /usr/local/README # 复制README文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/ # 添加j

2021-04-18 13:30:25 167

原创 Docker06: dockerfile

什么是dockerfileDockerfile 就是用来构建docker镜像的构建文件!命令脚本!先体验一下!通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令都是一层!# 创建一个dockerfile文件,名字可以随便 建议Dockerfile# 文件中的内容: 指令(大写) + 参数$ vim dockerfile1 FROM centos # 当前这个镜像是以centos为基础的 VOLUME ["volume01","volume02"]

2021-04-18 13:13:58 143

原创 Docker05: 容器数据卷volume和挂载

什么是容器数据卷将应用和环境打包成一个镜像!运行的时候就变成一个容器。数据?如果数据都在容器中,那么我们容器删除,数据就会丢失。需求:数据可以持久化。例如MySQL数据可以存储在本地。容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地。这就是卷技术。目录的挂载,将我们容器内的目录,挂载到Linux上面!总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的。数据卷的使用方式一 :直接使用命令挂载 -v目录映射!类似于端口映射-v, --volume lis

2021-04-17 14:19:10 275

原创 Docker03: 简单部署

部署Nginx:#1. 搜索镜像 search => docker search nginx#2. 拉取下载镜像 pull=> docker pull nginx#3. 查看是否下载成功镜像=> docker images#3. 运行测试# -d 后台运行# --name 给容器命名# -p 宿主机端口:容器内部端口 相当于一个映射!! => docker run -d --name nginx01 -p 3344:80 nginxaa664b0c8e

2021-04-17 10:28:19 91

原创 Docker02: 镜像命令+容器命令

Docker的常用命令帮助命令docker version #显示docker的版本信息。docker info #显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令https://docs.docker.com/engine/reference/commandline/镜像命令docker images #查看所有本地主机上的镜像 可以使用docker image ls代替docker search #搜索镜像docker

2021-04-16 10:51:53 93

原创 Docker01: 入门和安装

Docker概述docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)-----运维人员下载镜像-----直接运行隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。Docker和虚拟机:传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

2021-04-15 21:14:17 66

原创 JVM复盘

编译流程内部组成栈:三部分:类装载子系统+内存模型+字节码执行引擎内存模型:虚拟机栈(线程栈):局部变量就是放在栈帧里操作数栈:和字节码+程序计数器有关。程序在运行过程中放数字的(例如a=1的1),临时存放数字的空间。程序计数器:程序计数器是用于存放执行指令的地方。 为了保证程序(在操作系统中理解为进程)能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。 它的值是字节码执行引擎来修改的。动态链接:把符号引用转变为

2021-03-29 18:41:58 103

原创 zookeeper01: 入门

工作机制文件系统+通知机制特点1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。4)更新请求顺序进行,来自同一个Client的更新请求按其发送顺序依次执行。5)数据更新原子性,一次数据更新要么成功,要么失败。6)实时性,在一定时间范围内,Client能读到最新数据

2021-03-18 20:46:41 108

原创 LogCollector07: LogTransfer

需要完成什么?程序启动加载配置文件:左边连接哪个kafka,连的kafka的topic是什么。右边连哪个es,es哪个索引,按照什么样的频率去写?[kafka]address=127.0.0.1:9092topic=web_log[es]address=192.168.0.106:9200index=webmax_chan_size=10000goroutine_num=16在model包中,建立config的struct。在main中:1.加载配置文件。2.连接es。(封装.

2021-03-13 16:21:05 151

原创 LogCollector08: 总结

1.项目架构2.为什么不用elk3.如何保证日志不丢失?重启后能继续收集。发给kafka,发一条会有一个ack。记录读到哪个日志文件的offset。万一重新启动了,可以继续收集日志。4.kafka几种模式5.etcd的watch原理。最底层用的websocket。6.es相关知识点。etcd里有各个服务器日志存放的路径,它们各不相同。拿着ip,拼了一个字段key,去etcd里拉取配置。(用占位符拼接)然后就是logagent。读配置文件,连接etcd,连接之后暂时能获取一次配置。拿

2021-03-13 16:20:44 350 1

原创 Mysql Review

数据结构B树:有序。一个节点里由多个元素。B+树:非叶子节点的元素冗余了一份在叶子节点。叶子结点之间有一个指针。(在mysql中是双向链表)有序的。innodb页innodb负责从磁盘拿数据。一页16kb(最小基本单位)为什么要这个页:涉及到操作系统的页(一页4kb)。如果不考虑页,执行这个语句:会扫整个表。例如下图一行数据大概20b,一页16kb,如果想取到a=7,需要1次磁盘io即可。这16kb里又包含了什么?innodb做了一些事来提升查询速度。这16kb并不完全存用

2021-03-12 22:22:53 148

原创 LogCollector07: Kibana

Kibana介绍与安装kibana可以用来搜索、查看并和寸纯在elasticsearch索引中的数据进行交互。brew install kibana保证和es都是v7修改配置文件:为什么不用filebeat而写一个logagent?服务器太多,没必要filebeat一个个要写配置。我们把logagent的配置文件放在etcd里,相当于做了web的一个配置中心。logagent做了一个实时watch,从etcd里把最新的收集项的配置拿到,这样就不用去服务器改配置文件了。公司有现成的配置中心,

2021-03-12 20:03:06 111

原创 LogCollector06: ElasticSearch

ElasticsearchElasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。Elasticsearch能做什么当你经营一家网上商店,你可以让你的客户搜索你卖的商品。在这种情况下,你可以使用E

2021-03-11 23:23:15 134

原创 LogCollector04: Grafana可视化工具

grafana展示数据的工具,监控数据可视化搜索引擎找官网下载下载地址:https://grafana.com/grafana/download安装mac:brew install grafana位置:/usr/local/Cellar/grafana/7.4.3启停命令通过下面命令可以后台启动/停止grafana,默认端口3000// startbrew services start grafana// stopbrew services stop grafana浏览

2021-03-11 19:58:56 236

原创 LogCollector05: SysTransfer

系统架构梳理为什么不直接写在influxdb里呢?部署信息收集的工具和grafana不在一个机器上。上千台机器全部往influxdb里写,数据容易丢(influx集群服务需要收费),但是延迟增加了。为了解决延迟性的问题,写入influxdb的时候多起几个goroutine,只要发送到kafka立刻读出来。...

2021-03-11 19:56:53 97

原创 LogCollector03: influxDB

influxDB好处:每隔五秒收集一次上章几个维度的数据,放在mysql里非常占数据,且io查询相当慢。需要一种按时间来索引的时序数据库,它按时间存储。InfluxDB是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。安装下载https://portal.influxdata.com/downloads/】Mac和Linux用户可以点击https://v2.docs.influxdata.com/v2.0/get-started/下载。

2021-03-11 15:03:45 133

原创 LogCollector02: gopsutil

gopsutilpsutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。本文介绍了它的基本使用。Go语言部署简单、性能好的特点非常适合做一些诸如采集系统信息和监控的服务,本文介绍的gopsutil库是知名Python库:psutil的一个Go语言版本的实现。安装go get github.com/shirou/gopsutil使用:采集CPU相关信息:import "github.com/shirou/gopsutil/cpu"// cpu in

2021-03-11 13:34:27 272

原创 网络编程06:NIO chat room实现(3)客户端

NIO 模型实现 ChatClientstart:获得客户端channel,设置为非阻塞。打开监听器selector,注册connect事件(服务端接受客户端的请求,会返回并触发客户端的connect)。然后发起连接请求。在whie循环中不断监听,一旦有事件触发,通过selectedKeys得到返回的集合,遍历这些key,一一handle。处理完用clear清空。handles:处理CONNECT事件—连接就绪事件:拿到客户端对应的channel。等连接建立好后,创建新线程(UserInputHa

2021-03-09 19:31:42 203

原创 网络编程06:NIO chat room实现(2)服务端

NIO 模型实现 ChatServerChannel 负责传输, Buffer 负责存储。1.与bio相同的地方:端口号、关键字、缓冲区大小。2.不同之处:bio用serversocket,nio用ServerSocketChannel,与之对应需要实现2个byte对象。bio用了线程池复用线程,nio用单线程解决即可,需要加入selector。start过程:打开ServerSocketChannel,设置为非阻塞,把它绑定到监听端口。创建selector,在服务端channel上注册acce

2021-03-09 16:51:57 147

原创 JVM性能调优和GC的心得

一些问题调优主要在堆中:JVM中如何判断垃圾:可达性分析算法(用来判断对象是否存活)根:GCRoots切断以后就可以被回收了。而可达意味着不是垃圾,不可达意味着是垃圾。python中用的是计数器法,如果有对象引用它,就计数,计数为0,则为垃圾。但是相互引用就有问题了。为什么要根可达算法?Long l = 1200L; 涉及到装箱拆箱操作,本质上等于Long l = Long.valueof(1200);会new Long();ß ß由于成员变量的引用不是.

2021-03-08 21:28:26 205

原创 JMeter压测

JMeterJMeter官网:http://jmeter.apache.org/download_jmeter.cgi压测时候碰到空指针:cookie可能为空,要提前判断10000个线程:mysql自定义变量模拟多用户1.测试计划 添加配置元件 CSV Data Set Config2.引用变量${}可以用配置文件,导入多用户信息。关于循环次数:https://blog.youkuaiyun.com/u013908944/article/details/97383303...

2021-03-08 21:27:13 192

原创 高并发场景秒杀

1.超卖分布式锁:入门级别:问题:容易死锁;系统宕机,用trycatchfinally都解决不了。加个超时expire?还是有问题:expire+setnx仍有问题:线程1可能把线程2的锁删了问题:正准备判断是不是自己锁的时候,卡顿了一下方法:最后两行原子性执行源码:lua脚本zokeeper:过半的分布式锁同步成功了,客户端才会进行。数据一致性比redis好。redlock:缓存数据库双写不一致问题解决方法

2021-03-08 21:26:31 102

SpringSecurity.pdf

SpringSecurity.pdf

2021-07-18

空空如也

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

TA关注的人

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