这几天和几个小伙伴写活动平台的项目 有消息通知的功能需求 故学习一下RabbitMQ

一、RabbitMQ是什么?

RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。

二、RabbitMQ安装步骤

由于RabbitMQ是基于Erlang(面向高并发的语言)语言开发,所以在安装RabbitMQ之前,需要先安装Erlang

1、安装Erlang和socat(失败安装)

我们安装最新版本的Erlang到服务器中。 Erlang在默认的YUM存储库中不可用,因此需要安装EPEL存储库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 先执行第一个命令安装EPEL存储库
[root@iZ8vbguck7zxavr5aco6knZ ~]# yum -y install epel-release

Loaded plugins: fastestmirror | 3.6 kB 00:00:00
......

Installed:
epel-release.noarch 0:7-13

Complete!

# 再执行第二个命令安装Erlang和socat
[root@iZ8vbguck7zxavr5aco6knZ ~]# yum -y install erlang socat

Complete!

安装完之后看看版本

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ ~]# erl -version

Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 5.10.4

2、安装RabbitMQ

可以去官网下载rpm包 点此前往下载 3.8版安装之后没有config文件 点此下载旧版本

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# ls

rabbitmq-server-3.8.9-1.el7.noarch.rpm rabbitmq-server-3.7.28-1.el7.noarch.rpm

执行安装程序,这里发生了错误,由于安装的rabbitmq需要的erlang版本得 >= 21.3,而我们是 5.10.4,故erlang得重新安装

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum install rabbitmq-server-3.8.9-1.el7.noarch.rpm

Error: Package: rabbitmq-server-3.8.9-1.el7.noarch (/rabbitmq-server-3.8.9-1.el7.noarch)
Requires: erlang >= 21.3
Installed: erlang-R16B-03.18.el7.x86_64 (@epel)
erlang = R16B-03.18.el7
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest

[root@iZ8vbguck7zxavr5aco6knZ ~]# erl -version

Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 5.10.4

3、重新安装Erlang和socat(又一次失败了)

接下来我们使用脚本更新yum存储库,以下命令均不会有提示消息

1
2
3
4
5
6
7
8
# 导入将从2018年12月1日(GMT)开始使用的新PackageCloud密钥
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey

# 导入将在2018年12月1日(GMT)停止使用的旧PackageCloud密钥
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# rpm --import https://packagecloud.io/gpg.key

# 导入RabbitMQ签名密钥 这使RPM工具信任存储库中提供的软件包上的签名。为此,以超级用户身份运行rpm --import
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc

然后发现更新yum存储库以后安装erlang时没有安装包,没办法,apm安装包安装吧!官网下载

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# sudo yum install erlang-22.2.1-1.el7.x86_64

No package erlang-22.2.1-1.el7.x86_64 available.

有可能下载比较慢,需要科学上网

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# ls

otp_src_23.1.tar.gz rabbitmq-server-3.8.9-1.el7.noarch.rpm

开始安装前准备

解压

1
tar -xzvf otp_src_23.1.tar.gz 

创建安装目录

1
mkdir /opt/erlang_23.1

安装各种依赖

1
yum -y install gcc-c++
1
yum -y install ncurses-devel
1
yum -y install openssl
1
yum -y install openssl-devel
1
yum -y install unixODBC-devel

进入otp_src_23.1进行configure,会有警告,忽略即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@iZ8vbguck7zxavr5aco6knZ otp_src_23.1]# ./configure --prefix=/opt/erlang_23.1/

......
#以下为警告信息
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************

wx : No OpenGL headers found, wx will NOT be usable
No GLU headers (glu.h) found, wx will NOT be usable
wxWidgets not found, wx will NOT be usable

*********************************************************************
*********************************************************************
********************** DOCUMENTATION INFORMATION ******************
*********************************************************************

documentation :
fop is missing.
Using fakefop to generate placeholder PDF files.

*********************************************************************

现在就可以进行安装啦!

1
make && make install

然鹅装好以后,配置环境变量之后,还是老版本

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# erl -version

Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 5.10.4

4、彻底卸载erlang

首先直接删除安装文件

1
rm -rf /opt/erlang_23.1

然后执行下面三条命令,基本就可以删除了

1
2
3
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum list | grep erlang
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum -y remove erlang-*
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum remove erlang.x86_64

5、最后试试官方的方法(成功安装最新erlang)

官方的方法,先创建一个文件

1
vim /etc/yum.repos.d/rabbitmq-erlang.repo

在其中添加以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# In /etc/yum.repos.d/rabbitmq_erlang.repo
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

[rabbitmq_erlang-source]
name=rabbitmq_erlang-source
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

执行安装命令,安装之前先update一下yum

1
2
yum update -y
yum install -y erlang

6、安装RabbitMQ

rpm安装即可

1
2
3
4
5
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# rpm -ivh rabbitmq-server-3.7.28-1.el7.noarch.rpm

Preparing... ################################# [100%]
Updating / installing...
1:rabbitmq-server-3.7.28-1.el7 ################################# [100%]

默认安装完成后配置文件模板在:/usr/share/doc/rabbitmq-server-3.7.28/rabbitmq.config.example目录中,需要将配置文件复制到/etc/rabbitmq/目录中,并修改名称为rabbitmq.config

1
cp /usr/share/doc/rabbitmq-server-3.7.28/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config

至此,安装完成!!!

三、RabbitMQ基本使用

启动RabbitMQ的服务

1
systemctl start rabbitmq-server

停止RabbitMQ的服务

1
systemctl stop rabbitmq-server

重启RabbitMQ的服务

1
systemctl restart rabbitmq-server

查看RabbitMQ服务状态

1
systemctl status rabbitmq-server

插件管理命令

1
rabbitmq-plugins enable|list|disable 

在浏览器访问 http://ip:15672/ ,会出现以下界面,记得要开放15672端口,或者关闭防火墙

通过此用户进入系统 username: guest password: guest

四、RabbitMQ彻底删除

依次执行下面三条语句

1
2
3
4
# 停止RabbitMQ
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# systemctl stop rabbitmq-server
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum list | grep rabbitmq
[root@iZ8vbguck7zxavr5aco6knZ RabbitMQ]# yum -y remove rabbitmq-server.noarch

找出所有文件,赶尽杀绝,在根目录下执行下面这条语句(切记!!!)找出来后后依次删除即可

1
find / -name rabbit*

五、总结

折腾了快一天,写几个点防止后人踩雷吧

  • erlang 和 rabbitMQ 的版本一定要对应,如之前我使用 23.1的erlang 和 3.7.28 的RabbitMQ ,结果 RabbitMQ 不能启动
  • 我目前安装的最新的版本如 3.8.9 的 RabbitMQ 安装以后 /usr/share/doc/rabbitmq-server-3.8.9/ 下没有配置模板文件
  • yum 安装的 erlang 版本一般都比较低,可以去看看官方教程安装最新版
  • erlang 和 rabbitMQ 的版本一定要对应!!!切记!!!具体可以去 rabbitMQ 官网查看

搬运博客:

生成二维码(java后端)

有一个需求:就是实现 放票 抢票 检票 的功能

生成二维码

先引入两个jar包

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.1</version>
</dependency>

生成方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.payplatform.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;

public class QRCodeUtil {
//二维码颜色
private static final int BLACK = 0xFF000000;
//二维码颜色
private static final int WHITE = 0xFFFFFFFF;

public static void main(String[] args) throws Exception {
zxingCodeCreate("http://www.baidu.com", 300, 300, "D:/qrcode.jpg", "jpg");
// zxingCodeAnalyze("D:/qrcode.jpg");
}
/**
* 生成二维码
* @param text 二维码内容
* @param width 二维码宽
* @param height 二维码高
* @param outPutPath 二维码生成保存路径
* @param imageType 二维码生成格式
*/
public static void zxingCodeCreate(String text, int width, int height, String outPutPath, String imageType){
Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
//设置编码字符集
his.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
//1、生成二维码
BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);

//2、获取二维码宽高
int codeWidth = encode.getWidth();
int codeHeight = encode.getHeight();

//3、将二维码放入缓冲流
BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < codeWidth; i++) {
for (int j = 0; j < codeHeight; j++) {
//4、循环将二维码内容定入图片
image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
}
}
File outPutImage = new File(outPutPath);
//如果图片不存在创建图片
if(!outPutImage.exists())
outPutImage.createNewFile();
//5、将二维码写入图片
ImageIO.write(image, imageType, outPutImage);
} catch (WriterException e) {
e.printStackTrace();
System.out.println("二维码生成失败");
} catch (IOException e) {
e.printStackTrace();
System.out.println("生成二维码图片失败");
}
}

/**
* 二维码解析
* @param analyzePath 二维码路径
* @return
* @throws IOException
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static String zxingCodeAnalyze(String analyzePath) throws Exception{
MultiFormatReader formatReader = new MultiFormatReader();
String resultStr = null;
try {
File file = new File(analyzePath);
if (!file.exists())
{
return "二维码不存在";
}
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
Result result = formatReader.decode(binaryBitmap, hints);
resultStr = result.getText();
} catch (NotFoundException e) {
e.printStackTrace();
}
System.out.println(resultStr);
return resultStr;
}
}


平常经常使用springboot注解·,但是并不理解

故做一点总结

@Data 注解

@Data 注解的主要作用是提高代码的简洁,使用这个注解可以省去代码中大量的get()、 set()、 toString()等方法;

@Data 注解要先引入lombok,lombok 是什么,它是一个工具类库,可以用简单的注解形式来简化代码,提高开发效率。

原理:

  • Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下
  • javac对源代码进行分析,生成了一棵抽象语法树(AST)
  • 运行过程中调用实现了“JSR 269 API”的Lombok程序
  • 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和 setter方法定义的相应树节点
  • javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)

优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:
不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

常用的几个注解:
@Data : 注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在类上,提供类的全参构造
@NoArgsConstructor : 注在类上,提供类的无参构造
@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在类上,提供对应的 Logger 对象,变量名为 log

@Repository @Controller @Service @Component 四大注解

依然不是很理解这四大注解的作用, 于是下面摘抄了一些笔记

1、@controller 控制器(注入服务)
用于标注控制层,相当于struts中的action层

2、@service 服务(注入dao)
用于标注服务层,主要用来进行业务的逻辑处理

3、@repository(实现dao访问)
用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件.

4、@component (把普通pojo实例化到spring容器中,相当于配置文件中的
泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。

@Autowired 注解

@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。

@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。

通俗理解就是 这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

常见用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import blog.service.ArticleService;
import blog.service.TagService;
import blog.service.TypeService;

@Controller
public class TestController {

//成员属性字段使用 @Autowired,无需字段的 set 方法
@Autowired
private TypeService typeService;


//set 方法使用 @Autowired
private ArticleService articleService;
@Autowired
public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

//构造方法使用 @Autowired
private TagService tagService;
@Autowired
public TestController(TagService tagService) {
this.tagService = tagService;
}
}

@RestController @Controller @ResponseBody 注解

在Spring中@RestController的作用等同于@Controller + @ResponseBody。

所以想要理解@RestController注解就要先了解@Controller和@ResponseBody注解。

在一个类上添加@Controller注解,表明了这个类是一个控制器类。但想要让这个类成为一个处理请求的处理器光有@Controller注解是不够的,他还需要进一步修炼才能成为一个处理器。

  • 第一种方式在spring容器中创建该类的实例
    <bean class="test.controller.MyController" />

    上述这种方式是在spring容器中注入单个bean,当项目比较大,控制器类比较多时,用这种方式向Spring容器中注入bean非常的让人苦恼,索性有第二种方式。

  • 第二种方式在spring容器中创建该类的实例
    <context:component-scan base-scan="test.controller" />

    这种方式会扫描指定包中的所有类,并生成相应的bean注入到spring容器中。使用这种方式当然能够极大提高我们的开发效率,但是有时候我们不想某一类型的类注入到spring容器中,这个时候第下面种方式可以解决。

    1
    2
    3
    <context:component-scan base-package="test" >
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    </context:component-scan>

    上述代码表示扫描test包中除有@Service注解之外的类

将@Controller注解的类注入Spring容器中,只是该类成为处理器的第一步,想要修炼大成,还需要在该类中添加注解@RequestMapping。

  • @RequestMapping

@RequestMapping注解是用来映射请求的,即指明处理器可以处理哪些URL请求,该注解既可以用在类上,也可以用在方法上。

当使用@RequestMapping标记控制器类时,方法的请求地址是相对类的请求地址而言的;当没有使用@RequestMapping标记类时,方法的请求地址是绝对路

径;@RequestMapping的地址可以是uri变量,并且通过@PathVariable注解获取作为方法的参数。也可以是通配符来筛选请求地址。

  • @ResponseBody注解

@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。

格式的转换是通过HttpMessageConverter中的方法实现的,因为它是一个接口,因此由其实现类完成转换。

如果要求方法返回的是json格式数据,而不是跳转页面,可以直接在类上标注@RestController,而不用在每个方法中标注

@ResponseBody,简化了开发过程。

@Component

组件,放在类上,说明这个类呗spring管理了,即bean。他有几个衍生注解,在web开发中会按照三层架构分层,功能类似,代表被spring托管

  • dao【@Repository】

  • service【@Service】

  • controller 【@Controller】

    四个注解功能一样

@Autowried

@Autowried通过类型名字自动装配,如果@Autowried不能自动装配属性,就用@Qualifier(value = “xxx”)匹配

@Resource

自动通过名字类型装配

@Scope(“singleton”)

单例、原型等等模式

@Aspect

标注这个类是一个切面类

@Before(“execution(* …)”)

before方法

(我有个朋友,他服务器上的MySQL出问题了,直接重装,解决一切问题)

一、MySQL卸载

1. yum康康安装的MySQL

使用 yum list installed | grep mysql 全都yum remove掉就可以了

1
yum list installed | grep mysql

最后显示Complete!就算成功了

2. 赶尽杀绝

然后使用 find / -name mysql 依次将文件删除即可

1
find / -name mysql

将显示的文件统统删掉即可

  • /var/lib/mysql

  • /var/lib/mysql/mysql

  • /usr/share/mysql

1
rm -rf /var/lib/mysql /var/lib/mysql/mysql /usr/share/mysql

二、rpm安装MySql

1. 下载安装包

先去官网下载安装包,我这边是centos操作系统,所以选择Red Hat那个,我下载的是mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 然后上传到服务器上

1
ls

康康安装包在不在:mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar

2. 删除系统自带的东西

如果是第一次安装,检查一下系统自带的mariadb-lib以及MySQL 我这边干干净净呢

1
rpm -qa|grep mariadb
1
rpm -qa|grep mysql

如果显示有东西的话就用下面的命令弄掉它

1
rpm -e --nodeps + 搜索出来的文件名

3. 安装依赖

依次安装下面三个依赖

1
yum install libaio
1
yum install perl
1
yum install net-tools

4.解压缩

先创建一个目录,然后在目录里 进行解压tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar,并赋予目录最大权限

创建目录

1
mkdir mysql

进入目录

1
cd mysql/

解压

1
tar -xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar

出去给目录赋予权限

1
cd ..
1
chmod -R 777 mysql

5. 安装MySQL

严格按照下面四个步骤安装软件包

1
rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm
1
rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm 
1
rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm 
1
rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm 

6. 配置数据库

修改配置文件

1
vim /etc/my.cnf
1
2
3
4
#在[mysqld]下面添加这三行
skip-grant-tables #跳过登录验证
character_set_server=utf8 #设置默认字符集UTF-8
init_connect='SET NAMES utf8' #设置默认字符集UTF-8

7. 启动MySQL服务

执行下面两个命令,不要输入命令直接回车就好啦

1
systemctl start mysqld.service
1
mysql -uroot -p

这样就直接进入MySQL啦!

8. 设置密码

在MySQL中执行下面的命令,设置密码并且让他生效

进入MySQL

1
mysql -uroot -p

更新密码,这只是暂时的密码,下次进入得修改

1
update mysql.user set authentication_string=password('passwd') where user='root';

让密码生效

1
flush privileges;

9. 再次修改配置文件

注释掉直接进入MySQL这一段

退出mysql

1
exit

编辑my.cnf配置文件将:skip-grant-tables这一行注释掉

1
2
3
4
[mysqld]
#skip-grant-tables
character_set_server=utf8
init_connect='SET NAMES utf8'

重启mysql服务

1
systemctl stop  mysqld.service
1
systemctl start mysqld.service

10. 重新更新密码

mysql -uroot -p,密码是之前设置的暂时密码,此时进入你需要更新密码,通常来说你自己的密码系统会认为安全性太低不通过,我们先把安全策略降到最低,之后再修改密码

修改validate_password_policy参数的值

1
set global validate_password_policy=0;

修改validate_password_length参数的值(密码长度)

1
set global validate_password_length=1;

修改MySQL为自己的密码

1
alter user 'root'@'localhost' identified by 'password';

查看并设置密码策略

1
SHOW VARIABLES LIKE 'validate_password%';
1
set global validate_password_policy=LOW;

11. 开启远程登录

先开放服务器的3306端口,再进入MySQL开启远程登录

如果防火墙开了的话就开放服务器端口

1
firewall-cmd --zone=public --add-port=3306/tcp --permanent
1
firewall-cmd --reload

进入MySQL,开启远程登录

1
grant all privileges on *.* to 'root'@'%' identified by 'passwd' with grant option;

至此,安装就结束啦!!!

参考博客
Centos 防火墙命令

(由于自己在使用云服务器的命令的时候常常要百度,故做一点总结)

centos7防火墙命令

查看开放端口

1
firewall-cmd --list-ports

开启端口

1
firewall-cmd --zone=public --add-port=80/tcp --permanent

查看端口占用情况

1
lsof -i tcp:8090

会显示以下信息

1
2
3
4
5
6
7
8
9
10
11
12
13
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
java 27581 root 19u IPv6 136588143 0t0 TCP *:8090 (LISTEN)

# lsof输出各列信息的意义如下:
# COMMAND 进程的名称
# PID 进程的标识符
# USER 进程的所有者
# FD 文件描述符,应用程序通过文件描述符识别该文件,如cwd,txt
# TYPE 文件类型
# DEVICE 指定磁盘的名称
# SIZE/OFF 文件大小
# NODE 文件在磁盘上的标识
# NAME 打开文件的确切名称

开启范围端口

开启8080 - 9090范围的端口

1
firewall-cmd  --zone=public  --add-port=8080-9090/tcp --permanent

命令含义:

  • –zone #作用域
  • –add-port=80/tcp #添加端口,格式为:端口/通讯协议
  • –permanent #永久生效,没有此参数重启后失效

防火墙命令

重启firewall

1
firewall-cmd --reload

查看防火墙状态

1
firewall-cmd  --state

开启firewall

1
systemctl start firewalld.service

停止firewall

1
systemctl stop firewalld.service

禁止firewall开机启动

1
systemctl disable firewalld.service

centos7进程管理

linux上进程有5种状态:

  1. 运行(正在运行或在运行队列中等待)
  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
  5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

查看进程

  • ps命令查找与进程相关的PID号
1
ps 9827

显示如下信息

1
2
 PID TTY      STAT   TIME COMMAND
9827 pts/0 Sl 0:14 java -jar competitionrow-0.0.1-SNAPSHOT.jar

杀死进程

  • 通过进程id来杀
1
kill -9 pid
  • 通过进程name来杀
1
killall -9 name

centos7查看历史命令

  • 查看历史命令
1
history
  • 搜索历史命令
1
2
history | grep 'tmux'
# 模糊搜索tmux

出现以下结果:

1
2
171  tmux new -s volunteer
186 tmux ls
  • 显示现行终端机下的所有程序,包括其他用户的程序
1
ps a

显示所有进程

1
2
3
4
5
6
7
  PID TTY      STAT   TIME COMMAND
1321 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux
1322 ttyS0 Ss+ 0:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
9827 pts/0 Sl 0:14 java -jar competitionrow-0.0.1-SNAPSHOT.jar
17061 pts/0 R+ 0:00 ps a
22278 pts/0 Ss 0:00 -bash
......
  • 显示所有程序
1
ps -A

与上一个命令类似

1
2
3
4
5
6
7
8
PID TTY          TIME CMD
1 ? 00:12:32 systemd
2 ? 00:00:02 kthreadd
3 ? 00:01:53 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
......
#此处省略100行
  • 查找特定的进程(如查找java进程)
1
ps aux | grep java

最常用的方法是ps aux,然后再通过管道使用grep命令过滤查找特定的进程,然后再对特定的进程进行操作

1
2
root      9827  0.5  8.8 2546924 166932 pts/0  Sl   14:03   0:14 java -jar competitionrow-0.0.1-SNAPSHOT.jar
root 18130 0.0 0.0 112708 976 pts/0 R+ 14:48 0:00 grep --color=auto java

windows端口进程管理

查找端口

查找所有端口

1
netstat -ano

查找某个端口

1
netstat -aon|findstr "4000"

杀死使用某个端口的进程

通过pid号

1
taskkill /f /pid  21972

成功杀死会有以下提示

成功: 已终止 PID 为 21972 的进程

参考笔记:

CentOS 7 下 yum 安装和配置 Nginx

Nginx 入门指南

nginx如何安装

yum安装nginx

1.首先查看 Linux distribution 的版本号

1
cat /etc/redhat-release 

我的系统发版本是:

1
CentOS Linux release 7.5.1804 (Core)

2.Nginx 不在默认的 yum 源中,首先将Nginx加入到 yum 源里

1
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

显示如下字样代表没有问题:

1
2
3
4
5
获取http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
警告:/var/tmp/rpm-tmp.a7nthc: 头V4 RSA/SHA1 Signature, 密钥 ID 7bd9bf62: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:nginx-release-centos-7-0.el7.ngx ################################# [100%]

3.然后执行 yum repolist 查看一下,发现 Nginx 已经安装到本机了

1
yum repolist

4.安装nginx(慢慢等待,需要一段时间)

1
yum install nginx

安装成功以后:

1
2
3
4
5
#安装成功以后
已安装:
nginx.x86_64 1:1.18.0-1.el7.ngx

完毕!

nginx简单配置

1.查看 Nginx 版本

1
nginx -v

2.启动 Nginx 服务

1
systemctl start nginx

3.访问 Nginx 服务(本地访问一下,可以看到 Welcome to nginx)

1
curl -i localhost

4.远程通过公网IP访问( ip:80 )

nginx

nginx源码包安装

下载地址

下载好之后,拷贝到/usr/local/nginx下

  • 依赖库安装

    • 1.安装 gcc 环境—nginx 编译时依赖 gcc 环境
    1
    yum -y install gcc gcc-c++
    • 2.安装 pcre—让 nginx 支持重写功能
    1
    yum -y install pcre pcre-devel
    • 3.安装 zlib—zlib 库提供了很多压缩和解压缩的方式,nginx 使用 zlib 对 http 包内容进行 gzip 压缩
    1
    yum -y install zlib zlib-devel
    • 4.安装 openssl—安全套接字层密码库,用于通信加密
    1
    yum -y install openssl openssl-devel
  • 解压缩

1
tar -zxvf  nginx-1.18.0.tar.gz
  • 进入nginx-1.18.0目录下面进行源码编译安装

    检查平台安装环境: --prefix=/usr/local/nginx 是 nginx 编译安装的目录(推荐),安装完后会在此目录下生成相关文件
    如果前面的依赖库都安装成功后,执行 ./configure --prefix=/usr/local/nginx命令会显示一些环境信息。如果出现错误,一般是依赖库没有安装完成,可按照错误提示信息进行所缺的依赖库安装。

1
./configure --prefix=/usr/local/nginx
  • 进行源码编译并安装 nginx(执行make如果没有发生错误就执行make install)
1
make && make install
  • nginx服务操作命令

    • 启动服务
    1
    /usr/local/nginx/sbin/nginx
    • 重新加载服务
    1
    /usr/local/nginx/sbin/nginx -s reload
    • 停止服务
    1
    /usr/local/nginx/sbin/nginx -s stop
    • 查看nginx 服务进程
    1
    ps -ef | grep nginx

nginx简单入门

什么是nginx?

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。

niginx有什么用? (四大作用)

  • 动静分离

动静分离其实就是 Nginx 服务器将接收到的请求分为动态请求和静态请求

静态请求直接从 nginx 服务器所设定的根目录路径去取对应的资源,动态请求转发给真实的后台去处理

这样做不仅能给应用服务器减轻压力,将后台api接口服务化,还能将前后端代码分开并行开发和部署

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {  
listen 8080;
server_name localhost;

location / {
root html; # Nginx默认值
index index.html index.htm;
}

# 静态化配置,所有静态请求都转发给 nginx 处理,存放目录为 my-project
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /usr/local/var/www/my-project; # 静态请求所代理到的根目录
}

# 动态请求匹配到path为'node'的就转发到8002端口处理
location /node/ {
proxy_pass http://localhost:8002; # 充当服务代理
}
}
  • 反向代理

反向代理其实就类似你去找代购帮你买东西(浏览器或其他终端向nginx请求),你不用管他去哪里买,只要他帮你买到你想要的东西就

行(浏览器或其他终端最终拿到了他想要的内容,但是具体从哪儿拿到的这个过程它并不知道)

配置反向代理:

1
2
3
4
5
6
7
8
9
10
11
12
server {  
listen 8080;
server_name localhost;

location / {
root html; # Nginx默认值
index index.html index.htm;
}

proxy_pass http://localhost:8000; # 反向代理配置,请求会被转发到8000端口
}

  • 负载均衡

随着业务的不断增长和用户的不断增多,一台服务已经满足不了系统要求了。这个时候就出现了服务器 集群

在服务器集群中,Nginx 可以将接收到的客户端请求“均匀地”(严格讲并不一定均匀,可以通过设置权重)分配到这个集群中所有的服务

器上。这个就叫做负载均衡

配置负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 负载均衡:设置domain
upstream domain {
server localhost:8000;
server localhost:8001;
}
server {
listen 8080;
server_name localhost;

location / {
# root html; # Nginx默认值
# index index.html index.htm;

proxy_pass http://domain; # 负载均衡配置,请求会被平均分配到8000和8001端口
proxy_set_header Host $host:$server_port;
}
}
  • 正向代理

正向代理跟反向道理正好相反。拿上文中的那个代购例子来讲,多个人找代购购买同一个商品,代购找到买这个的店后一次性给买了。这

个过程中,该店主是不知道代购是帮别代买买东西的。那么代购对于多个想买商品的顾客来讲,他就充当了正向代理。

nginx删除

当有一天,你不再爱nginx时,你将如何删除它呢

  • yum卸载nginx
1
2
3
4
5
6
7
8
9
10
[root@VM_0_4_centos local]# yum remove nginx

Loaded plugins: fastestmirror, langpacks
Resolving Dependencies

......

Removed:
nginx.x86_64 1:1.18.0-1.el7.ngx
Complete!
  • 查看nginx是否还存在
1
2
[root@VM_0_4_centos ~]# find / -name nginx
[root@VM_0_4_centos ~]#

Git笔记

Index

Get started by creating a new file or uploading an existing file. We recommend every repository include a README, LICENSE, and .gitignore.

create a new repository on the command line

1
2
3
4
5
6
7
echo "# xty.github.io" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:woshixty/xty.github.io.git
git push -u origin main

push an existing repository from the command line

1
2
3
git remote add origin git@github.com:woshixty/xty.github.io.git
git branch -M main
git push -u origin main

import code from another repository

You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

(记录使用Git时遇到的一些问题)

The current branch xty has no upstream branch.

情况概述:新建本地分支后将本地分支推送到远程库, 使用git pull 或者 git push 的时候报错

错误原因:本地分支和远程分支没有建立联系

git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂。

查看本地分支和远程分支的关联关系

1
git branch -vv

本地分支和远程分支建立联系,执行以下命令即可

1
git branch --set-upstream-to=origin/远程分支的名字 本地分支的名字

src refspec master does not match any解决办法

情况概述:我在GitHub新建一个仓库之后,在本地新建了一个文件夹,git init 并且git remote add origin git@github.com:woshixty/xty.github.io.git 之后,执行 git push -u origin main,发现不能提交

错误原因:目录中没有文件,空目录是不能提交上去的,新建一个README文件,再上传

执行以下命令,远程分支与本地分支建立联系,并提交到远程分支

1
git push --set-upstream origin master

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

加油!!!