最近构建项目,涉及到很多细节需要到处查看文档,作为一名合格的面向百度开发的程序员,通过“百度一下”来寻找答案是最直接的方法。然而面对千篇一律或答非所问的搜索结果,浪费了大量的时间却仍然没能解决自己的问题,就想着自己去写一篇,但是当真正动笔的时候,才发现自己才是写的最水的那个^_^
本文参考链接如下:
Linux Ubuntu JAVA运行环境配置_changgongcheng_yq的博客-CSDN博客
Centos7.2安装mysql8 - 鬼谷山人 - 博客园
CentOS7.5 安装MySQL8 tar_xintingandzhouyang的专栏-CSDN博客_centos7 mysql8 tar
Centos7重置Mysql 8.0.1 root 密码 - 网络蚂蚁 - 博客园
目录
工作开始前的准备:
阿里云ECS一台(centos7.4.1708),Xshell,WinSCP,IntelliJ IDEA
mysql下载地址(https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.16-el7-x86_64.tar.gz)
tomcat下载地址(http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.19/bin/apache-tomcat-9.0.19.tar.gz)
redis下载地址(http://download.redis.io/releases/redis-5.0.3.tar.gz)
推荐使用wget+url的方式下载,速度非常快。或者自己寻找国内的速度比较快镜像
vim命令简单了解:
I 进入文本编辑模式 yy复制 p粘贴 dd删除 ctrl+j [回车]换行
esc退出编辑模式 :X加密文件 :wq 强制保存退出 :x保存(若修改)退出 :ZZ写入退出 :q未修改退出 :q!强制不修改退出
tar压缩文件解压:tar -vxzf
一:本地项目创建
创建一个用于测试的项目,需要有相应的ORM框架来操作数据库。可以使用现成的项目,测试项目能正常发布运行。
此处参考使用idea5分钟生成一个SpringBoot-Mybatis项目_changgongcheng_yq的博客-CSDN博客
进入application.yml修改数据库配置为ECS的外网地址,数据库名和密码和后面创建mysql时一致
使用ctrl+alt+shift+s热键或者点击File-Project Structure,点击artifacts
1.打war包
点击“+” -> 选择第三个 web-archive -> 右键项目名 put into output root ->修改war包名并确认 返回主界面Build-> Build Artifacts。在项目的out里可以找到war包
2.打jar包
点击“+” -> 选择第一个jar->From module...-> Main Class选择启动类xxxAplication 确认 返回主界面 ->右侧的MavenProject 的package打包。在项目的target里可以找到jar包
二:远程连接
1.xshell连接ECS
如上图,连接里填写远程ip,端口号22,用户身份验证填写ECS虚拟机的用户名和密码
2.WinSCP连接
同上,数据ip端口以及用户名密码就可以。连接成功如下图
三:jdk下载及环境变量配置
1.在root目录下新建java文件夹,将下载好的通过WinSCP复制粘贴进去。也可以通过wget+url命令下载
解压安装包,输入ll命令
2.配置环境变量
2.1配置全局环境变量
vim /etc/profile,在文末输入如下配置,可以通过shift+insert粘贴进去,自己修改对应的路径和jdk版本号
export JAVA_HOME=/root/java/jdk1.8.0_211
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
esc->:wq退出并保存,使环境变量生效 source /etc/profile,测试javac -version
2.2配置当前用户环境变量(不建议)
vim ~/.bashrc 配置同上。
四:tomcat下载及配置
1.tomcat安装
在root下新建software文件夹,将下载好的tomcat安装包拖入并解压
通过mv apache-tomcat-9.0.19 tomcat命令可以将文件夹重命名
cd /tomcat进入目录,vim conf/server.xml修改端口为80
cd /bin进入目录,ll查看命令列表,./startup.sh启动tomcat,进入浏览器输入ip地址,测试是否能看到“小老虎”
2.如果连不上,是阿里网关和防火墙的问题
2.1阿里网关配置
在实例下面找到:网络和安全-安全组,创建下图的实例,开放刚刚tomcat中设置的80端口和3306端口(mysql后面测试使用)
2.2centos防火墙配置
查看防火墙开放的端口:firewall-cmd --list-ports
添加一个开放的端口:firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
重载端口使生效:firewall-cmd --reload
删除开放的端口:firewall-cmd --zone= public --remove-port=80/tcp --permanent
防火墙状态:systemctl status firewalld
防火墙启动:systemctl start firewalld
防火墙关闭:systemctl stop firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
五:mysql安装和配置[重点]
1.查看并删除mariadb。
mariadb和mysql其实一样的,因为mysql不开源了,所以centos用mariadb代替他。需要卸载避免冲突
查看:rpm -qa | grep mariadb
卸载:rpm -e --nodeps
2.安装依赖
yum install libaio,没有libaio,在初始化安装mysql的时候会报错
3.下载并解压mysql
mysql下载比较慢,强烈推荐使用wget+下载地址的方式下载安装包,若想在本地保存备份,可在centos下好后,用winscp下载到本地。
将压缩包复制到software文件夹,通过tar -vxzf命令解压缩,通过mv mysql-8.0.16-el7-x86_64 mysql重命名文件夹
4.创建配置文件[重点]
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=/root/software/mysql
# 设置mysql数据库的数据的存放目录
datadir=/root/software/mysql/data
# 允许最大连接数
max_connections=10000
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8mb4
# 设置忽略表名大小写
lower_case_table_names = 1
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
配置的重点就是basedir和datadir,basedir是你解压包的目录,datadir是你安装mysql后数据存放目录,相当于ORACLE的表空间
lower_case_table_names = 1这个配置不加的话,表名不会忽略大小写,即可以存在user和USER两张表,使用mybatis作为ORM框架时会出现问题。
保存路径 vim /etc/my.cnf
5.安装mysql
进入目录:cd mysql/bin/
执行安装:./mysqld --initialize --console
复制上图红框处的命令,这个是你初次登录数据库的随机密码
6.启动mysql服务
进入启动服务文件夹: cd ../support-files/
启动服务:./mysql.server start
如果报下图错误,则给启动添加用户权限:./mysql.server start --user=root
7.将启动命令加入系统进程中
复制命令:cp mysql.server /etc/init.d/mysqld
使用系统命令重启:service mysqld restart --user=root
8.初始化登录密码
进入bin目录:cd ../bin
使用随机密码登录:./mysql -u root -p(输入刚刚红框中的随机命令,建议使用粘贴快捷键 shift+insert)
修改密码为1234:alter user 'root'@'localhost' identified with mysql_native_password by '1234';
9.设置允许远程登录
切换数据库:use mysql
修改权限:update user set user.Host = '%' where user.User='root';
刷新权限:flush privileges;
退出登录:quit
重启数据库:service mysqld restart --user=root
10.使用navicat 远程连接
六:将项目发布到ECS上并远程访问
此处使用jar包测试,war包放到tomcat中启动tomcat即可
1.在navicat中创建和一项目对应的测试数据库和表
2.在本地项目中写一个查询test,保证测试能够正确跑通
3.在root下新建一个service目录,将项目打成jar包,复制到该目录中
4.启动项目:java -jar jar包名称.如下图
5.后台启动项目:4中启动方式退出xshell当前窗口时会导致项目中止,使用如下命令可解决
nohup java -jar dailycount-0.0.1-SNAPSHOT.jar >log.out &
七:安装redis并在springboot中引入
1.centos下redis的最简单安装和启动
1.1解压和启动
将redis压缩包复制到software目录,用tar -vxzf解压,用make&&make install安装。
redis-server启动redis服务,redis-cli启动客户端。
1.2基本命令
keys * 查看所有key,set 1 1存键值对,get 1查看key为1的值,rename 1 a重命名key=1为a,
config set requirepass "1234"设置密码为1234,auth 1234用密码登录,config get requirepass查看密码,
save序列化保存上述修改。
1.3永久修改密码:vim打开redis.conf文件,用/命令找到protected-mode,修改为no,注释掉上面的bind127.0.0.1,找到requerepass,在下面添加requerepass 1234设置密码为1234。
重启redis,用config get *查看配置,如果配置不正确,则使用redis-server redis.conf(全文件路径)命令启动redis。
2.springboot引入redis
2.1添加maven包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2添加redis配置
在数据库配置下添加如下配置
redis:
database: 0
host: 47.102.43.84
port: 6379
password: ****
timeout: 500
jedis:
pool:
max-idle: 8 #池中“空闲”连接的最大数量。使用负值表示无限数量的空闲连接。
min-idle: 0 #目标为保持在池中的最小空闲连接数。这个设置只有在正面的情况下才有效果。
max-active: 8 #池在给定时间可以分配的最大连接数。使用负值无限制。
max-wait: -1 #连接分配在池被耗尽时抛出异常之前应该阻塞的最长时间量(以毫秒为单位)。使用负值可以无限期地阻止。
2.3编写测试方法
新建任意一个controller,核心代码如下
@RestController
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@Autowired
RedisTemplate redisTemplate;
/**
* spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化,
* 会导致key有乱码,导致客户端无法正确访问,此处初始化String类型的序列化方法
*/
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
@RequestMapping("/set")
public void set(String key,String value){
redisTemplate.opsForValue().set(key,value);
}
@RequestMapping("/get")
public String show(String key){
String str = null;
try {
str = redisTemplate.opsForValue().get(key).toString();
} catch (Exception e) {
logger.error(""+e);
}
return str;
}
}
在浏览器访问,使用.../set?key=1&value=1调用保存方法,使用/get?key=1调用查询方法。
3.在windows下使用客户端访问redis
此处使用的是用java开发的redisclient下载地址(GitHub - caoxinyu/RedisClient: Java Redis Client GUI Tool),速度较慢,建议使用git下载
进入RedisClient\release目录点击redisclient-win32.x86.2.0.exe安装客户端,
进入界面server-add填写ip和密码,登录成功如下图
八:分布式锁的Redis实现
本文参考Redis分布式锁的正确实现方式 - Ruthless - 博客园
1.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>
2.分布式锁核心实现代码
public class RedisTool {
private static final String LOCK_SUCCESS = "OK";
private static final Long RELEASE_SUCCESS = 1L;
/**
* 尝试获取分布式锁
* @param jedis Redis客户端
* @param lockKey 锁 key是唯一
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, new SetParams().nx().px(expireTime));
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 释放分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @return 是否释放成功
*/
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
//Lua脚本代码 确保原子性
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}
}
3.测试代码
新建一个controller,插入如下代码
String requestId = UUID.randomUUID().toString();
String lockKey = "3";
public Jedis connectRedis(){
Jedis jedis = new Jedis("47.102.43.84",6379);
jedis.auth("****");
return jedis;
}
@RequestMapping("/lock")
public boolean lock(){//为了方便观察测试结果,此处锁超时失效时间为10s
boolean flag = RedisTool.tryGetDistributedLock(connectRedis(),lockKey, requestId,10000);
return flag;
}
@RequestMapping("/unlock")
public boolean unlock(){
return RedisTool.releaseDistributedLock(connectRedis(),lockKey,requestId);
}
在浏览器调用测试方法,结果如图所示,在锁失效前并且不手动释放锁,仅第一个请求能获得锁返回true