
暂无个人介绍
能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
暂时未有相关云产品技术能力~
阿里云技能认证
详细说明1.ActiveMQ官网链接:http://activemq.apache.org/①选择Download②选择ActiveMQ 5.15.8 Release需要注意的是:ActiveMQ 5.15.8所需Jdk版本最低为1.8,修改具体请看Change Log③复制下载链接 cd /usr/local wget http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.15.8/apache-activemq-5.15.8-bin.tar.gz&action=download 会发现,文件无法下载,我尝试着关闭防火墙,重启network,无效(因为响应是200)因为URL中有一个"&"需要转义"&" cd /usr/local wget http://www.apache.org/dyn/closer.cgi?filename=\/activemq\/5.15.8\/apache-activemq-5.15.8-bin.tar.gz\&action=download wget的命名规则是取最后一个"/"后面的内容,文件重命名 mv ./closer.cgi\?filename\=%2Factivemq%2F5.15.8%2Fapache-activemq-5.15.8-bin.tar.gz\&action\=download ./apache-activemq-5.15.8-bin.tar.gz 2.解压apache-activemq-5.15.8-bin.tar.gz tar -xzvf ./apache-activemq-5.15.8-bin.tar.gz 3.启动ActiveMQ①ActiveMQ内置了jetty Web容器,jetty的相关配置在jetty.xml中 vim /usr/local/apache-activemq-5.15.8/conf/jetty.xml ②ActiveMQ的配置文件 vim /usr/local/apache-activemq-5.15.8/conf/activemq.xml ③ActiveMQ管控台的用户名密码配置 vim /usr/local/apache-activemq-5.15.8/conf/jetty-realm.properties ④进入bin目录,启动ActiveMQ /usr/local/apache-activemq-5.15.8/bin/activemq start 查看端口61616是否开启 netstat -an|grep 61616 netstat -an|grep 8161 ⑤登录ActiveMQ管控台:http://192.168.0.115:8161/admin/4.编写程序①消息发送方(生产者): package activemq; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class ActiveMQ_Sender { public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory工厂对象,需要填入用户名、密码以及要连接的地址,均使用默认即可, // 默认端口为"tcp://localhost:61616" ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://192.168.0.115:61616" ); //2.通过ConnectionFactory工厂对象我们创建一个Connection连接,并且调用Connection的start方法开启连接, // connection默认是关闭的 Connection connection = connectionFactory.createConnection(); connection.start(); //3.通过Connection工厂对象创建Session会话(上下文环境对象),用于接收消息, // 参数1为是否启用事务,参数2为签收模式,一般我们设置自动签收 Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); //4.通过Session创建Destination对象,指的是一个客户端用来指定生产消息目标和消费信息来源的对象, // 在P2P模式中,Destination被称作Queue即队列;在Pub/Sub模式,Destination被称作Topic即主题。 // 在程序中可以使用多个Queue和Topic Destination destination = session.createQueue("Queue_01"); //5.我们需要通过Session对象创建消息的发送和接收对象(生产者和消费者),MessageProducer/MessageConsumer MessageProducer messageProducer = session.createProducer(destination); //6.我们可以使用MessageProducer的setDeliveryMode()方法为其设置持久化特性和非持久化特性(DeliveryMode) messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); //7.使用JMS规范的TextMessage形式创建数据(通过Session对象),并用MessageProducer的send方法发送数据。 // 同理客户端使用receive方法进行接收数据 for (int i = 1; i <= 10; i++) { TextMessage textMessage = session.createTextMessage(); textMessage.setText("Sender: HelloWorld! Message_ID = "+i); messageProducer.send(textMessage); } //8.关闭Connection连接 if (connection != null){ connection.close(); } } } 运行成功后,刷新ActiveMQ管控台,会看到刚刚创建的消息数量和状态点击消息名称查看②消息接收方(消费者): package activemq; import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class ActiveMQ_Receiver { public static void main(String[] args) throws JMSException { //1.建立ConnectionFactory工厂对象,需要填入用户名、密码以及要连接的地址,均使用默认即可, // 默认端口为"tcp://localhost:61616" ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( ActiveMQConnectionFactory.DEFAULT_USER, ActiveMQConnectionFactory.DEFAULT_PASSWORD, "tcp://192.168.0.115:61616" ); //2.通过ConnectionFactory工厂对象我们创建一个Connection连接,并且调用Connection的start方法开启连接, // connection默认是关闭的 Connection connection = connectionFactory.createConnection(); connection.start(); //3.通过Connection工厂对象创建Session会话(上下文环境对象),用于接收消息, // 参数1为是否启用事务,参数2为签收模式,一般我们设置自动签收 Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); //4.通过Session创建Destination对象,指的是一个客户端用来指定生产消息目标和消费信息来源的对象, // 在P2P模式中,Destination被称作Queue即队列;在Pub/Sub模式,Destination被称作Topic即主题。 // 在程序中可以使用多个Queue和Topic Destination destination = session.createQueue("Queue_01"); //5.我们需要通过Session对象创建消息的发送和接收对象(生产者和消费者),MessageProducer/MessageConsumer MessageConsumer messageConsumer = session.createConsumer(destination); //6.使用JMS规范的TextMessage形式创建数据(通过Session对象),并用MessageProducer的send方法发送数据。 // 同理客户端使用receive方法进行接收数据 while (true){ TextMessage textMessage = (TextMessage) messageConsumer.receive(); if (textMessage == null) break; System.out.println("Receive_Message: "+textMessage.getText()); } //8.关闭Connection连接 if (connection != null){ connection.close(); } } } 5.ActiveMQ安全机制只有符合认证的用户才能进行发送和接收消息 <plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username="ysx" password="ysx" groups="users,admins"/> </users> </simpleAuthenticationPlugin> </plugins> 在/usr/local/apache-activemq-5.15.8/conf/activemq.xml的大约123行,之前,之后加上上面的插件配置,重启ActiveMQ按之前的程序发送消息就会报错:需要对程序进行修改(生产者和消费者都要改)待续。。。
1.什么是负载均衡?随着应用各个核心模块业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。 针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。2.负载均衡的种类①一种是通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的②一种是通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略以上内容摘自:https://www.cnblogs.com/wang-meng/p/5861174.html3.虚拟机准备工作,三台安装了nginx服务器的机器nginx安装过程请参考:https://yq.aliyun.com/articles/6558554.配置Nginx转发条件配置nginx.conf 该文件中一些节点的作用: worker_processes:工作进程个数,可配置多个 worker_connections:单个进程最大连接数 server:每一个server相当于一个代理服务器 lister:监听端口,默认80 server_name:当前服务的域名,可以有多个,用空格分隔(我们是本地所以是localhost) location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里 index:当没有指定主页时,默认会选择这个指定的文件,可多个,空格分隔 proxy_pass:请求转向自定义的服务器列表 upstream name{ }:服务器集群名称 重启nginx服务5.安装并启动Tomcat参考链接:https://yq.aliyun.com/articles/6555426.修改Tomcat的index.jsp文件为了区分是哪个IP下的Tomcat,修改下index.jsp的内容,显示对应的IP地址7.浏览器访问http://192.168.0.115,展示页面为116的Tomcat8.设置权重,重新访问http://192.168.0.115,用115做服务器负载均衡到116和1179.搭建Keepalived,需要依赖openssl查看是否安装openssl rpm -qa|grep openssl openssl已安装如果机器115出现故障了呢? 那么怎么使用116上的Nginx进行转发呢? 怎么设置主机和备机呢? 如果主机死了怎么进行故障移除呢? 如果主机从不可用到可用状态又怎么进行恢复添加呢? 这些功能都是可以通过Keepalived来进行设置的.Keepalived(1)Keepalived高可用软件 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。 Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol (虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。 (2)Keepalived高可用故障切换转移原理 Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。于是就会调用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。 ①keepalived官网:http://www.keepalived.org/②下载keepalived最新版V2.0.9 wget http://www.keepalived.org/software/keepalived-2.0.9.tar.gz ③解压keepalived-2.0.9.tar.gz tar -xzvf ./keepalived-2.0.9.tar.gz ④执行./configure cd /usr/local/keepalived-2.0.9 ./configure 说明缺少依赖包libnl、libnl-devel yum -y install libnl libnl-devel 重新执行./configure⑤开始编译和安装 make && make install ⑥keepalived安装后默认不会注册为系统服务,需要手动添加系统服务脚本 keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可(安装目录下) cp /usr/local/keepalived-2.0.9/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived 将keepalived主程序加入到环境变量(安装目录下) cp /usr/local/keepalived-2.0.9/keepalived/keepalived /usr/sbin/ keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用 cp /usr/local/keepalived-2.0.9/keepalived/etc/init.d/keepalived /etc/init.d/keepalived 将配置文件放到默认路径下 mkdir /etc/keepalived cp /usr/local/keepalived-2.0.9/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf 设置为开机启动 chkconfig keepalived on 启动keepalived服务 service keepalived start 192.168.0.115环境搭建完成,116按同样的环境搭建 检查keepalived是否启动成功 ip add show eth0 eth0是网卡名称,通过ifconfig查看⑦192.168.0.115做主机,192.168.0.116做备机,备机需要修改keepalived.conf主机 (主节点):备机 (从节点):现在主节点和从节点都会生成VIP,这种现象叫做“脑裂”脑裂(split-brain) : 指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。对于无状态服务的HA,无所谓脑裂不脑裂;但对有状态服务(比如MySQL)的HA,必须要严格防止脑裂思考:正常情况下keepalived的VIP应该生成在主节点,从节点在检测到主节点正常运行的时候是不生成VIP的,但是现在从节点生成了VIP,有可能主从节点间的通信异常了。主从节点通信是通过VRRP广播实现的,首先检查从节点是否可以接收到VRRP广播 tcpdump -i eth0|grep VRRP 很明显从节点已经接收到VRRP广播,应该是被过滤掉了,有这功能的就只有防火墙了,查看防火墙过滤规则 vim /etc/sysconfig/iptables 添加过滤规则 #允许组播地址通信 -A INPUT -s 192.168.0.0/24 -d 224.0.0.18 -j ACCEPT #允许VRRP(虚拟路由器冗余协)通信 -A INPUT -s 192.168.0.0/24 -p vrrp -j ACCEPT 重启防火墙 service iptables reload 查看是否生成VIP已经成功了⑧主节点的keepalived服务停掉,观察从节点是否可以生成VIP主节点:从节点:⑨主节点启动keepalived服务后,观察是否出现“脑裂现象”主节点:从节点:访问tomcat页面不受任何影响,说明故障移除是OK的10.因为我们是用nginx做负载均衡分发请求数据包的,如果主节点keepalived服务正常运行,但是nginx服务出现故障,就会出现负载均衡服务失灵的问题,导致请求无法访问到116或117的应用服务器上,所以我们要检测nginx服务是否正常运行,如果出现故障,则立即停掉keepalived服务,这样就可以自动切换到从节点上通过检测80端口是否开启来判定nginx的运行情况,2秒钟检测一次,脚本如下 #!/bin/bash while true do if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ] then /etc/init.d/keepalived stop fi sleep 2 done 直接执行该脚本,是一个死循环,如果服务正常(netstat -tlnp|grep nginx|wc -l)=1,脚本里判断如果不等于1,就停掉keepalived服务,sleep 2,2秒执行一次结束
1.虚拟机网络连接模式① bridged(桥接模式)在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立主机,它可以访问网内任何一台机器。在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。如果你想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。② NAT(网络地址转换模式)使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。如果你想利用VMWare安装一个新的虚拟系统,在虚拟系统中不用进行任何手工配置就能直接访问互联网,建议你采用NAT模式。③host-only(主机模式)在某些特殊的网络调试环境中,要求将真实环境和虚拟环境隔离开,这时你就可采用host-only模式。在host-only模式中,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的。提示:在host-only模式下,虚拟系统和宿主机器系统是可以相互通信的,相当于这两台机器通过双绞线互连。在host-only模式下,虚拟系统的TCP/IP配置信息(如IP地址、网关地址、DNS服务器等),都是由VMnet1(host-only)虚拟网络的DHCP服务器来动态分配的。如果你想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择host-only模式。2.进入Linux可视化界面设置IP,连接方式是桥接模式如果是命令行界面,执行startx进入可视化界面鼠标右键选中要修改的网卡,点击修改设置IP地址、子网掩码、网关,Apply确认修改设置完成后,重启网络network service network reload 3.通过文件修改IP地址 vim /etc/sysconfig/network-scripts/ifcfg-Auto_eth0 该文件一开始是没有的,通过可视化界面设置后,自动生成该文件将IP修改为115修改后,重启网络network service network reload XShell也可以连接上了4.注意 ifconfig 这个名称是可以修改的 cd /etc/udev/rules.d ll 修改70-persistent-net.rules文件 vim /etc/udev/rules.d/70-persistent-net.rules 如果有多条会以下面的为准重启系统 shutdown -r 0 结束
1.斐波那契数列 package algorithm; public class Algorithm_1 { public static void main(String[] args) { System.out.println(getNum(5)); } /** * 用递归实现斐波那契数列,适用于求解比较小的位置数值 * 0 1 1 2 3 5 8 13 21... * @param n * @return */ public static int getNum(int n){ if(n <= 2){ return 1; }else { return getNum(n-1) + getNum(n-2); } } } 2.求阶乘 package algorithm; public class Algorithm_2 { public static void main(String[] args) { System.out.print(getNum(5)); } /** * 求阶乘 * n!=n*(n-1)*(n-2)*...*1 * @param n * @return */ public static int getNum(int n){ if(n == 1){ System.out.print(n + "="); return 1; }else { System.out.print(n + "*"); return getNum(n-1) * n; } } } 3.列出某个目录下所有子目录和文件 package algorithm; import java.io.File; public class Algorithm_3 { public static void main(String[] args) throws Exception { getDir("F:\\Java\\jdk\\db"); } /** * 列出某个目录下所有子目录和文件 * @param path * @return */ public static void getDir(String path) throws Exception { File file = new File(path); if(file.isDirectory()){ System.out.println("Dir" + file.getPath()); File[] fileArr = file.listFiles(); for (File f : fileArr) { getDir(f.getPath()); } }else if (file.isFile()){ System.out.println("File" + file.getPath()); }else { throw new Exception(file.getPath() + "非Dir非File?!"); } } } 4.汉诺塔问题 package algorithm; public class Algorithm_4 { private final static String from = "柱子A"; private final static String mid = "柱子B"; private final static String to = "柱子C"; public static void main(String[] args) { move(5, from, mid, to); } /** * 汉诺塔 * func: * if n!=0 then ;预定值 * func(n-1, a, c, b) ;将n-1个盘子由a移动到b,以c为辅助柱子(注意参数顺序) * move a[n] to c ;将a上的最后一个盘子移动到c * func(n-1, b, a, c) ;将n-1个盘子由b移动到c,以a为辅助柱子 * endif ;完成 * @param n * @param from2 * @param mid2 * @param to2 */ public static void move(int n, String from2, String mid2, String to2){ if(n == 1){ System.out.println("移动盘子 " + n + " 从 " + from2 + " 到 " + to2); }else { move(n-1, from2, to2, mid2); System.out.println("移动盘子 " + n + " 从 " + from2 + " 到 " + to2); move(n-1, mid2, from2, to2); } } } 5.二分法查找 package algorithm; /** * 二分法查找值 * 一定是有序表,升序降序都可以 * 原理就是找中间值 */ public class Algorithm_5 { public static void main(String[] args) { int[] array = {1,3,5,7,9,12,14,15,19,20,22,23,28,30}; System.out.println(search(array, 0, array.length-1, 20)); } /** * @param array 有序数组,但不限于数组 * @param start 开始查找的数组下标 * @param end 结束查找的数组下标 * @param searchValue 要搜索的值 * @return */ public static int search(int[] array, int start, int end, int searchValue){ if (array != null && array.length > 0){ int middle = (start + end) / 2; int middleValue = array[middle]; if (searchValue == middleValue){ return middle; }else if (searchValue < middleValue){ //查询值小于中值,在中值前面再次搜索,缩小范围 return search(array, start, middle-1, searchValue); }else { //查询值大于中值,在中值后面再次搜索,缩小范围 return search(array, middle+1, end, searchValue); } }else { return -1; } } } 结束
1.问题描述:XShell工具连接不上虚拟机2.解决方案:①查看主机IP是否正确,在虚拟机里用ifconfig命令查看②使用协议及连接端口是否正确,是SSH(22)还是TELNET(23)③确定了IP和端口后,查看虚拟机防火墙是否开启,使用命令 service iptables status 如图所示,如果是开启状态,查看连接端口号是否配置了防火墙规则④如果以上均没有问题,尝试重置虚拟机的虚拟网络编辑器关闭所有虚拟机后,选择更改设置选择还原默认设置重新用XShell连接,成功结束
PageHelper-5.1.1和PageHelper-4.0.0是有区别的PageHelper-4.0.0的版本时,Mybatis全局配置文件SqlMapConfig.xml的内容是: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <plugins> <!-- com.github.pagehelper 为 PageHelper 类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库--> <property name="dialect" value="mysql"/> </plugin> </plugins> </configuration> 当我PageHelper的版本改为5.1.1时,tomcat启动报错:java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis.plugin.Interceptor这句报错信息说明PageHelper这个类没有实现Interceptor这个接口,我们看下源码: package com.github.pagehelper; import com.github.pagehelper.dialect.AbstractHelperDialect; import com.github.pagehelper.page.PageAutoDialect; import com.github.pagehelper.page.PageMethod; import com.github.pagehelper.page.PageParams; import com.github.pagehelper.util.StringUtil; import java.util.List; import java.util.Properties; import org.apache.ibatis.cache.CacheKey; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.RowBounds; public class PageHelper extends PageMethod implements Dialect { private PageParams pageParams; private PageAutoDialect autoDialect; public PageHelper() { } PageHelper可以看到,这个类并没有实现Interceptor这个接口在这里我们要了解下PageHelper在Mybatis中是如何工作的:通过mybatis的pulgin实现了Interceptor接口,从而获得要执行的sql语句实现分页技术,而我们的PageHelper5.1.1版本中的这个类,并没有出现implements Interceptor,找找pagehelper这个包下的其他类PageInterceptor类内容如下: package com.github.pagehelper; @Intercepts({@Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), @Signature( type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class} )}) public class PageInterceptor implements Interceptor { protected Cache<String, MappedStatement> msCountMap = null; private Dialect dialect; private String default_dialect_class = "com.github.pagehelper.PageHelper"; private Field additionalParametersField; private String countSuffix = "_COUNT"; public PageInterceptor() { } PageInterceptor实现了Interceptor接口将SqlMapConfig.xml做修改: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <plugins> <!-- com.github.pagehelper 为 PageHelper 类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库--> <property name="dialect" value="mysql"/> </plugin> </plugins> </configuration> 重新运行tomcat然后。。。网上找的:PageHelper插件4.0.0以后的版本支持自动识别使用的数据库,可以不用配置 <property name="dialect" value="mysql"/> 将SqlMapConfig.xml做修改: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <plugins> <!-- com.github.pagehelper 为 PageHelper 类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六种数据库--> <!--<property name="dialect" value="mysql"/>--> </plugin> </plugins> </configuration> 再次重新运行tomcat成功了!结束
Dubbox前身是阿里巴巴的Dubbo项目,阿里巴巴解散了Dubbo团队后,由当当网继续维护此项目,改名为Dubbox,但是没有提交到Maven中央仓库(突然发现阿里巴巴又开始进行dubbo维护了,停止维护时的版本是2.5.3,现在是2.6.4)这些就不管了,现在我手动将Dubbox的jar包安装到本地仓库中1.下载Dubbox-2.8.4https://github.com/dangdangdotcom/dubbox/releases2.解压Dubbox-2.8.43.用maven编译文件(前提是已经安装了maven,并且配置了maven的环境变量)①win键+R,输入cmd,回车②设置maven本地仓库路径,下面代码是我本地maven的settings.xml文件 <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>F:/apache-maven-3.5.4/repository</localRepository> <pluginGroups></pluginGroups> <proxies></proxies> <servers></servers> <mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url> http://maven.aliyun.com/nexus/content/groups/public/ </url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> <profiles></profiles> </settings> 而maven安装目录中有两个settings.xml文件**Maven安装目录(全局):%MAVEN_HOME%confsettings.xml用户安装目录(用户):${user.home}.m2settings.xml第一个是全局配置,第二个是用户配置。当两者都存在,它们的内容将被合并,特定于用户的settings.xml文件占主导地位。**这里因为我为了节省C盘空间,把.m2文件夹删除了,用本地仓库的settings.xml文件替换掉%MAVEN_HOME%confsettings.xml③执行命令,如果第一次执行install命令,会首先安装maven插件 mvn install -f D:\文件\dubbox-dubbox-2.8.4\pom.xml -D maven.test.skip=true 说明已经编译完成④打开本地仓库,查看dubbo和dubbo-admin的版本dubbodubbo-admin⑤在maven工程中引用该包 <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbox.version}</version> </dependency> 已经引入进来了结束
1.zookeeper官网下载安装包http://mirrors.hust.edu.cn/apache/zookeeper/2.选择最新版3.复制该版本的下载链接地址http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz4.虚拟机中用wget命令下载zookeeper安装包我一般将软件安装到/usr/local/下面wget命令下载 wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz 下载完成5.解压安装包 tar -zxvf ./zookeeper-3.4.13.tar.gz 6.解压完成后,需要设置zookeeper的工作目录,存放日志和数据①进入安装包目录 cd zookeeper-3.4.13/ ②创建data文件夹(名称没有要求) mkdir data ③进入conf文件夹 cd conf/ ④将zoo_sample.cfg复制一份并重命名为zoo.cfg cp zoo_sample.cfg zoo.cfg ⑤修改zoo.cfg中dataDir路径为刚刚创建的data⑥退出编辑并保存,进入bin目录⑦启动zkServer.sh ./zkServer.sh start ⑧查看zkServer的状态 ./zkServer.sh status 结束
一、SpringMVC与Struts2的主要区别 ①Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilter SpringMvc的核心是基于一个Servlet即DispatcherServlet(前端控制器) ②Struts2是基于类开发的,传递的参数是通过类的属性传递(属性驱动和模型驱动),所以只能设计成多例prototypeSpringMvc是基于类中的方法开发的,也就是一个url对应一个方法,传递参数是传到方法的形参上面,所以既可以是单例模式也可以是多例模式singiton ③Struts2采用的是值栈存储请求以及响应数据,OGNL存取数据SpringMvc采用request来解析请求内容,然后由其内部的getParameter给方法中形参赋值,再把后台处理过的数据通过ModelAndView对象存储,Model存储数据,View存储返回的页面,再把对象通过request传输到页面去二、SpringMVC的工作原理SpringMVC流程:1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、 DispatcherServlet调用HandlerAdapter处理器适配器。5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。6、 Controller执行完成返回ModelAndView。7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。9、 ViewReslover解析后返回具体View。10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。11、 DispatcherServlet响应用户。组件:1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供作用:根据请求的url查找HandlerHandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。3、处理器适配器HandlerAdapter作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。4、处理器Handler(需要工程师开发)注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行HandlerHandler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。5、视图解析器View resolver(不需要工程师开发),由框架提供作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。6、视图View(需要工程师开发jsp...)View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)三、MVC是一种设计模式分析:M-Model 模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View 视图(做界面的展示 jsp,html……)C-Controller 控制器(接收请求—>调用模型—>根据结果派发页面)
一、Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。二、Redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。Redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。=========================以上摘自百度百科=========================三、Redis官方下载链接https://redis.io/download向下翻,官方文档有说明Redis如何安装开始安装redis解压后目录结构进入src目录执行make指令安装Redis执行/redis-5.0.0/src/redis-server启动redis-server服务器启动后,启动redis客户端,执行/redis-5.0.0/src/redis-cli向redis中写入数据,读取数据删除数据,再获取时,返回nil我用Xshell开了2个窗口,一个服务端,一个客户端当我把服务端窗口关闭时PPID=1,说明该进程已由init进程管理,其父进程已关闭,之所以出现这种情况,是因为redis-server默认不是守护进程,窗口关闭,进程随之关闭,可以通过设置redis.conf的daemonize=yes来解决redis-conf配置文件注释: #是否作为守护进程运行 daemonize yes #配置pid的存放路径及文件名,默认为当前路径下 pidfile redis.pid #Redis默认监听端口 port 6379 #客户端闲置多少秒后,断开连接 timeout 300 #日志显示级别 loglevel verbose #指定日志输出的文件名,也可指定到标准输出端口 logfile stdout #设置数据库的数量,默认连接的数据库是0,可以通过select N来连接不同的数据库 databases 16 #保存数据到disk的策略 #当有一条Keys数据被改变是,900秒刷新到disk一次 save 900 1 #当有10条Keys数据被改变时,300秒刷新到disk一次 save 300 10 #当有1w条keys数据被改变时,60秒刷新到disk一次 save 60 10000 #当dump .rdb数据库的时候是否压缩数据对象 rdbcompression yes #dump数据库的数据保存的文件名 dbfilename dump.rdb #Redis的工作目录 dir /home/falcon/redis-2.0.0/ ########### Replication ##################### #Redis的复制配置 # slaveof <masterip> <masterport> # masterauth <master-password> ############## SECURITY ########### # requirepass foobared ############### LIMITS ############## #最大客户端连接数 # maxclients 128 #最大内存使用率 # maxmemory <bytes> ########## APPEND ONLY MODE ######### #是否开启日志功能 appendonly no # 刷新日志到disk的规则 # appendfsync always appendfsync everysec # appendfsync no ################ VIRTUAL MEMORY ########### #是否开启VM功能 vm-enabled no # vm-enabled yes vm-swap-file logs/redis.swap vm-max-memory 0 vm-page-size 32 vm-pages 134217728 vm-max-threads 4 ############# ADVANCED CONFIG ############### glueoutputbuf yes hash-max-zipmap-entries 64 hash-max-zipmap-value 512 #是否重置Hash表 activerehashing yes 修改配置文件vim redis.conf重启redis-server,redis-server启动时就是守护进程了redis常用命令 01 exits key //测试指定key是否存在,返回1表示存在,0不存在 02 del key1 key2 ....keyN //删除给定key,返回删除key的数目,0表示给定key都不存在 03 type key //返回给定key的value类型。返回 none 表示不存在key,string字符类型,list 链表类型 set 无序集合类型... 04 keys pattern //返回匹配指定模式的所有key,下面给个例子 05 randomkey //返回从当前数据库中随机选择的一个key,如果当前数据库是空的,返回空串 06 rename oldkey newkey //原子的重命名一个key,如果newkey存在,将会被覆盖,返回1表示成功,0失败。可能是oldkey不存在或者和newkey相同 07 renamenx oldkey newkey //同上,但是如果newkey存在返回失败 08 dbsize //返回当前数据库的key数量 09 expire key seconds //为key指定过期时间,单位是秒。返回1成功,0表示key已经设置过过期时间或者不存在 10 ttl key //返回设置过过期时间的key的剩余过期秒数 -1表示key不存在或者没有设置过过期时间 11 select db-index //通过索引选择数据库,默认连接的数据库所有是0,默认数据库数是16个。返回1表示成功,0失败 12 move key db-index //将key从当前数据库移动到指定数据库。返回1成功。0 如果key不存在,或者已经在指定数据库中 13 flushdb //删除当前数据库中所有key,此方法不会失败。慎用 14 flushall //删除所有数据库中的所有key,此方法不会失败。更加慎用 string 类型数据操作命令 01 set key value //设置key对应的值为string类型的value,返回1表示成功,0失败 02 setnx key value //同上,如果key已经存在,返回0 。nx 是not exist的意思 03 get key //获取key对应的string值,如果key不存在返回nil 04 getset key value //原子的设置key的值,并返回key的旧值。如果key不存在返回nil 05 mget key1 key2 ... keyN //一次获取多个key的值,如果对应key不存在,则对应返回nil。下面是个实验,首先清空当前数据库,然后设置k1,k2.获取时k3对应返回nil 06 mset key1 value1 ... keyN valueN //一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置 07 msetnx key1 value1 ... keyN valueN //同上,但是不会覆盖已经存在的key 08 incr key //对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1 09 decr key //同上,但是做的是减减操作,decr一个不存在key,则设置key为-1 10 incrby key integer //同incr,加指定值 ,key不存在时候会设置key,并认为原来的value是 0 11 decrby key integer //同decr,减指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样。 12 append key value //给指定key的字符串值追加value,返回新字符串值的长度。下面给个例子 13 substr key start end //返回截取过的key的字符串值,注意并不修改key的值。下标是从0开始的,接着上面例子 list 类型数据操作命令 01 lpush key string //在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型 02 rpush key string //同上,在尾部添加 03 llen key //返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误 04 lrange key start end //返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素 ,key不存在返回空列表 05 ltrim key start end //截取list,保留指定区间内元素,成功返回1,key不存在返回错误 06 lset key index value //设置list中指定下标的元素值,成功返回1,key或者下标不存在返回错误 07 lrem key count value //从key对应list中删除count个和value相同的元素。count为0时候删除全部 08 lpop key //从list的头部删除元素,并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list返回错误 09 rpop //同上,但是从尾部删除 10 blpop key1...keyN timeout //从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil。有点像unix的select或者poll 11 brpop //同blpop,一个是从头部删除一个是从尾部删除 12 rpoplpush srckey destkey //从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的.如果srckey是空或者不存在返回nil set 类型数据操作命令 01 sadd key member //添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误 02 srem key member //从key对应set中移除给定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型的值返回错误 03 spop key //删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil 04 srandmember key //同spop,随机取set中的一个元素,但是不删除元素 05 smove srckey dstkey member //从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set类型返回错误 06 scard key //返回set的元素个数,如果set是空或者key不存在返回0 07 sismember key member //判断member是否在set中,存在返回1,0表示不存在或者key不存在 08 sinter key1 key2...keyN //返回所有给定key的交集 09 sinterstore dstkey key1...keyN //同sinter,但是会同时将交集存到dstkey下 10 sunion key1 key2...keyN //返回所有给定key的并集 11 sunionstore dstkey key1...keyN //同sunion,并同时保存并集到dstkey下 12 sdiff key1 key2...keyN //返回所有给定key的差集 13 sdiffstore dstkey key1...keyN //同sdiff,并同时保存差集到dstkey下 14 smembers key //返回key对应set的所有元素,结果是无序的 sorted set 类型数据操作命令 01 zadd key score member //添加元素到集合,元素在集合中存在则更新对应score 02 zrem key member //删除指定元素,1表示成功,如果元素不存在返回0 03 zincrby key incr member //增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的score值 04 zrank key member //返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的 05 zrevrank key member //同上,但是集合中元素是按score从大到小排序 06 zrange key start end //类似lrange操作从集合中去指定区间的元素。返回的是有序结果 07 zrevrange key start end //同上,返回结果是按score逆序的 08 zrangebyscore key min max //返回集合中score在给定区间的元素 09 zcount key min max //返回集合中score在给定区间的数量 10 zcard key //返回集合中元素个数 11 zscore key element //返回给定元素对应的score 12 zremrangebyrank key min max //删除集合中排名在给定区间的元素 13 zremrangebyscore key min max //删除集合中score在给定区间的元素 hash 类型数据操作命令 01 hset key field value //设置hash field为指定值,如果key不存在,则先创建 02 hget key field //获取指定的hash field 03 hmget key filed1....fieldN //获取全部指定的hash filed 04 hmset key filed1 value1 ... filedN valueN //同时设置hash的多个field 05 hincrby key field integer //将指定的hash filed 加上给定值 06 hexists key field //测试指定field是否存在 07 hdel key field //删除指定的hash field 08 hlen key //返回指定hash的field数量 09 hkeys key //返回hash的所有field 10 hvals key //返回hash的所有value 11 hgetall //返回hash的所有filed和value 结束
1.PSps命令将某个进程显示出来grep命令是查找中间的|是管道命令 是指ps命令与grep同时执行ps是LINUX下最常用的也是非常强大的进程查看命令grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。以下这条命令是检查java 进程是否存在:ps -ef |grep java字段含义如下: UID PID PPID C STIME TTY TIME CMD zzw 14124 13991 0 00:38 pts/0 00:00:00 grep --color=auto dae **UID :程序被该 UID 所拥有PID :就是这个程序的 IDPPID :则是其上级父程序的ID,如果父进程先于子进程关闭,子进程将有init进程(PPID=1)管理C :CPU使用的资源百分比STIME :系统启动时间TTY :登入者的终端机位置TIME :使用掉的CPU时间。CMD :所下达的是什么指令**2.SCP不同IP的服务器间传输文件 scp ./nginx.conf root@192.168.0.116:/usr/local/nginx/conf/
1.nginx官网下载安装包,选择最新的版本http://nginx.org/download/nginx-1.15.5.tar.gz解压安装包 [root@localhost usr]# tar -zxvf ./nginx-1.15.5.tar.gz 2.安装c++查看c++编译环境是否安装 [root@localhost nginx-1.15.5]# rpm -qa gcc-c++ 可以看出来c++已经安装过了3.安装nginx及相关组件①openssl安装https://www.openssl.org/source/下载安装包 [root@localhost usr]# wget https://www.openssl.org/source/openssl-fips-2.0.16.tar.gz 解压安装包 [root@localhost usr]# tar -zxvf ./openssl-fips-2.0.16.tar.gz ./config && make && make install 安装日志太多,以下是安装结束的日志②pcre安装下载pcre安装包 wget https://ftp.pcre.org/pub/pcre/pcre2-10.32.tar.gz 解压安装包 [root@localhost usr]# tar -zxvf ./pcre2-10.32.tar.gz pcre安装包解压目录开始安装pcre [root@localhost pcre2-10.32]# ./configure && make && make install pcre安装完成③zlib安装下载zlib安装包 wget http://www.zlib.net/zlib-1.2.11.tar.gz 解压安装包 [root@localhost usr]# tar -zxvf ./zlib-1.2.11.tar.gz 开始安装 [root@localhost zlib-1.2.11]# ./configure && make && make install 安装完成④nginx安装开始安装 [root@localhost zlib-1.2.11]# ./configure && make && make install 报错了,应该是PCRE包的问题,但是刚才已经安装了,网上查阅资料,需要安装pcre-devel、zlib-devel、openssl-devel包1)pcre-devel安装https://pkgs.org/download/pcre-devel [root@localhost usr]# wget http://mirror.centos.org/centos/6/os/x86_64/Packages/pcre-devel-7.8-7.el6.x86_64.rpm 下载到的是一个rpm文件安装该文件 [root@localhost usr]# rpm -ivh ./pcre-devel-7.8-7.el6.x86_64.rpm 2)zlib-devel安装 [root@localhost usr]# yum -y install zlib-devel* 3)openssl-devel安装 [root@localhost usr]# yum -y install openssl-devel* pcre-devel、zlib-devel、openssl-devel安装完成,重新安装nginx [root@localhost nginx-1.15.5]# ./configure && make && make install nginx安装完成简化第2、3步:一个一个安装太繁琐,做下整合 [root@localhost nginx]# yum -y install gcc* pcre* pcre-devel* zlib* zlib-devel* openssl* openssl-devel* 检查这些依赖包是否全部安装 [root@localhost nginx]# rpm -qa gcc* pcre* pcre-devel* zlib* zlib-devel* openssl* openssl-devel* 已全部安装 4.启动nginx①先找到nginx的安装目录 [root@localhost /]# whereis nginx 可以看到nginx已经安装到目录/usr/local/nginx下了,进入该安装目录启动脚本是/nginx/sbin/nginx,启动nginx [root@localhost nginx]# /usr/local/nginx/sbin/nginx 报着个错的原因是80端口被占用,解决办法是杀掉nginx进程 [root@localhost nginx]# killall -9 nginx 再次启动 [root@localhost nginx]# /usr/local/nginx/sbin/nginx 查看是否启动成功 [root@localhost nginx]# ps aux|grep nginx nginx启动成功,浏览器访问虚拟机IP测试发现访问不了,一般是防火墙端口过滤规则没设置,查看防火墙状态及过滤规则设置只有22和7001端口可以入站访问,添加入站规则白名单 [root@localhost etc]# vim /etc/sysconfig/iptables 添加-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT保存后,重启防火墙服务 [root@localhost /]# service iptables restart 浏览器重新访问结束
安装Tomcat前需要先安装JDK: java -version 如果没有安装,请参考链接:https://yq.aliyun.com/articles/653373?spm=a2c4e.11155435.0.0.c92b3312NrGMmg下载tomcat 8.0.53:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.0.53/bin/apache-tomcat-8.0.53.tar.gz解压文件apache-tomcat-8.0.53.tar.gz tar -zxvf ./apache-tomcat-8.0.53.tar.gz 解压过的压缩包记得删掉,会占用服务器磁盘空间 rm -rf ./apache-tomcat-8.0.53.tar.gz 进入bin目录 cd /usr/local/apache-tomcat-8.0.53/bin 启动tomcat服务:sh ./startup.sh浏览器访问:http://192.168.43.61:8080/停止tomcat服务:sh ./shutdown.sh结束
安装WebLogic 12c前需要先安装JDK:https://yq.aliyun.com/articles/653373?spm=a2c4e.11155435.0.0.c92b3312NrGMmg一、可视化界面安装:1.Oracle官网下载weblogic 12c:https://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html我选的是这个版本:文件已经下载好2.创建bea组和weblogic用户 [root@localhost mail]# groupadd bea [root@localhost mail]# useradd -g bea weblogic [root@localhost mail]# passwd weblogic Changing password for user weblogic. New password: BAD PASSWORD: it is based on a dictionary word Retype new password: passwd: all authentication tokens updated successfully. [root@localhost mail]# 删除用户的时候用:userdel -r 用户名,会删除用户的HOME目录以及mail目录创建weblogic安装文件目录 [root@localhost oracle]# mkdir -p /usr/bea/weblogic [root@localhost oracle]# chown -R weblogic:bea /usr/bea [root@localhost oracle]# chmod -R 775 /usr/bea [root@localhost oracle]# 解压 unzip ./fmw_12.2.1.3.0_infrastructure_Disk1_1of1.zip解压出来要执行的文件fmw_12.2.1.3.0_infrastructure.jar执行java -jar ./fmw_12.2.1.3.0_infrastructure.jar因为文件夹/usr/oraInventory所属于oracle用户,weblogic用户无访问权限解决方案:切换到root用户,将weblogic用户附加到oracle所属的用户组下 [weblogic@localhost weblogic]$ su - root Password: [root@localhost ~]# groups oracle oracle : oinstall dba [root@localhost ~]# usermod -G oinstall weblogic [root@localhost ~]# groups weblogic weblogic : bea oinstall [root@localhost ~]# 切换到weblogic用户,重新执行java -jar ./fmw_12.2.1.3.0_infrastructure.jar可视化界面需要用Xmanager的Xstart启动点运行,会有两个窗口重新执行java -jar ./fmw_12.2.1.3.0_infrastructure.jar开始可视化安装跳过自动更新选择安装目录保存响应文件wls.rsp,静默安装的时候会用到继续安装:Install安装完成**二、静默安装1.需要准备两个文件wls.rsp和oraInst.loc**wls.rsp(就是之前可视化安装保存的wls.rsp文件) [ENGINE] #DO NOT CHANGE THIS. Response File Version=1.0.0.0.0 [GENERIC] #Set this to true if you wish to skip software updates DECLINE_AUTO_UPDATES=true #My Oracle Support User Name MOS_USERNAME= #My Oracle Support Password MOS_PASSWORD=<SECURE VALUE> #If the Software updates are already downloaded and available on your local system, then specify the path to the directory where these patches are available and set SPECIFY_DOWNLOAD_LOCATION to true AUTO_UPDATES_LOCATION= #Proxy Server Name to connect to My Oracle Support SOFTWARE_UPDATES_PROXY_SERVER= #Proxy Server Port SOFTWARE_UPDATES_PROXY_PORT= #Proxy Server Username SOFTWARE_UPDATES_PROXY_USER= #Proxy Server Password SOFTWARE_UPDATES_PROXY_PASSWORD=<SECURE VALUE> #The oracle home location. This can be an existing Oracle Home or a new Oracle Home ORACLE_HOME=/usr/bea/weblogic/Oracle/Middleware/Oracle_Home #The federated oracle home locations. This should be an existing Oracle Home. Multiple values can be provided as comma seperated values FEDERATED_ORACLE_HOMES= #Set this variable value to the Installation Type selected. e.g. Fusion Middleware Infrastructure With Examples, Fusion Middleware Infrastructure. INSTALL_TYPE=Fusion Middleware Infrastructure oraInst.loc(可视化界面安装后生成的vim /etc/oraInst.loc文件) #产品清单目录 inventory_loc=/usr/oraInventory #组名称 inst_group=oinstall 2.执行命令,等待程序执行结束java -jar fmw_12.2.1.3.0_infrastructure.jar -silent -responseFile /usr/bea/weblogic/wls.rsp -invPtrLoc /usr/bea/weblogic/oraInst.loc**三、建域Domain1.可视化界面建域**启动Xstart执行sh /usr/bea/weblogic/Oracle/Middleware/Oracle_Home/wlserver/common/bin/config.sh2.命令行方式建域vim /usr/bea/weblogic/Oracle/Middleware/Oracle_Home/wlserver/common/templates/scripts/wlst/basicWLSDomain.py该文件就是建域文件,按照自己的需求稍作修改,就可以使用了sh /usr/bea/weblogic/Oracle/Middleware/Oracle_Home/oracle_common/common/bin/wslt.sh /usr/bea/weblogic/basicWLSDomain.py如果不报错,说明创建成功步骤1和步骤2选择其一执行**3.建域完成后,启动weblogic域服务%DOMAIN_HOME%(域目录): /home/weblogic/domains/base_domain**启动脚本在%DOMAIN_HOME%/bin/startWebLogic.sh用weblogic用户执行:nohup ./startWebLogic.sh &查看启动日志:tail -f nohup.out说明服务正在运行,启动成功Ctrl+c退出日志,执行:ps -ef|grep wls查看weblogic服务运行情况可以看到刚刚创建的AdminServer域已经启动浏览器访问http://192.168.43.61:7001/console正在加载登录页面**四、常见问题:1.如果创建多个域,每个域又创建了多个受管服务器,每个域和服务器都要对应一个端口,访问端口记不住,去哪里找?**vim %DOMAIN_HOME%/config/config.xml因为base_domain使用的是默认7001端口,所以这里的域端口没有配置管理服务器的端口70022.如果weblogic控制管理台的用户名或密码忘记了,怎么改?①进入目录security: cd /home/weblogic/domains/base_domain/security ②备份文件DefaultAuthenticatorInit.ldift cp ./DefaultAuthenticatorInit.ldift ./DefaultAuthenticatorInit.ldift.bak ③执行命令,重新生成文件DefaultAuthenticatorInit.ldift java -classpath /usr/bea/weblogic/Oracle/Middleware/Oracle_Home/wlserver/server/lib/weblogic.jar weblogic.security.utils.AdminAccount 新用户名 新密码 . (特别注意:命令最后有一个空格和一个'.')④进入管理服务器AdminServer目录(%DOMAIN_HOME%/servers/AdminServer),重命名data目录: mv ./data ./data_old ⑤修改管理服务器的boot.properies文件 vim /home/weblogic/domains/base_domain/servers/AdminServer/security/boot.properties 第一次启动服务器时,会将明文加密,用户名密码要和③步骤的保持一致⑥启动服务器后,就可以用weblogic/weblogic12登录了3.如果要删除域,应该如何操作?①找到创建域的注册文件domain-registry.xml vim /usr/bea/weblogic/Oracle/Middleware/Oracle_Home/domain-registry.xml 删掉base_domain的那条记录,退出编辑,保存②删除域目录%DOMAIN_HOME% rm -rf /home/weblogic/domains/base_domain 结束
安装Oracle前需要先安装JDK:https://yq.aliyun.com/articles/653373?spm=a2c4e.11155435.0.0.c92b3312NrGMmg1.Oracle官网下载安装包https://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-linux-12201-3608234.html2.操作系统硬件检查检查运行总内存是否大于1G:grep MemTotal /proc/meminfo查询系统位数:uname -m查询系统版本:cat /proc/version查询系统内核版本:uname -r 磁盘空间可用大小:df -h/tmp文件夹至少1G:df -h /tmp3.安装前系统配置,安装依赖包①检查Oracle需要的rmp安装情况 rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst libX11 libXau libxcb libXi make sysstat ②安装缺失的rpm yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 elfutils-libelf-devel gcc gcc-c++ glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.i686 libaio libaio*.i686 libaio-devel libaio-devel*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 libXp Red Hat Enterprise Linux Server(RHEL) 的yum服务是付费的,因为没有付费,所以无法使用yum安装软件,如RHEL想安装LNMP必须要先按此教程设置好yum,并可以正常使用后才可以安装LNMP一键安装包,会提示如下错误:This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. 或如下错误信息:This system is not registered with RHN. RHN support will be disabled.解决方法: rpm -qa|grep yum|xargs rpm -e --nodeps 将yum卸载掉 不报错说明卸载成功uname -a 看一下系统版本号和系统位数到 http://mirrors.kernel.org/centos/找到对应的系统版本我的系统是el6.x86_64,选择这个路径下的Packageshttps://mirrors.edge.kernel.org/centos/6/os/x86_64/Packages/找到这3个包的路径下载这3个包wget https://mirrors.edge.kernel.org/centos/6/os/x86_64/Packages/yum-3.2.29-81.el6.centos.noarch.rpmwget https://mirrors.edge.kernel.org/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpmwget https://mirrors.edge.kernel.org/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm下载完成安装yum,进入文件路径下,执行rpm-ivh yum-*新建repo 配置文件 touch /etc/yum.repos.d/CentOS-Base.repovim /etc/yum.repos.d/CentOS-Base.repo # remarked out baseurl= line instead. [base] name=CentOS-$6 - Base - 163.com #mirrorlist=http://mirrorlist.centos.org/?release=$6&arch=$basearch&repo=os baseurl=http://mirrors.163.com/centos/6/os/$basearch/ gpgcheck=1 gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 #released updates [updates] name=CentOS-$6 - Updates - 163.com #mirrorlist=http://mirrorlist.centos.org/?release=$6&arch=$basearch&repo=updates baseurl=http://mirrors.163.com/centos/6/updates/$basearch/ gpgcheck=1 gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 #additional packages that may be useful [extras] name=CentOS-$6 - Extras - 163.com #mirrorlist=http://mirrorlist.centos.org/?release=$6&arch=$basearch&repo=extras baseurl=http://mirrors.163.com/centos/6/extras/$basearch/ gpgcheck=1 gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$6 - Plus - 163.com baseurl=http://mirrors.163.com/centos/6/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 源文件修改后需要更新yum源yum makecache:生成缓存yum update:系统更新(包括程序和内核)更新完成,以上是全部的安装和更新内容重新安装缺失的rpm yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*.i686 elfutils-libelf-devel gcc gcc-c++ glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.i686 libaio libaio*.i686 libaio-devel libaio-devel*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686 libXp 又报错了。。。不要慌,慢慢来该错误是说openssl这个包冲突了,按理说应该先卸载openssl,再进行安装,但是通过查阅资料openssl依赖的包很多,卸载系统自带的openssl容易出现这样那样的问题,所以我这的思路是排查一下尚未安装的包中,哪个包依赖了openssl检查Oracle需要的rmp安装情况rpm -q binutils compat-libcap1 compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXext libXtst libX11 libXau libxcb libXi make sysstat unixODBC*.i686中依赖了openssl,添加参数--skip-broken,会跳过有依赖问题的包yum -y install unixODBC*.i686 --skip-broken4.创建用户,用户组和安装目录安装和运行Oracle数据软件都需要使用指定的用户组内的用户(Oracle),处于安全考虑,用户组建为oinstall,dba,oinstall组中的成员用于管理Oracle数据库物理软件,dba组中的成员用于管理、操作数据库,具有sysdba权限 //创建Oracle用户组oinstall [root@localhost file]# groupadd oinstall //创建Oracle用户组dba [root@localhost file]# groupadd dba //将oracle用户加入到新建的2个用户组 [root@localhost file]# useradd -g oinstall -G dba oracle //修改oracle用户密码 [root@localhost file]# passwd oracle Changing password for user oracle. New password: BAD PASSWORD: it is WAY too short BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. //创建oracle安装目录 [root@localhost file]# mkdir -p /usr/oracle //创建oracle安装文件目录 [root@localhost file]# mkdir -p /opt/oracle/orainstall //更改oracle安装目录用户组 [root@localhost file]# chown -R oracle:oinstall /usr/oracle/ //更改oracle安装目录权限 [root@localhost file]# chmod -R 775 /usr/oracle/ //更改oracle安装文件目录用户组 [root@localhost file]# chown -R oracle:oinstall /opt/oracle/orainstall/ //更改oracle安装文件目录操作权限 [root@localhost file]# chmod -R 755 /opt/oracle/orainstall/ [root@localhost file]# 5.配置系统参数,root用户修改①编辑内核参数:vim /etc/sysctl.conf # Kernel sysctl configuration file for Red Hat Linux # # For binary values, 0 is disabled, 1 is enabled. See sysctl(8) and # sysctl.conf(5) for more details. # # Use '/sbin/sysctl -a' to list all possible parameters. # Controls IP packet forwarding net.ipv4.ip_forward = 0 # Controls source route verification net.ipv4.conf.default.rp_filter = 1 # Do not accept source routing net.ipv4.conf.default.accept_source_route = 0 # Controls the System Request debugging functionality of the kernel kernel.sysrq = 0 # Controls whether core dumps will append the PID to the core filename. # Useful for debugging multi-threaded applications. kernel.core_uses_pid = 1 # Controls the use of TCP syncookies net.ipv4.tcp_syncookies = 1 # Controls the default maxmimum size of a mesage queue kernel.msgmnb = 65536 # Controls the maximum size of a message, in bytes kernel.msgmax = 65536 # Controls the maximum shared segment size, in bytes kernel.shmmax = 2147483648 # Controls the maximum number of shared memory segments, in pages kernel.shmall = 2097152 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048586 fs.file-max = 6815744 ②生效新配置的内核参数:sysctl -p③配置oracle用户的shell limit:vim /etc/security/limits.conf //noproc - 进程的最大数目 //stack - 最大栈大小 //nofile - 打开文件的最大数目 //soft 指的是当前系统生效的设置值 //hard 表明系统中所能设定的最大值 //soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值。 //oracle:被限制的用户名,组名前面加@和用户名区别 oracle soft nproc 2047 oracle hard nproc 16384 oracle soft nofile 1024 oracle hard nofile 65536 oracle soft stack 10240 oracle hard stack 10240 ④编辑登录配置文件:vi /etc/pam.d/login 在文本最后添加:session required pam_limits.so或者session required /lib/security/pam_limits.so使shell limit生效⑤oracle用户环境变量配置 要成功安装并使用Oracle数据库软件,必须在Oracle用户的.bash_profile文件中设置ORACLE_BASE、ORACLE_HOME、ORACLE_SID和PATH环境变量,其他的根据需要来设置。ORACLE_HOME可以在安装前手动配置,另外,Oracle安装过程中会根据ORACLE_BASE的值自动指定的ORACLE_HOME,所以也可以在安装后将这个ORACLE_HOME写入.bash_profile # .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH # use for oracle export ORACLE_BASE=/usr/oracle export ORACLE_HOME=$ORACLE_BASE/product export ORACLE_SID=orcl export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib #防止Oracle安装界面乱码,先把语言环境改为英文 export LANG=en_US if [ $USER = "oracle" ];then if [ $SHELL = "/bin/ksh" ];then ulimit -p 16384 ulimit -n 65536 else ulimit -u 16384 -n 65536 fi fi ⑥生效环境变量source .bash_profile⑦xhost + 参考链接:https://www.linuxidc.com/Linux/2012-11/74874.htm xhost 命令用途:控制什么人可以访问当前主机上的增强 X-Windows。 语法:xhost [ + | - ] [ Name ] ,"+"表示增加,"-"表示去除 描述:xhost 是用来控制X server访问权限的。 通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是对图形来说,是在hostA上显示的, 需要使用hostA的Xserver,所以hostA是server。因此在登陆到hostB前,需要在hostA上运行xhost +来使其它用户能够访问hostA的Xserver。 解决方法:安装tigervnc-server安装:yum -y install tigervnc-server启动:vncserverexport DISPLAY=localhost:1安装xtermyum -y install xterm6.安装Oracle①将Oracle安装包放到/opt/oracle/oinstall目录下②切换到oracle用户,解压:unzip ./linuxx64_12201_database.zip(大约等待1-2分钟)③使用Xmanager的Xstart运行脚本runInstaller开始安装④oracle可视化界面安装步骤这里创建目录/usr/oraInventory时会报无写权限的异常,这里手动创建目录并分配权限切换到root用户这里会提示用root用户执行两个脚本点OK继续安装oracle安装完成我们登录网址验证一下:因为我的oracle是安装到虚拟机,所以地址是https://192.168.43.61:5500/em你会发现无法访问,检查防火墙是否开启,这里暂时把防火墙关闭,也可以配置防火墙入站和出站规则使用该平台修改管理员密码选中需要修改的用户选择 变更账户注销重新登录,密码修改完成创建oracle用户:create user oracle identified by oracle;创建用户时,用户名要以C##或c##开头create user c##oracle identified by c##oracle;grant dba to c##oracle;出现这种问题原因在官网上有提到:https://docs.oracle.com/database/121/DBSEG/users.htm#DBSEG754常用sql命令切换到oracle用户:su - oracle连接到dba用户:sqlplus /nologconnect / as sysdba关闭oracle实例:shutdown immediate启动oracle实例:startup监听开启停止lsnrctl statuslsnrctl stoplsnrctl start结束
1.yum list mysql* 查看服务器是否安装了MySQL2.yum remove mysql mysql-server mysql-libs compat-mysql51 移除已安装的MySQLyum list mysql* 再次检查3.查看是否还有mysql软件rpm -qa|grep mysql已经卸载完成4.安装MySQL客户端*①下载MySQL官网的yum仓库:https://dev.mysql.com/downloads/repo/yum/②从本机目录安装MySQLyum localinstall /home/localinstall mysql80-community-release-el6-1.noarch.rpm③查看yum仓库是否成功添加yum repolist enabled |grep "mysql.*-community.*"④安装MySQLyum install mysql-community-server安装MySQL80报错⑤尝试换成MySQL57MySQL默认会安装最新版的也就是80,要安装57需要修改文件vim /etc/yum.repos.d/mysql-community.repo⑥再次安装MySQLyum install mysql-community-server安装成功了。。。⑦启动MySQL服务service mysqld start5.数据库字符集设置,因为开发的时候一般都是UTF-8,MySQL默认是latin1(ISO_8859_1),如果不保持一致,后面中文字符肯定会乱码在[mysqld]下加入配置参数 character-set-server=utf8 保存退出后重启MySQL服务6.设置MySQL服务开机启动,避免服务器重启后,重启MySQL服务chkconfig --add mysqldchkconfig mysqld on查看开机启动设置是否成功chkconfig --list | grep mysql* 7.登录MySQL*用工具登录MySQL会报错,这个错一般是由密码错误引起的,需要重置密码vim /etc/my.cnf 文件中添加跳过密码校验配置 skip-grant-tables保存退出后重启服务按一般解决方案是:进入mysql命令模式:mysql -u root mysql UPDATE user SET password=PASSWORD('123') where USER='root'; 但是提示没有password字段。。。解决方案:password改为authentication_stringUPDATE user SET authentication_string=PASSWORD('123') where USER='root'; 修改后刷新MySQL的系统权限相关表 FLUSH PRIVILEGES;退出MySQL vim /etc/my.cnf 删除配置 skip-grant-tables重启MySQL服务,mysql -uroot -p123登录成功8.设置MySQL忽略大小写,这个地方巨坑(举个例子,默认是区分大小写,table和Table是两张表)vim /etc/my.conf 添加配置 lower_case_table_names=19.默认密码校验太复杂,设置简单密码报错SHOW VARIABLES LIKE 'validate_password%'; 查看默认配置默认值是1,即MEDIUM,所以刚开始设置的密码必须符合长度,且必须含有数字,小写或大写字母,特殊字符。比如我想把root密码改为123,就需要修改两个全局参数:validate_password_policy和validate_password_length①修改validate_password_policy参数的值:set global validate_password_policy=0;这样,判断密码的标准就基于密码的长度了。这个由validate_password_length参数来决定。②修改validate_password_length参数的值:set global validate_password_length=3;你会发现明明修改的是3,怎么会变成4呢?这是因为validate_password_length参数默认为8,它有最小值的限制,最小值为:validate_password_number_count + validate_password_special_char_count + (2 * validate_password_mixed_case_count)其中,validate_password_number_count指定了密码中数据的长度,validate_password_special_char_count指定了密码中特殊字符的长度,validate_password_mixed_case_count指定了密码中大小字母的长度。这些参数,默认值均为1,所以validate_password_length最小值为4,如果你显性指定validate_password_length的值小于4,尽管不会报错,但validate_password_length的值将设为4。所以这里我先把validate_password_special_char_count设为0,这里的validate_password_length最小值就是3了再重新修改validate_password_length的值为3设置成功了,接下来我把密码改为123:ALTER USER 'root'@'localhost' IDENTIFIED BY '123';root密码重置成功10.Navicat for MySQL连接MySQL报错解决方法:在本机登入MySQL后,更改MySQL数据库里的"user"表里的"host"项,从"localhost"改为'%' [root@localhost local]# mysql -uroot -p123 mysql> show databases; mysql> use mysql mysql> show tables; mysql> select host from user where user='root'; mysql> update user set host='%' where user='root'; mysql> select host from user where user='root'; 重启MySQL服务 service mysqld stop service mysqld start 重新连接Navicat for MySQL:11.导入sql文件,source命令连接MySQL数据库,导入sql文件 [root@localhost /]# mysql -uroot -p123 mysql> source /pinyougoudb.sql 导入成功结束
jdk的安装并不复杂,分三步:1. 在Oracle官网下载对应的jdkhttps://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2. 解压jdk-8u181-linux-x64.tar.gztar -xvf ./jdk-8u181-linux-x64.tar.gz会解压到./jdk1.8.0_171该路径就是JAVA_HOMEJAVA_HOME=/usr/local/jdk1.8.0_171JRE_HOME=/usr/local/jdk1.8.0_171/jreCLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/libPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/binexport JAVA_HOME JRE_HOME CLASS_PATH PATH注意:CLASS_PATH在Linux中用‘:’,Windows中用';'3. 配置环境变量vim /etc/profile 修改环境变量,按i或insert键进入编辑模式编辑完成后按ESC键退出编辑状态,输入:wq,保存并退出source /etc/profile 使配置文件生效java -version 验证是否配置成功结束
/**
* 获取用户实际IP地址
* @param request 当前请求对象
* @return 实际IP地址
*/
public static String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.trace("当前IP来源[X-Forwarded-For], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(',');
if(index != -1){
return ip.substring(0, index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
logger.trace("当前IP来源[X-Real-IP], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
return ip;
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.trace("当前IP来源[Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.trace("当前IP来源[WL-Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.trace("当前IP来源[HTTP_CLIENT_IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.trace("当前IP来源[HTTP_X_FORWARDED_FOR], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.trace("当前IP来源[getRemoteAddr], 值[{}]", ip);
}
if ("0:0:0:0:0:0:0:1".equals(ip)) {
String ipv4FromLocal = getIpv4FromLocal();
if (StringUtils.isNotEmpty(ipv4FromLocal)) {
ip = ipv4FromLocal;
}
}
return ip;
}
/**
* 获取本地IP地址
* @return IP地址
*/
private static String getIpv4FromLocal() {
String ip = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
Process process = Runtime.getRuntime().exec("cmd.exe /c ipconfig | findstr IPv4");
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = br.readLine();
ip = line.substring(line.indexOf(':') + 1).trim();
} catch (IOException e) {
logger.warn("获取本地IP异常", e);
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.debug("流关闭异常", e);
}
}
return ip;
}
/**
* 获取用户实际IP地址
* @param request 当前请求对象
* @return 实际IP地址
*/
public static String getRemoteIp(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
logger.trace("当前IP来源[X-Forwarded-For], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = ip.indexOf(',');
if(index != -1){
return ip.substring(0, index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
logger.trace("当前IP来源[X-Real-IP], 值[{}]", ip);
if(!StringUtils.isEmpty(ip) && !NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)){
return ip;
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
logger.trace("当前IP来源[Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
logger.trace("当前IP来源[WL-Proxy-Client-IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
logger.trace("当前IP来源[HTTP_CLIENT_IP], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
logger.trace("当前IP来源[HTTP_X_FORWARDED_FOR], 值[{}]", ip);
}
if (StringUtils.isEmpty(ip) || NoticeConstant.UNKNOWN.equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
logger.trace("当前IP来源[getRemoteAddr], 值[{}]", ip);
}
if ("0:0:0:0:0:0:0:1".equals(ip)) {
String ipv4FromLocal = getIpv4FromLocal();
if (StringUtils.isNotEmpty(ipv4FromLocal)) {
ip = ipv4FromLocal;
}
}
return ip;
}
/**
* 获取本地IP地址
* @return IP地址
*/
private static String getIpv4FromLocal() {
String ip = null;
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
try {
Process process = Runtime.getRuntime().exec("cmd.exe /c ipconfig | findstr IPv4");
is = process.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line = br.readLine();
ip = line.substring(line.indexOf(':') + 1).trim();
} catch (IOException e) {
logger.warn("获取本地IP异常", e);
} finally {
try {
if (br != null) {
br.close();
}
if (isr != null) {
isr.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
logger.debug("流关闭异常", e);
}
}
return ip;
}