Tomcat底层原理 目录前言Tomcat底层架构组成前言1、Tomcat是一个Servlet容器。2、使用Java代码模拟一个Tomcat容器:class Tomcat{ List<Servlet> servlets; Connector connect;//处理请求,生成了Request}3、回顾servlet的定义public class MyHttpServlet extends HttpServlet { @Override protected void doGet(H
mybatis如何开启batch模式 一般来说,对于SSM项目工程来说,mybatis的ExectoryType默认是simple,那么又如何能动态使用batch模式呢?直接上源码实现干货:import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessi
设计模式(三)结构型模式 目录1、适配器模式类适配器模式对象适配器模式接口适配器模式结构型模式:解决的是,怎么让我们的软件更加的有伸缩性、扩展性。1、适配器模式基本介绍:1)适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)2)适配器模式属于结构型模式3)主要分为三类:类适配器模式、对象适配器模式、接口适配器模式类适配器模式被适配者:220V电压public class V
设计模式(二) 目录1、设计模式概述和分类1.1、设计模式介绍1.2、设计模式类型2、单例模式1、设计模式概述和分类1.1、设计模式介绍1)设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。2)设计模式的本质提高 软件的维护性,通用性和扩展性,并降低软件的复杂度。3)<<设计模式>> 是经典的书,作者是
Spring的单例bean与原型bean的区别和创建过程 1、Spring官方文档中给出的bean的scope有五种singletonprototyperequestsessionglobal session实际上,Spring最基本的scope只有两种,即singleton和prototype。可以参看spring源码中的BeanDefinition.java的定义,只有这两种:String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;String SCOPE_PROT
基于Btrace的监控调试 目录简介1、Btrace是什么?2、Btrace的使用限制?3、Btrace能做什么?安装使用1、获取方法的参数值2、拦截构造函数、同名函数2.1 拦截构造函数2.1 拦截同名方法简介1、Btrace是什么?在生产环境中经常遇到格式各样的问题,如OOM或者莫名其妙的进程死掉。一般情况下是通过修改程序,添加打印日志;然后重新发布程序来完成。然而,这不仅麻烦,而且带来很多不可控的因素。有没有一种方式,在不修改原有运行程序的情况下获取运行时的数据信息呢?如方法参数、返回值、全局变量、堆栈信息等。Btrace
设计模式(一) 目录1、前言2、设计模式的七大原则单一职责原则1、前言编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好1)代码重用性 (即:相同功能的代码,不用多次编写)2)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)3)可扩展性 (即:当需要增加新的功能时,非常的方便,称为可维护)4)可靠性 (即:当我们增加新的功能后,对原来的功能没有影响)5)使程序呈现高内聚,低耦合的特性2、设计模式的七大原
presto的安装部署 1、自行下载presto安装包https://prestodb.io/docs/current/installation/deployment.html2、解压,并同级新建一个data目录data 用于存储日志、本地元数据等的数据目录。 建议在安装目录的外面创建一个数据目录。这样方便Presto进行升级。3、生成配置在安装目录中创建一个目录 etc , 加入以下配置: 节点属性:特定于每个节点的环境配置 --- etc/node.properties JVM Config:Jav
Mybatis-Plus(二) 目录1、逻辑删除2、自动填充1、逻辑删除配置文件:#逻辑未删除,设置为0mybatis-plus.global-config.db-config.logic-not-delete-value=0#逻辑删除,设置为1mybatis-plus.global-config.db-config.logic-delete-value=1实体类:对应的逻辑删除字段就上注解@TableLogic测试: @Autowired private UserMapper userMapper;
统计git提交次数+区域时间内提交次数+提交行数 统计git提交次数: 所有人的所有提交次数,会展示所有的提交人 提交次数详情。git log | grep "^Author: " | awk '{print $2}' | sort | uniq -c | sort -k1,1nr统计时间内提交次数。git log --author=yourname --since="2017-08-01" --no-merges | grep -e 'commit [a-zA-Z0-9]*' | wc -l统计提交行数:根据1展示出详情,可以填入u.
Mybatis-Plus入门(一) 目录1、简介2、快速入门3、基本使用传统模式通用mapper常用注解排除非表字段的三种方式4、MyBatis-Plus查询方法1、简介Mybatis-plus简介:Mybatis增强工具,只做增强,不作改变,简化开发,提高效率。官网地址:https://mybatis.plus/github项目地址:https://github.com/baomidou/mybatis-plus框架结构:MP在mybatis启动的时候,它在mybatis的xml和注解注入之后,紧接着反射分析实体,然后注入到底
Maven聚合工程 父工程pom:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0
shell入门(六) 目录1、case语句2、函数1、case语句case语句为多重匹配语句如果匹配成功,执行相匹配的命令语法结构说明:pattern表示需要匹配的模式case var in 定义变量;var代表是变量名pattern 1) 模式1;用 | 分割多个模式,相当于or command1 需要执行的语句 ;; 两个分号代表命令结束pattern 2) command2
shell入门(五) 目录1、随机数1、如何生成随机数2、随机产生以139开头的电话号码3、随机抽出5位幸运观众① 思路② 落地实现4、批量创建用户(密码随机产生)① 思路② 落地实现1、随机数1、如何生成随机数RANDOM,随机会产生0-32767的随机整数产生一个随机数[root@localhost ~]# echo $RANDOM13214产生0-10之间的随机数,只需要取余11[root@localhost shellDemo]# echo $[RANDOM%11]6产生1-50之间的随机数[roo
jdk9和jdk11 这里写目录标题一、JDK11IDEA切换到JDK111、Jshell(java9开始)2、Dynamic Class-File Constants类文件新添的一种结构3、局部变量类型推断(var "关键字")4、新加一些实用的API4.1、集合of4.2、集合copyOf一、JDK11安装jdk11IDEA切换到JDK111、Jshell(java9开始)启动jshell就相当于进入 main方法,直接敲代码执行就可以了。简而言之,使用 JShell,你可以输入代码片段并马上看到运行结
动态规划 目录例子1:买卖股票的最佳时机例子2:最大子序和例子3:青蛙跳台阶问题例子4:把数字翻译成字符串https://blog.csdn.net/qq_40963043/article/details/100765212https://blog.csdn.net/kongmin_123/article/details/82430985动态规划的基本思想:保存子问题的结果,避免重复计算用额外的数据结构保存空间换时间大问题可以由子问题推出(状态转移)dp是没有递归,因为用数组存储前置结果,用这些结
shell入门(四)——循环语法结构 目录1、for循环语法结构列表循环不带列表循环类C风格的for循环2、for循环语法结构1、脚本计算1-100奇数和1、for循环语法结构列表循环列表for循环:用于将一组命令执行已知的次数基本语法格式for variable in {list} do command command … done或者for variable in a b c do command
shell入门(三)——四则运算与流程控制 目录1、简单的四则运算2、四则运算符号3、了解i++和|++i4、条件判断语法结构4.1、 ==条件判断语法格式==4.2、条件判断相关参数==判断文件类型==判断文件权限判断文件新旧1、简单的四则运算算术运算:默认情况下,shell就只能支持简单的整数运算运算内容:加(+)、减(-)、乘(*)、除(/)、求余数(%)2、四则运算符号表达式举例$[ ]echo $[10-5]$(( ))echo $((1+1))exprexpr 10 / 5 ;
Shell入门(二)——简介与变量 目录1、文本处理工具1.1、grep1.2、grep使用1.3、cut1.4、练习shell编程的目的:编写一些自动化脚本工具,减轻维护成本shell编程就是对一堆Linux命令的逻辑化处理。1、文本处理工具Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。https://blog.csdn.net/sj349781478/article/details/829309821.1、grepgrep是行过滤工具,用于根据关键字进行行过滤。语法:grep 【可
shell入门(一)——文本处理工具 目录1、文本处理工具1.1、grep[过滤出行]1.2、grep使用1.3、cut【截取列】1.4、练习11.4、sort【排序,去重】1.5、uniq工具【去重】1.6、tee工具【结果屏幕输出一份,文件输出一份】1.6、diff工具【比较两个文件内容的异同】1.7、paste工具【合并文件行】1.8、tr工具【用于字符的转换】1.9、练习21.10、练习31、文本处理工具Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。https://blog.csdn.net
Rabbitmq集群与镜像队列 目录1、集群架构1.1、普通集群(副本集群)1.2、普通集群搭建1.3、镜像集群1.4、 镜像集群怎么搭?1、集群架构1.1、普通集群(副本集群)1、master主节点上的所有数据都会同步到Slave从节点上,但是有一个意外,就是队列,master主节点上的队列不会同步到其他从节点上,尽管其他从节点可以看到和访问这个队列,实际上这个队列只存在于主节点中。因此,该集群也叫主从复制集群。【注意:从节点上还是有队列的结构,只是消息实体只存在于主节点master上】2、当消息进入主节点master时,消费
lru实现 最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:https://www.cnblogs.com/kyoner/p/11179766.html1、新数据插入到链表头部;2、每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3、当链表满的时候,将链表尾部的数据丢弃。【命中率】当存在热点数据时,LRU的效率很好,但偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。【复杂度】实现简单。【代价】命中时需要遍历链表,找到命中的数据块索引,然后需要将数据移到
Mysql中的MVCC(多版本并发控制) 目录1、MySQL的逻辑架构1.1、redo log日志1.2、binlog 日志1.3、redo log和binlog区别1.4、undo log(回滚日志)2、MVCC是啥2.1、什么是当前读和快照读?2.1、MVCC作用3、MVCC的实现原理3.1、隐式字段3.2、行的更新过程3.3、Read View(读视图)3.4、MVCC 整体流程RC,RR级别下的InnoDB快照读有什么不同?附录1、MySQL的逻辑架构1.1、redo log日志redo log(重做日志):redo log是Inn
Redis底层 目录1、什么是redis2、应用场景3、DB数据结构3.1、`RedisDB`数据结构:`redis`数据库默认有`16`个库。3.2、Redis的五种数据结构的内部编码4、String数据结构4.1、redis3.2以前sds4.1、redis3.2后sds5、bitMap(bitset,位图)数据结构6、redis单线程模型6、redis6.0多线程工作模型7、list数据结构7.1、redis阻塞队列实现7.2、list底层实现7.2、ziplist压缩列表7.3、quicklist快速列表8、has
Java8 并行流原理 目录一、并行流的简单使用1、我的`CPU`为8核,为啥只有七条线程?2、如何控制`parallize`的线程数?二、源码解析一、并行流的简单使用 public static void main(String[] args) throws InterruptedException { //设置睡眠时间,方便visualVM监控到当前应用 Thread.sleep(25000); //groupingBy分组 键就是组名【返回值做组名】,Map的值就是该组的
synchronized底层原理 目录1、用户态与内核态2、使用工具查看对象的内存布局3、synchronized字节码4、监视器对象(管程对象或Monitor)1、EntryList阻塞队列2、WaitSet等待集合5、锁升级1、JDK对锁的优化2、锁对象头 - Mark Work部分3、synchornized锁的升级1、偏向锁https://www.jb51.net/article/183984.htmhttps://blog.csdn.net/mulinsen77/article/details/88635558https:/
Springboot默认tomcat容器改为Undertow 目录Undertow是啥Springboot使用UndertowUndertow是啥Undertow是Red Hat公司的开源产品, 它完全采用Java语言开发,是一款灵活的高性能Web服务器,支持阻塞IO和非阻塞IO。由于Undertow采用Java语言开发,可以直接嵌入到Java项目中使用。同时, Undertow完全支持Servlet和Web Socket,在高并发情况下表现非常出色。undertow 是一个服务器,在相同资源使用量的情况下 undertow 比 tomcat 有更好的吞吐量和较
k8s入门 目录简介一、k8s -调度二、k8s自动恢复三、水平伸缩功能总结架构一、整体架构二、主节点`master`架构概念集群搭建一、环境准备二、所有节点安装Docker,kubeadm,kubelet,kubectl三、部署k8s - master基本操作体验一、部署一个tomcat二、暴露部署的tomcat,以便访问三、动态扩容四、删除简介k8s简单说就是帮我们分布式的部署起整个系统以及管理系统。部署管理服务器集群的一个东西中文文档:https://kubernetes.io/zh/一、k8s -调度
Spring定时任务&Springboot异步任务 cron表达式语法:秒 分 时 日 月 周 年(spring不支持)http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html实例:在线生成cron表达式:https://cron.qqe2.com/Springboot整合定时任务和异步任务定时任务1、开启定时任务@EnableScheduling2、@Scheduled 开启一个定时任务2、自动配置类TaskSched
幂等性 1.什么是幂等性?幂等性:提交一次和多次,结果是一样的。2.哪些情况需要保证幂等性?用户多次点击按钮;用户页面回退再次提交;微服务相互调用,由于网络原因,导致请求失败,feign触发重试机制;其他业务情况;3.什么情况下需要幂等性?以SQl为例,有些操作时天然幂等。select * from table where id =? 无论查询多少次都不会改变状态,是天然幂等的。update table set col=1 where col2=2,无论执行操作多少次都不会改变状态,是天然幂等的
Feign远程调用丢失请求头问题 1.debug Feign远程2.3.远程调用实际是new 了一个新的RequestTemplate,并没有把之前请求的header给设置进去4.5.可以通过拦截器,拦截请求,然后在给请求设置上,原请求的header信息即可图解:解决:@Configurationpublic class FeignConfig { @Bean public RequestInterceptor requestInterceptor(){ return new R
RabbitMQ 大多数应用中,可通过消息服务中间件来提升系统异步通信,扩展解耦能力消息服务中两个重要概念:消息代理(message broker)和目的地(destination)当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地消息队列主要有两种形式的目的地队列(queue):点对点消息通信主题(topic):发布(publish)/订阅(subscribe)消息通信点对点式:消息发送者发送消息,消息代理将其放入一个队列中,消息接受者从队列中获取消息内容,消息..
Session共享问题 目录session原理Session共享问题集群环境下的`session`共享问题分布式环境下的`session`共享问题Session解决方案方案一:session复制方案二:客户端存储方案三:hash一致性方案四:统一存储不同服务,子域session共享session原理1、用户第一次访问服务器,进行登录;2、服务器把用户信息保存到session中,由sessionManager管理着;可以简单理解session为map,为服务器的一片内存空间3、浏览器保存一个jsessionid=123的co
MD5&加盐&BCrypt盐值加密 MD5Message Digest algorithm 5,信息摘要算法压缩性:任意长度的数据,算出的MD5值长度都是固定的。容易计算:从原数据计算出MD5值很容易。抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。不可逆加盐通过生成随机数与MD5生成字符串进行组合数据库同时存储MD5值与salt值。验证正确性时使用salt进行MD5即可 @Test .
Spring MVC RedirectAttributes的用法解决办法 RedirectAttributes是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的他有两种带参的方式:第一种:attr.addAttribute(“param”, value);这种方式就相当于重定向之后,在url后面拼接参数,这样在重定向之后的页面或者控制器再去获取url后面的参数就可以了,但这个方式因为是在url后面添加参数的方式,所以暴露了参数,有风险例:attr.addAttribute(“name”, “123”);attr.addAttri
SpringCache 目录简介整合SpringCache简化缓存开发@Cacheable使用原理自定义缓存配置@CacheEvict的使用SpringCache的不足简介给每一个需要缓存的业务加上缓存的使用逻辑。缓存的使用,就得考虑缓存的两种用法模式读模式:先从缓存中读取,缓存没有,在从数据库中读取,并把数据放到缓存中,然后返回数据写模式:如何保证缓存与数据库中的数据是一致的?可以使用双写模式或者失效模式双写模式:写完数据库,缓存跟着改一下失效模式: 写完数据库,对应的缓存删了,等待下次主动查询,更新缓存即可
Redisson分布式锁框架 目录概述使用体会Redisson的分布式锁看门狗机制读写锁闭锁(CountDownLatch)信号量(Semaphore)概述Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semap
docker安装mysql,Redis 目录镜像仓库搜索mysql下载mysql镜像启动mysql镜像navicat连接mysql修改mysql配置镜像仓库搜索mysqlhttps://hub.docker.com/我这里选择5.7版本的镜像docker pull mysql:5.7下载mysql镜像下载:[root@localhost ~]# docker pull mysql:5.7Trying to pull repository docker.io/library/mysql ... 5.7: Pulling f
JVM(九)对象的实例化内存布局与访问定位 目录相关面试题对象的实例化创建对象的方式对象创建步骤第一步:判断对象对应的类是否加载,链接,初始化第二步:为对象分配内存第三步 处理并发安全问题第四步 属性的默认初始化第五步 设置对象的对象头第六步 执行init方法进行初始化对象的内存布局对象头实例数据对齐填充(Padding)小结对象的访问定位句柄访问方式直接指针方式new对象是放在堆空间,类型信息是放在方法区,方法的局部变量放在栈空间。new了一个对象,怎么把这三块粘合在一起?相关面试题美团:对象在JVM是怎么存储的?对象头信息里面有哪些东西
雪花算法 目录为什么需要分布式全局唯一ID以及分布式ID的业务需求ID生成规则部分硬性要求ID号生成系统的可用性要求一般通过方案UUID数据库自增主键基于redis生成全局id策略雪花算法结构源码工程落地经验优缺点https://zhuanlan.zhihu.com/p/152179727为什么需要分布式全局唯一ID以及分布式ID的业务需求在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识。拿MySQL数据库举个栗子:在我们业务数据量不大的时候,单库单表完全可以支撑现有业务,数据再大一点搞个M
RocketMQ高级 目录消息持久化存储介质消息的存储和发送消息存储消息读取消息存储结构消息持久化分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除
RocketMQ入门(三) 目录springboot整合rocketmq生产者消费者springboot整合rocketmq生产者依赖:<properties> <java.version>1.8</java.version> <rocketmq-spring-boot-starter-version>2.1.0</rocketmq-spring-boot-starter-version></properties><depende
RocketMQ入门(二) 目录消息发送样例基本样例消息发送发送同步消息发送异步消息发送单向消息消息消费消费消息基本流程负载均衡模式广播模式顺序消息顺序消息生产顺序消费消息延时消息批量消息过滤消息SQL基本语法事务消息消息发送样例依赖:<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>
RocketMQ入门(一) 目录MQ介绍应用解耦流量削峰数据分发MQ的优点和缺点各种MQ产品的比较RocketMQ快速入门MQ介绍为什么要用MQ?消息队列是一种“先进先出”的数据结构。其应用场景主要包含以下3个方面:应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,
SpringCloud高级(四) ——SpringCloud Alibaba Seata原理简介 目录Seata之原理简介AT模式一阶段加载二阶段提交二阶段回滚debug深入源码Seata之原理简介TC,TM,RM理解:TC通过统一的Xid协调RM。分布式事务的执行流程:TM开启分布式事务(TM向TC注册全局事务记录)。加注解GlobalTransactional即开启换业务场景,编排数据库,服务等事务内资源(RM向TC汇报资源准备状态)TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)TC汇总事务信息,决定分布式事务是提交还是回滚TC通知所有RM提交/回滚资源
SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇四 目录@SentinelResource按资源名称限流+后续处理按照Url地址限流+后续处理上面兜底方法面临的问题客户自定义限流处理逻辑更多注解属性说明@SentinelResource按资源名称限流+后续处理启动Nacos成功,启动Sentinel成功。业务类:@RestControllerpublic class RateLimitController { @GetMapping("/byResource") @SentinelResource(value = "byResou
SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇五 目录服务熔断功能Ribbon系列准备工作演示fallback@SentinelResource没有任何配置只配置fallback只配置blockHandlerfallback和blockHandler都配置忽略属性...Feign系列规则持久化问题1:修改nacos里的sentinel规则,能同步到sentinel里吗?问题2:修改sentinel里的规则,能同步到nacos里吗?Sentinel控制台改造:规则同步到Nacos服务熔断功能sentinel整合ribbon+openFeign+fallb
SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇三 目录降级规则基本介绍降级策略实战RT异常比例异常数热点参数限流(重点,务必掌握)承上启下复习start源码出处测试参数例外项系统规则是什么各项配置参数说明配置全局QPS降级规则基本介绍RT:平均响应时间,超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足触发降级,窗口期过后关闭断路器。RT最大4900(更大需要通过-Dcsp.sentinel.statistic.max.rt=xxx才能生效)异常比例(秒级):QPS>=5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束
SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇二 目录流控规则简介基本介绍流控模式直接(默认)流控效果:QPS与线程数的区别关联链路流控效果直接->快速失败(默认的流控处理)预热Warm Up排队等待流控规则简介基本介绍流控模式直接(默认)接口达到限流条件时,直接限流。一秒内访问次数超过一,直接快速报错思考???这个默认的报错,我们应该能自定义吧。流控效果:QPS与线程数的区别QPS:表示如果1秒内的请求数超过了,设置的阈值,限流,直接不让进。这个是御敌于国门之外线程数:假设阈值是1,表示请求全部接受,但是只有一条线程
SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇一 目录简介是什么Hystrix与Sentinel对比能干嘛怎么玩安装安装Sentinel控制台初始化演示工程新建Module流控规则简介基本介绍流控模式直接(默认)流控效果:QPS与线程数的区别关联链路流控效果直接->快速失败(默认的流控处理)预热Warm Up排队等待简介是什么Sentinel是一个轻量级的流量控制,熔断降级的java库。分布式系统的流量防卫兵。Hystrix豪猪哥的阿里版。Hystrix与Sentinel对比能干嘛秒杀,抢红包,抢金条,抽奖等形式多种多样的活动,本质上这
nginx入门(二) 目录Nginx 的常用的命令`nginx`配置文件`nginx.conf`组成Nginx配置实例——反向代理需求1需求2location 指令说明Nginx配置实例——负载均衡需求1nginx 分配服务器策略Nginx配置实例——动静分离Nginx 的常用的命令sbin目录下:1、查看 nginx 版本号./nginx -v 2、启动 nginx./nginx或指定配置文件启动./nginx -c /root/nginx/nginx-1.18.0/conf/nginx.conf3、停止
SpringCloud高级(二) ——SpringCloud Alibaba Nacos篇三 目录Nacos集群和持久化配置(重要)Nacos持久化配置解释derby到mysql切换配置步骤Nacos集群和持久化配置(重要)官网集群部署说明:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html架构图:官网说明:https://nacos.io/zh-cn/docs/deployment.htmlNacos持久化配置解释Nacos默认自带的是嵌入式数据库derby:https://github.com/alibaba/na
SpringCloud高级(二) ——SpringCloud Alibaba Nacos篇二 目录Nacos作为服务配置中心演示在`Nacos`中添加配置信息理论实操Nacos作为配置中心-基础配置Nacos作为配置中心-分类配置`Nacos`的图形化管理界面Namespace+Group+Data ID三者关系?为什么这么设计?Nacos作为服务配置中心演示在Nacos中添加配置信息Nacos中的匹配规则。理论Nacos中的dataId的组成格式与SpringBoot配置文件中的匹配规则实操设置DataId:假设配置文件里:spring: profiles:
SpringCloud高级(二) ——SpringCloud Alibaba Nacos篇一 目录Nacos简介是什么能干嘛去哪下各种注册中心比较安装并运行NacosNacos服务注册中心功能基于Nacos的服务提供者测试为演示nacos的负载均衡,参照9001新建9002基于Nacos的服务消费者Nacos简介是什么一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。简单说:Nacos就是注册中心+配置中心的组合等价于:Nacos = Eureka+Config+Bus阿里牛逼~能干嘛替代Eureka做服务注册中心替代Config做服务配置中心去哪下github地
SpringCloud高级(一) ——SpringCloud Alibaba入门简介 目录为什么会出现SpringCloud alibaba什么是维护模式?进入维护模式意味着什么呢?SpringCloud alibaba带来了什么?是什么能干嘛怎么玩SpringCloud alibaba学习资料获取为什么会出现SpringCloud alibabaSpring Cloud Netflix项目进入维护模式:https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now什么是维护模式?翻译一下:
SpringCloud中级(六) ——SpringCloud Sleuth分布式请求链路追踪 目录概述为什么会出现这个技术?需要解决哪些问题?是什么搭建链路监控步骤zipkin监控平台服务提供者服务消费者(调用方)测试概述为什么会出现这个技术?需要解决哪些问题?在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果, 每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延迟或错误都会引起整个请求最后的失败。是什么Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案。在分布式系统中提供追踪解决方案并且兼
SpringCloud中级(五) ——SpringCloud Stream消息驱动 目录SpringCloud Stream消息驱动为什么被引入消息驱动概述是什么设计思想标准MQ:为什么用Cloud Streamstream凭什么可以统一底层差异Stream中的消息通信方式遵循了发布-订阅模式Spring Cloud Stream标准流程套路编码API和常用注解消息驱动之生产者SpringCloud Stream消息驱动为什么被引入为什么被引用?解决的痛点是什么
计算机网络入门(四)——TCP协议的3次握手与4次挥手过程详解 目录来源TCP报文格式来源https://blog.csdn.net/weixin_45160969/article/details/99240740?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineL
SpringCloud中级(四)——SpringCloud Bus 消息总线 目录概述是什么能干嘛为何被称为总线RabbitMQ环境配置SpringCloud Bus动态刷新全局广播再增加一个配置中心客户端设计思想Bus动态刷新全局广播配置实现给cloud-config-center-3344配置中心服务端添加消息总线支持给cloud-config-center-3355客户端添加消息总线支持给cloud-config-center-3366客户端添加消息总线支持测试印证原理概述上一章的加深和扩充,一言以蔽之。分布式自动刷新配置功能:Spring Cloud Bus + Spri
计算机网络入门(三)——快速理解TCP协议 目录TCP 协议的作用TCP 数据包的大小TCP 数据包的编号(SEQ)TCP 数据包的组装慢启动和 ACK数据包的遗失处理总结TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层,有着自己的分工。TCP 是以太网协议和 IP 协议的上层协议,也是应用层协议的下层协议:最底层的以太网协议(Ethernet)规定了电子信号如何组成数据包(packet),解决了子网内部的点对点通信。但是,以太网协议不能解决多个局域网如何互通,这由 IP 协议解决。 IP 协议可以连接多个局域网。IP
计算机网络入门(二)——快速理解网络通信协议下 目录上篇小结用户上网设置静态IP地址动态ip地址DHCP协议上网设置小结一个实例:访问网页本机参数DNS协议子网掩码应用层协议TCP协议IP协议以太网协议服务器端响应上篇小结我们已经知道,网络通信就是交换数据包。电脑A向电脑B发送一个数据包,后者收到了,回复一个数据包,从而实现两台电脑之间的通信。数据包的结构,基本上是下面这样:发送这个包,需要知道两个地址:对方的MAC地址;对方的IP地址。有了这两个地址,数据包才能准确送到接收者手中。但是,前面说过,MAC地址有局限性,如果两台电脑不在
SpringCloud中级(三) ——SpringCloud config分布式配置中心 目录概述分布式系统面临的配置问题是什么?怎么玩?能干嘛?与Github整合配置官网Config服务端配置与测试Config客户端配置与测试概述分布式系统面临的配置问题是什么?怎么玩?能干嘛?集中管理配置文件不同环境不同配置,动态化的配置更新,分环境部署。比如dev/test/prod/beta/release运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。当配置发生变动时,服务不需要重启即可感知到配置的变化并应用新的配置将
SpringCloud中级(二) ——Gateway新一代网关 目录概述简介概述有了Zuul了怎么又出来了gateway模型比较三大核心概念Gateway工作流程入门配置测试Gateway网关路由有两种配置方式第一种:在配置文件yml中配置第二种:代码中注入RouteLocator的Bean通过微服务名实现动态路由示例代码中注入RouteLocator的BeanPredicate断言的使用是什么常用的Route PredicateAfter Route PredicateCookie Route Predicate概述简介官网:https://cloud.spri
SpringCloud中级(一) ——Hystrix豪猪哥断路器 目录概述Hystrix重要概念服务降级服务熔断服务限流概述分布式系统面临的问题:功能:服务降级服务熔断接近实时的监控官网:https://github.com/Netflix/Hystrix/wiki/How-To-UseHystrix官宣,停更进维。github:https://github.com/Netflix/HystrixHystrix重要概念服务降级服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback哪些情况会触发降级:程序运
计算机网络入门(一)——快速理解网络通信协议 目录五层模型层与协议实体层链接层定义以太网协议MAC地址广播网络层网络层的由来IP协议IP数据包ARP协议传输层传输层的由来UDP协议TCP协议应用层互联网的实现,分成好几层。每一层都有自己的功能,就像建筑物一样,每一层都靠下一层支持。用户接触到的,只是最上面的一层,根本没有感觉到下面的层。要理解互联网,必须从最下层开始,自下而上理解每一层的功能。如何分层有不同的模型,有的模型分七层,有的分四层。我觉得,把互联网分成五层,比较容易解释:五层模型越下面的层,越靠近硬件;越上面的层,越靠近用户。层与
Postman 访问要登陆的接口 官网教程:https://learning.postman.com/docs/postman/sending-api-requests/interceptor/#installing-interceptor拉至底部。安装Postman:添加到扩展程序https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?安装Postman interceptor:添加到扩展程序https://
SpringCloud入门(八) ——OpenFeign服务接口调用 目录概述OpenFeign是什么?能干嘛Feign和OpenFeign两者区别概述OpenFeign是什么?Feign是一个声明式的web服务客户端,让编写web服务客户端变得非常容易,只需创建一个接口并在接口上添加注解即可。GitHub:https://github.com/spring-cloud/spring-cloud-openfeign能干嘛Feign和OpenFeign两者区别...
SpringCloud入门(七) ——Ribbon负载均衡服务调用 目录概述LB(负载均衡)Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别集中式LB进程内LBNginx负载均衡和Ribbon负载均衡的区别?架构说明使用Ribbon实现负载均衡RestTemplate的使用概述Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。简单说,ribbon是Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。ribbon客户端组件提供一系列完善的配置项,如超时连接,重试等。就
SpringCloud入门(六) ——Consul、Zookeeper以及Eureka异同点 三个注册中心的异同点CAPConsistency(强一致性):要求分布式系统中的各节点时时刻刻保持数据的一致性。Availability(可用性):可用性指服务一直可用,而且是正常响应时间。Partition tolerance(分区容错),指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务分布式系统P,永远要保证,所以系统要么是CP,要么是AP。Eureka:APZookeeper/Consul:CPAP架构CP架构.
SpringCloud入门(五) ——Consul注册中心 目录Consul简介能干嘛安装并运行ConsulWindows版服务提供者注册到Consul服务消费者注册到Consul学习文档:https://www.springcloud.cc/spring-cloud-consul.htmlConsul简介官网:https://www.consul.io/introConsul是一套开源的分布式服务发现和配置管理系统,用go语言开发。提供了微服务系统中的服务治理,配置中心,控制总线等功能。这些功能中的每一个都可以根据需要单独使用,可以一起使用以构建全方面的
SpringCloud入门(四) ——Zookeeper注册中心 SpringCloud整合Zookeeper代替Eureka服务提供者注册到Zookeeper启动zookeeper依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId> <!--3.5.3的版本,与自己启动的版本不一致,
SpringCloud入门(三) ——Eureka注册中心 目录什么是服务治理服务注册和发现Eureka两组件Eureka Server服务端构建Eureka Client 客户端构建集群Eureka工作流程集群注册原理Eureka集群搭建客户端注册到Eureka集群服务提供者集群搭建并实现负载均衡功能服务提供者集群搭建服务消费者修改测试什么是服务治理在传统的rpc远程调用框架中,管理每个服务与服务之间的依赖关系比较复杂,所以需要服务治理,管理服务与服务之间的依赖关系,可以实现服务调用,负载均衡,容错等,实现服务发现和注册。springcloud使用Eurek
SpringCloud入门(二)——基于RestTemplate搭建微服务工程 目录首说RestTemplate搭建微服务工程聚合父工程Project字符编码设置注解生效激活java编译版本选8File type过滤父工程POM微服务模块构建创建子模块子模块pom写yml启动类业务类启动配置测试热部署热部署方式2首说RestTemplateRestTemplate: RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。官网地址:https://docs.s
SpringCloud入门(一)——相关概念以及版本选择 目录微服务All in one 单机系统分布式系统微服务架构分布式与微服务的区别微服务的技术栈都哪些:为什么使用 SpringCloudSpringCloud 与 Springboot 的关系SpringCloud 与 Dubbo的区别:版本springboot版本springcloud版本springboot 与springcloud之间的版本选择我的版本选择cloud组件停更说明微服务微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个微服务提供单个业务功能的服务
Netty入门(十二)实现DubboRpC RPC基本介绍RPC(Remote Procedure Call)—远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样(如图)常见的 RPC 框架有: 比较知名的如阿里的Dubbo、google的gRPC、Go语言的rpcx、Apache的thrift,Spring 旗下的 Spring Cloud。RPC调用流程服务消费方(c
Netty入门(十一)Netty服务器启动源码剖析 目录分析EventLoopGroup 对象分析默认线程数分析 EventLoopGroup 的过程ServerBootstrap 创建和构造过程ServerBootstrap 是个空构造,但是有默认的成员变量分析一下 ServerBootstrap 基本使用情况绑定端口的分析核心代码doBind分析说明 initAndRegisternew一个channel初始化channel将这个channel 注册到某个对象服务器示例代码: // Configure the server.EventLoopGro
Netty入门(十)netty粘包拆包原理 目录TCP 粘包和拆包基本介绍TCP 粘包和拆包现象实例服务端客户端测试TCP 粘包和拆包解决方案一个具体的实例自定义协议编解码器服务端客户端测试练习自定义协议编解码器服务端修改客户端修改测试TCP 粘包和拆包基本介绍由于UDP有消息保护边界,不会发生粘包拆包问题,因此粘包拆包问题只发生在TCP协议中。TCP是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket,因此,发送端为了将多个数据包发给接收端,更有效的发给对方,使用了优化方法(Nagle算法)
Netty入门(九)netty入站与出站机制 目录基本说明编码解码器Handler调用链机制客户端发送long -> 服务器服务端代码客户端代码测试两个细节问题服务端发送long -> 客户端服务端客户端测试结论其他常用的编解码器解码器-ReplayingDecoder其它解码器其它编码器基本说明netty的组件设计:Netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。例如
Netty入门(八)编码和解码的基本介绍 编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码。示意图:codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据Netty 本身的编码解码的机制和问题分析Netty 自身提供了一些 codec(编解码器)Netty 提供的编码器StringEncoder,对字符串数据进行编码ObjectEn.
Netty入门(七)WebSocket长连接开发 Http是无状态的,浏览器每次请求,都是创建一个新连接,传输完毕即断开。双方并不能感知对方的状态。而WebSocket是长连接,一次TCP握手,即可建立持久性的连接,并且双方能感知到对方的状态。实例要求:Http协议是无状态的, 浏览器和服务器间的请求响应一次,下一次会重新创建连接.要求:实现基于webSocket的长连接的全双工的交互改变Http协议多次请求的约束,实现长连接了, 服务器可以发送消息给浏览器客户端浏览器和服务器端会相互感知,比如服务器关闭了,浏览器会感知,同样浏览器关闭了,服
Netty入门(六)心跳检测机制案例 实例要求:编写一个 Netty心跳检测机制案例, 当服务器超过3秒没有读时,就提示读空闲当服务器超过5秒没有写操作时,就提示写空闲实现当服务器超过7秒没有读或者写操作时,就提示读写空闲服务端:public class MyServer { public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup
Netty入门(五)群聊系统 实例要求:编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)实现多人群聊服务器端:可以监测用户上线,离线,并实现消息转发功能客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)目的:进一步理解Netty非阻塞网络编程机制服务端:public class GroupChatServer { private int port; public GroupChatServer(int port)
Netty入门(五)核心模块 目录Bootstrap、ServerBootstrapFuture、ChannelFutureChannelSelectorChannelHandler 及其实现类Pipeline 和 ChannelPipelineBootstrap、ServerBootstrapBootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Netty 程序,串联各个组件,Netty 中 Bootstrap 类是客户端程序的启动引导类,ServerBootstrap 是
Netty入门(四)任务队列,异步模型,实现Http服务器 目录任务队列解决方式一:用户程序自定义的普通任务解决方式二:用户自定义定时任务任务队列任务队列的task有3种典型的使用场景用户程序自定义的普通任务用户自定义定时任务非当前Reactor线程调用Channel的各种方法例如:在推送系统的业务线程里面,根据用户的标识,找到对应的Channel引用,然后调用write类方法向该用户推送消息,就会进入到这种场景。最终的write会提交到任务队列中后被异步消费。假设有非常耗时的业务场景,我们希望使用异步执行解决这个问题。解决方式一:用户程序自定义
分布式基础(二)分布式理论之分布式事务 目录什么是分布式事务单体应用分布式应用2PC投票阶段提交阶段两阶段提交协议成功场景示意图:优缺点3PC三阶段提交协议的成功场景:询问阶段(CanCommit)准备阶段(PreCommit,2pc中是叫投票阶段)提交阶段(DoCommit)优缺点TCCTCC的执行TryConfirmCancel总结什么是分布式事务单体应用下图是一个单体应用的 3 个 模块,在同一个数据源上更新数据来完成一项业务,整个过程的数据一致性可以由数据库的本地事务来保证,如下图:分布式应用随着业务需求和架构的变化,单体应用
netty入门(三)Netty高性能架构设计 目录Netty概述原生NIO存在的问题Netty优点I/O线程模型传统阻塞I/O服务模型模型分析模型实现代码示例Reactor模型概述单Reactor单线程模式模型分析模型实现代码示例单Reactor多线程模型模型分析模型实现代码示例主从Reactor多线程模型实现代码示例Netty概述原生NIO存在的问题NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。需要具备其他的额外技能:要熟
JDK和CGLIB动态代理区别 目录JDK动态代理CGLIB动态代理何时使用JDK还是CGLIBJDK动态代理和CGLIB字节码生成的区别Spring如何选择用JDK还是CGLIB代码实例JDK动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGLIB动态代理利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成代理子类来处理。何时使用JDK还是CGLIB如果目标对象实现了接口,默认情
Netty模型代码示例 依赖<!--netty--><dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.42.Final</version></dependency>服务端代码public class NettyServer { public static
主从Reactor多线程实现代码 服务端主Reactor:public class GroupChatServer { //定义属性 private Selector selector; private ServerSocketChannel listenChannel; private static final int PORT = 6667; private SubReactor subReactor; //构造器 //初始化工作 public GroupChatSe
单Reactor多线程实现代码 客户端:public class GroupChatClient { //定义相关的属性 private final String HOST = "127.0.0.1"; // 服务器的ip private final int PORT = 6667; //服务器端口 private Selector selector; private SocketChannel socketChannel; private String username; //
单Reactor单线程实现代码 服务端:public class GroupChatServer { //定义属性 private Selector selector; private ServerSocketChannel listenChannel; private static final int PORT = 6667; //构造器 //初始化工作 public GroupChatServer() { try { //得到选择器
netty入门(二)NIO的零拷贝 目录传统IO的读写mmap 优化sendFilemmap 和 sendFile 的区别NIO中的零拷贝(transferTo):零拷贝是网络编程的关键,很多性能优化都离不开它。零拷贝是指:从操作系统的角度来看,文件的传输不存在CPU的拷贝,只存在DMA拷贝。在Java程序中,常用的零拷贝有mmap(内存映射)和 sendFile。零拷贝不仅仅带来更少的数据复制,还能减少线程的上下文切换,减少CPU缓存伪共享以及无CPU校验和计算。传统IO的读写File file = new File("te
netty入门(一) 目录Java IO概述1、Netty介绍和应用场景1.1、Netty介绍1.2、Netty的应用场景2、Java IO模型介绍2.1、I/O模型基本说明2.2、I/O模型使用场景分析3、BIO 工作机制3.1、BIO编程简单流程(Socket编程)3.2、BIO 应用实例实例说明实例代码BIO 问题分析Java IO概述1、Netty介绍和应用场景1.1、Netty介绍Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目Netty是一个异步的、基于事件驱动的网络应用框
zookeeper(五)监控命令 目录监控命令使用telnet查看集群状态安装`telnet`:连接zookeeper集群mntr集群状态使用nc命令查看集群状态conf 服务配置的详细信息cons命令 所有连接到这台服务器的客户端连接/会话的详细信息crst 重置当前服务器所有连接/会话的统计信息dump 列出未经处理的会话和临时结点envi 输出服务器环境配置信息ruok 测试服务器是否处于运行状态stat 输出服务器详细信息srvrsrst 重置服务器wchs 列出watcher信息wchc 通过session分组列出watch的结点
zookeeper(四)客户端curator 目录curator依赖使用curator连接zookeeper新增结点 create自定义权限列表递归创建异步创建更改结点 setData删除结点 delete查看结点 get读取子结点数据 getChildren检查结点是否存在 checkExistswatcherNodeCache 监听特定结点PathChildren Cache 监听子结点事务 inTransaction分布式锁分布式可重入排它锁分布式读写锁读锁写锁curatorcurator是Netflix开源的一个zookeeper客户端,后
springmvc初始化过程 在看完spring源码后,有个疑问handlerMappings以及的handlerAdapters是何时被初始化的?1.看到DispatcherServlet的initHandlerMappings方法:这个方法初始化了handlerMappingsprivate void initHandlerMappings(ApplicationContext context) { this.handlerMappings = null; if (this.detectAllHandlerMappi
IoC容器在web容器中的初始化过程 以前学习spring原理的时候,都是直接new一个IOC容器,如下:AnnotationConfigApplicationContext aac = new AnnotationConfigApplicationContext("com.mydemo");那么,spring在实际的web项目中,是如何初始化的呢?首先来看看我们在使用 Spring + Spring MVC 框架开发的时候是如何配置的。在Web容器中使用Spring MVC,要配置web.xml:一般会配置context-p
探索win10下,bat脚本实现自动化部署 目录服务器配置bat脚本实现文件上传bat脚本实现maven项目打包实现自动化部署maven项目另一种方式实现自动化部署,比较好用附录:服务器配置1.安装ftp服务:yum install -y vsftpd启动ftp服务:service vsftpd restart查看是否启动成功:service vsftpd status2.开放端口213.直接使用root的用户上传文件,会出现错误530 Permission deniedvi /etc/vsftpd/user_list 把root给注