京淘前端业务实现
知识复习
关于后端JS的引入问题说明
说明:在京淘后端页面中如何引入页面JS,步骤如下:
1).在index.jsp中引入
<jsp:include page="/commons/common-js.jsp"></jsp:include>
2).在如具体JS
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css" href="/css/jt.css" />
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<!-- 自己实现业务逻辑 -->
<script type="text/javascript" src="/js/common.js"></script>
3).页面引入结构
EasyUI中弹出框
页面标识
1.弹出框效果
$("#btn1").bind("click",function(){
//EasyUI框架提供的JS
$("#win1").window({
title:"弹出框",
width:400,
height:400,
modal:true //这是一个模式窗口,只能点击弹出框,不允许点击别处
})
})
2.消息确认框
/*定义退出消息框 */
$("#btn4").click(function(){
$.messager.confirm('退款申请','您本次消费998大保健,是否退款',function(param){
if (param){
alert("恭喜您,您白X成功!!!!");
} else{
alert("大爷,下次再来!!!!");
}
});
})
商品分类信息弹出框说明
1).页面标识符
<tr>
<td>商品类目:</td>
<td>
<a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a>
<input type="hidden" name="cid" style="width: 280px;"></input>
</td>
</tr>
2).页面JS分析
商品分类数据表分析
业务表分析
/*一级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=0
/*二级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=1
/*三级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=24
EasyUI中树形结构分析
页面标识
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EasyUI-3-菜单按钮</title>
<script type="text/javascript"
src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript"
src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript"
src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
<link rel="stylesheet" type="text/css"
href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css"
href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<script type="text/javascript">
/*通过js创建树形结构 */
$(function(){
$("#tree").tree({
url:"tree.json", //发起ajax请求
method:"get", //请求方式 POST
animate:true, //表示显示折叠端口动画效果
checkbox:true, //表述复选框
lines:false, //表示显示连接线
dnd:true, //是否拖拽
onClick:function(node){ //添加点击事件
alert(node);
//控制台
console.info(node);
}
});
})
</script>
</head>
<body>
<h1>EasyUI-树形结构</h1>
<!--树形结构展现 使用ul-li标签结构 -->
<ul id="tree"></ul>
</body>
</html>
数据结构分析
JSON串格式说明:
[{"id":"2","text":"王者荣耀","state":"closed"},{"id":"3","text":"王者荣耀","state":"closed"}]
封装树形结构的VO对象:
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class EasyUITree {
// {"id":"2","text":"王者荣耀","state":"closed"}
private Long id; //id值 与ItemCat中的Id一致的
private String text; //文本信息 itemCat中的name属性
private String state; //状态 打开:open 关闭: closed
}
商品分类业务实现
页面分析
1).页面url分析
2).页面JS分析
编辑ItemCatController
/**
* 业务:查询商品分类信息,返回VO对象
* url地址: /item/cat/list
* 参数: 暂时没有参数
* 返回值: EasyUITree对象
* json格式:[{"id":"2","text":"王者荣耀","state":"closed"},{"id":"3","text":"王者荣耀","state":"closed"}]`
* sql语句:
* 一级商品分类信息 parent_id=0 SELECT * FROM tb_item_cat WHERE parent_id=0
*/
@RequestMapping("/list")
public List<EasyUITree> findItemCatByParentId(){
//1.查询一级商品分类信息
Long parentId = 0L;
return itemCatService.findItemCatByParentId(parentId);
}
编辑ItemCatService
/**
* 数据的来源: 数据库中
* 数据库中的数据类型: ItemCat对象信息 POJO
* 需要的类型: EasyUITree对象信息. VO对象
* 思路: 将ItemCat转化为EasyUITree对象.
* sql: parent_id=0 SELECT * FROM tb_item_cat WHERE parent_id=0
*/
@Override
public List<EasyUITree> findItemCatByParentId(Long parentId) {
//1.根据parentId 查询数据库信息 根据父级查询子级信息.
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id", parentId);
List<ItemCat> itemCatList = itemCatMapper.selectList(queryWrapper);
//2.将数据库记录转化为VO数据.
List<EasyUITree> treeList = new ArrayList<EasyUITree>();
for (ItemCat itemCat : itemCatList) {
Long id = itemCat.getId();
String text = itemCat.getName();
//如果是父级标题,则默认关闭 closed,否则开启. open
String state = itemCat.getIsParent()?"closed":"open";
EasyUITree uiTree = new EasyUITree(id, text, state);
treeList.add(uiTree);
}
return treeList;
}
页面效果展现
树形结构异步加载
业务说明
1).页面结构说明
2).展现参数提交说明
EasyUI 树形结构调用说明----异步树加载
重构ItemCatController
说明:在原有的基础之上,实现异步树加载.
/**
* 业务:查询商品分类信息,返回VO对象
* url地址: /item/cat/list
* 参数: id:一级分类id值
* 返回值: EasyUITree对象
* json格式:[{"id":"2","text":"王者荣耀","state":"closed"},{"id":"3","text":"王者荣耀","state":"closed"}]`
* sql语句:
* 一级商品分类信息 parent_id=0 SELECT * FROM tb_item_cat WHERE parent_id=0
*/
@RequestMapping("/list")
public List<EasyUITree> findItemCatByParentId
(@RequestParam(value = "id",defaultValue = "0") Long parentId){
//初始化时应该设定默认值.
//1.查询一级商品分类信息
//Long parentId = id==null?0L:id;
return itemCatService.findItemCatByParentId(parentId);
}
商品信息后端维护
全局异常处理
说明:
如果代码中频繁出现try-catch,则可能影响代码结构. 不便于阅读. 能否利用全局的异常的捕获机制,简化try-catch个数!!!
捕获位置: 常规捕获的位置是Controller层,因为Controller层是业务调用的最后的控制层.
代码:
//标识改类是全局异常处理机制的配置类
@RestControllerAdvice //advice通知 返回的数据都是json串
@Slf4j //添加日志
public class SystemExceptionAOP {
/* 添加通用异常返回的方法. 底层原理:AOP的异常通知. * */
@ExceptionHandler({RuntimeException.class}) //拦截运行时异常
public Object systemResultException(Exception exception) {
//exception.printStackTrace(); //如果有问题,则直接在控制台打印
log.error("{~~~~~~"+exception.getMessage()+"}", exception); //输出日志
return SysResult.fail(); //返回统一的失败数据
}
}
商品新增
页面分析
1).页面分析
<form id="itemAddForm" class="itemForm" method="post">
<table cellpadding="5">
<tr>
<td>商品类目:</td>
<td>
<a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a>
<input type="hidden" name="cid" style="width: 280px;"></input>
</td>
</tr>
<tr>
<td>商品标题:</td>
<td><input class="easyui-textbox" type="text" name="title" data-options="required:true" style="width: 280px;"></input></td>
</tr>
<tr>
<td>商品卖点:</td>
<td><input class="easyui-textbox" name="sellPoint" data-options="multiline:true,validType:'length[0,150]'" style="height:60px;width: 280px;"></input></td>
</tr>
<tr>
<td>商品价格:</td>
<td><input class="easyui-numberbox" type="text" name="priceView" data-options="min:1,max:99999999,precision:2,required:true" />
<input type="hidden" name="price"/>
</td>
</tr>
<tr>
<td>库存数量:</td>
<td><input class="easyui-numberbox" type="text" name="num" data-options="min:1,max:99999999,precision:0,required:true" /></td>
</tr>
<tr>
<td>条形码:</td>
<td>
<input class="easyui-textbox" type="text" name="barcode" data-options="validType:'length[1,30]'" />
</td>
</tr>
<tr>
<td>商品图片:</td>
<td>
<a href="javascript:void(0)" class="easyui-linkbutton picFileUpload">上传图片</a>
<input type="hidden" name="image"/>
</td>
</tr>
<tr>
<td>商品描述:</td>
<td>
<textarea style="width:800px;height:300px;visibility:hidden;" name="itemDesc"></textarea>
</td>
</tr>
<tr class="params hide">
<td>商品规格:</td>
<td>
</td>
</tr>
</table>
<input type="hidden" name="itemParams"/>
</form>
2).页面JS(了解)
<div style="padding:5px">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">提交</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">重置</a>
</div>
/*
参数类型:
1. {"key":"value","key2":"value2",......} 少量数据提交
2. key=value&key2=value2...... 基于字符串拼接
JS表单常用方法:
$("#itemAddForm").serialize() 将所有的form表单中的数据,采用字符串的
形式自动拼接之后提交.
关于回调函数业务说明
需求: 确定后端服务器调用是否正确!!!!
策略说明:
属性1: status==200 调用正确 status==201 调用失败
属性2: msg 提交服务器相关说明信息
属性3: data 服务器返回页面的业务数据 一般都是对象的JSON.
*/
//alert($("#itemAddForm").serialize())
//$.post("url地址","提交参数信息","回调函数")
$.post("/item/save",$("#itemAddForm").serialize(), function(data){
if(data.status == 200){
$.messager.alert('提示','新增商品成功!');
}else{
$.messager.alert("提示","新增商品失败!");
}
});
SysResult VO对象定义
package com.jt.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult {
private Integer status; //属性1: status==200 调用正确 status==201 调用失败
private String msg; //属性2: msg 提交服务器相关说明信息
private Object data; //属性3: data 服务器返回页面的业务数据 一般都是对象的JSON.
//准备工具API 方便用户使用
public static SysResult fail() {
return new SysResult(201, "业务调用失败", null);
}
//成功方式1 只返回状态码信息
public static SysResult success() {
return new SysResult(200, "业务调用成功!!!", null);
}
//成功方式2 需要返回服务器数据 data
public static SysResult success(Object data) {
return new SysResult(200, "业务调用成功!!!", data);
}
//成功方式3 可能告知服务器信息及 服务器数据
public static SysResult success(String msg, Object data) {
return new SysResult(200, msg , data);
}
}
编辑ItemController
/** 商品新增操作
* url: /item/save
* 参数: form表单数据
* 返回值结果: SysResult对象 */
@RequestMapping("/save")
public SysResult saveItem(Item item) {
try {
itemService.saveItem(item);
//int a = 1/0;
return SysResult.success();
} catch (Exception e) {
e.printStackTrace(); //打印错误信息
return SysResult.fail();
}
//定义全局异常处理机制!!!!!
}
编辑ItemService
//控制数据库事务
@Transactional
@Override
public void saveItem(Item item) {
item.setStatus(1)
.setCreated(new Date())
.setUpdated(item.getCreated());
itemMapper.insert(item);
}
商品修改
修改提交页面分析
1).定义弹出框位置
<div id="itemEditWindow" class="easyui-window" title="编辑商品"
data-options="modal:true,closed:true,iconCls:'icon-save',href:'/page/item-edit'"
style="width:80%;height:80%;padding:10px;">
</div>
2).点击编辑按钮效果
3).修改页面的JS
编辑ItemController
/**
* 商品修改操作
* url: /item/update
* 参数: form表单数据
* 返回值结果: SysResult对象
*/
@RequestMapping("/update")
public SysResult updateItem(Item item) {
itemService.updateItem(item);
return SysResult.success();
}
编辑ItemService
@Override
public void updateItem(Item item) {
item.setUpdated(new Date());
itemMapper.updateById(item);
}
商品删除
商品上下架
业务需求说明
说明:
商品上架/下架操作修改的是status属性,updated时间.
分析:
- 下架操作 /item/instock status=2
- 上架操作 /item/reshelf status=1
restFul优化:
- 下架操作 /item/updateStatus/2
- 上架操作 /item/updateStatus/1
代码
- 编辑ItemController
/**
* url地址: /item/updateStatus/2 /item/updateStatus/1
* 参数: 1.url中 2.ids
* 返回值: SysResult对象
*/
@RequestMapping("/updateStatus/{status}")
public SysResult updateItemStatus(Long[] ids,@PathVariable Integer status) {
//实现商品状态修改
itemService.updateItemStatus(ids,status);
return SysResult.success();
}
- 编辑ItemService
/**
* MP的更新操作
* 1.entity 要修改的记录
* 2.updateWrapper 修改条件构造器
* Sql: update tb_item set status=#{status},updated = #{updated}
* where id in (id1,id2,id3.....);
* 单表操作 性能损耗可以忽略.
*/
@Override
public void updateItemStatus(Long[] ids, Integer status) {
//1.定义修改数据
Item item = new Item();
item.setStatus(status).setUpdated(new Date());
//2.定义修改的条件
List<Long> idList = Arrays.asList(ids);
UpdateWrapper<Item> updateWrapper = new UpdateWrapper<>();
updateWrapper.in("id", idList);
itemMapper.update(item, updateWrapper);
}
富文本编辑器
富文本入门案例
核心理念: 所见即所得编辑效果
KindEditor是一套开源的HTML可视化编辑器,主要用于让用户在网站上获得所见即所得编辑效果,兼容IE、Firefox、Chrome、Safari、Opera等主流浏览器。
富文本页面JS
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="/js/kindeditor-4.1.10/themes/default/default.css" type="text/css" rel="stylesheet">
<script type="text/javascript" charset="utf-8" src="/js/kindeditor-4.1.10/kindeditor-all-min.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/kindeditor-4.1.10/lang/zh_CN.js"></script>
<script type="text/javascript" charset="utf-8" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
KindEditor.ready(function(){
KindEditor.create("#editor")
})
})
</script>
</head>
<body>
<h1>富文本编辑器</h1>
<textarea style="width:700px;height:350px" id="editor"></textarea>
</body>
</html>
说明:
什么样的数据需要进行序列化?
对象==》字节数组 》 还原回对象需要序列化=》
对象==》json字符串===能直接返回对象,不需序列化
文件上传
选择文件标签
<input type="file" > <!-- 仅能选择单个文档-->
<input type="file" multiple> <!--选择多个文档-->
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CErY3Mcw-1607441879580)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cimage-20200711150229389.png)]
文件上传代码(静态)
1.如何校验上传的信息是图片???
- 后缀名.jpg/.png/.gif
2.如何保证检索速度更快???
- 分目录存储 方式1:hash 方式2:date
3.如何防止文件重名???
- 重定义文件名 uuid
public ImageVo uploadFile1(MultipartFile uploadFile) {
// 1.校验上传的信息是否为图片???
// 1.1 初始化图片类型集合
Set<String> typeSet = new HashSet<>(); // 优化 工具
typeSet.add(".jsp");
typeSet.add(".png");
typeSet.add(".gif");
Set<String> typeSet = ImageUitl.getImageType();
// 1.2获取用户上传的图片类型
String fileName = uploadFile.getOriginalFilename();
fileName = fileName.toLowerCase();
int index = fileName.lastIndexOf(".");
String fileType = fileName.substring(index);
// 1.3校验图片类型是否有效
if (!typeSet.contains(fileType)) {
return ImageVo.fail();
}
// 2.准备文件上传的目录结构 根目录+动态变化的目录
String localDir = "E:/hl/imgs";
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
String dirPath = localDir + dateDir;
File dirFile = new File(dirPath);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
// 3.重新制定文件名称
String uuid = UUID.randomUUID().toString();
String realFileName = uuid + fileName;
// 4.执行文件上传
File imageFile = new File(dirPath + realFileName);
try {
uploadFile.transferTo(imageFile);
// 虚拟路径
String url = "";
return ImageVo.success(url);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
return ImageVo.fail();
}
}
文件上传优化
地址属性优化
- .properties
image.localDir=D:/JT-SOFT/images
image.imageUrl=http://image.jt.com
image.imageTypes=.jpg,.png,.gif,.jpeg
- XxxServiceImpl
@@PropertySource("classpath:/properties/image.properties")
public class FileServiceImpl implements FileService {
@Value("${image.localDir}")
private String localDir;
@Value("${image.imageUrl}")
private String imageUrl;
}
类型属性优化
新建一个Util类,优化Set集合
静态代码块方式优化
- 工具API
/** 一般图片的类型就是常见的几种,变化范围不大 暂时可以写死.
* 如果自己不想写死,则通过IO流,读取指定的配置文件进行封装. */
public class ImageUitl {
private static Set<String> typeSet = new HashSet<>();
static {
typeSet.add(".png");
typeSet.add(".jpg");
typeSet.add(".gif");
}
// 获取图片类型
public static Set<String> getImageType(){
return typeSet;
}
public static Set<String> setImageType(String type){
typeSet.add(type);
return typeSet;
}
- 调用(static)
Set<String> typeSet = ImageUitl.getImageType();
spring属性注入方式
- .properties
image.localDir=D:/JT-SOFT/images
image.imageTypes=.jpg,.png,.git,.jpeg
- 工具API
@Component //一般用来标识该类交给spring容器进行管理. 不是任何业务层
@PropertySource("classpath:/properties/image.properties")
public class ImageTypeUtil {
//可以利用spring容器动态为属性赋值.
@Value("${image.imageTypes}")
private String imageTypes; //type1,type2,type3,
private Set<String> typeSet = new HashSet<String>();
//初始化集合信息
//@PreDestroy //当spring容器中关闭前,执行该方法.
@PostConstruct //当对象交给容器管理之后,执行该方法
public void init() {
String[] typeArray = imageTypes.split(",");
for (String type : typeArray) {
typeSet.add(type);
}
//循环遍历完成之后,.typeSet集合类型中有值的.
System.out.println("set集合初始化完成!!!!"+typeSet);
}
public Set<String> getTypeSet(){
return typeSet;
}
- 调用(DI)
@Autowired
private ImageUitl imageUitl;
Set<String> typeSet = imageUitl.getTypeSet();
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGpGS9DP-1607441879583)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711105428858.png)]
优化url地址
url地址说明
说明:如果想要让用户在任何位置通过url地址访问图片 则必须准备一个虚拟地址.
例如:
https://img14.360buyimg.com/n0/jfs/t1/71310/32/5640/402976/5d3a654eE0489baf9/fd8eafe74ef8779c.jpg
构成要素:
1). 协议名称 http/https
2). 域名信息 img14.360buyimg.com 图片服务器地址信息.
3). 图片存储的真实路径 n0/jfs/t1/71310/32/5640/402976/5d3a654eE0489baf9/fd8eafe74ef8779c.jpg
url地址改造
业务需求: 通过image.jt.com的网址访问自己的图片信息.
虚拟地址拼接: http://image.jt.com/\2020\07\11\b55266cd-ba3b-4929-8d3f-c7d7e33a07e2.jpg
图片磁盘地址: D:\JT-SOFT\images\2020\07\11\b55266cd-ba3b-4929-8d3f-c7d7e33a07e2.jpg
编辑image.properties配置文件
image.localDir=D:/JT-SOFT/images
image.imageUrl=http://image.jt.com
image.imageTypes=.jpg,.png,.gif,.jpeg
优化全部代码(动态)
package com.jt.service;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.jt.util.ImageTypeUtil;
import com.jt.vo.ImageVO;
@Service
//指定配置文件,进行属性的注入 将key-value交给spring容器管理
@PropertySource("classpath:/properties/image.properties")
public class FileServiceImpl implements FileService {
@Value("${image.localDir}")
private String localDir; // = "D:/JT-SOFT/images"; //1.优化点一
@Value("${image.imageUrl}")
private String imageUrl; //定义url虚拟网址.
@Autowired
private ImageTypeUtil imageTypeUtil;
@Override
public ImageVO uploadFile(MultipartFile uploadFile) {
//1.校验上传的信息 是否为图片
//优化方式1 利用静态代码块的形式实现的. 优化方式2 利用spring方式进行优化
Set<String> typeSet = imageTypeUtil.getTypeSet();
//Set<String> typeSet = imageTypeUtil.getImageType();
//1.2动态获取用户上传的图片类型 abc.jpg|ABC.JPG
String fileName = uploadFile.getOriginalFilename();
fileName = fileName.toLowerCase(); //将所有的字符转化为小写.
int index = fileName.lastIndexOf(".");
//.jpg
String fileType = fileName.substring(index);
//1.2校验图片类型是否有效
if(!typeSet.contains(fileType)) {
//表示类型不属于图片信息 则终止程序
return ImageVO.fail();
}
//2.准备文件上传的目录结构. 文件上传根目录+动态变化的目录
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//D:/JT-SOFT/images/2020/7/10/
String dirPath = localDir + dateDir;
File dirFile = new File(dirPath);
if(!dirFile.exists())
dirFile.mkdirs(); //如果目录不存在则新建目录.
//3.重新指定文件名称
String uuid = UUID.randomUUID().toString();
String realFileName = uuid + fileType;
//4.执行文件上传代码 目录+文件名称
File imageFile = new File(dirPath+realFileName);
try {
uploadFile.transferTo(imageFile);
String url = imageUrl+dateDir+realFileName; //图片访问的虚拟路径
return ImageVO.success(url);
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
return ImageVO.fail();
}
}
}
总结小点
时间文件夹
String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
反向代理
什么是反向代理?
业务分析
# 说明:图片如果需要展现,则通过网络虚拟地址进行访问
# 虚拟路径: http://image.jt.com/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
# 磁盘地址: D:\JT-SOFT\images/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
为了让所有的用户都能访问图片信息,则准备虚拟地址,并且实现虚拟地址与本地磁盘地址之间的映射关系.该功能采用反向代理技术实现.
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
总结:
1).反向代理服务器位于目标服务器与用户之间.
2).对于用户而言,反向代理服务器就是目标服务器.
3).用户访问时根本不清楚真实的服务器资源是谁,保护了真实服务器资源信息.
4).反向代理服务器一般是服务器端代理,保护真实服务器信息.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4Byyem1-1607441879584)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711114631861.png)]
正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
知识点:
1).代理服务器位于用户与服务器之间
2).用户发起请求时,清楚的知道自己访问的真实服务器是谁.
3).代理服务器将用户的请求转交给服务器获取数据.
4).正向代理是客户端代理,保护了用户的信息.
一般用户网络通信的使用.(路由器)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8rkyho2N-1607441879585)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711120326774.png)]
Nginx
Nginx介绍
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
内存: 不到2M
并发能力强: 3-5万次/秒 理想环境下 /tomcat服务器 150-220/秒
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9QegCho4-1607441879586)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711140904989.png)]
Nginx安装
注意:Nginx安装路径不要放到C盘 要求路径中不能有中文+空格------职业操作
1).要求以超级管理员的权限 启动nginx服务器. 动态获取权限.
2).检查任务管理器 查看是否有nginx服务项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPkYz5F5-1607441879587)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711141329504.png)]
3).浏览器访问nginx服务器.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMtFE7jd-1607441879588)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711141515852.png)]
Nginx安装中遇到的问题
1).nginx不能正常启动.
执行了nginx启动命令之后,在任务管理中 详细信息中检查是否有服务. 如果没有则表示nginx启动异常.
2).一般检查80端口是否被占用.
搜索80端口被占用的情况.
3).80端口被PID=4的编号占用
https://jingyan.baidu.com/article/b7001fe1d6e9370e7382dd43.html
Nginx命令
Nginx进程
Nginx每次启动时会生成2个进程项
1).主进程: 主要提供nginx反向代理服务的.
2).守护进程 防止主进程意外关闭的.
如果需要关闭nginx,则应该先关闭守护进程,再关闭主进程.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BaPvBG4Q-1607441879588)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711144036182.png)]
基本命令
前提条件: 要求在nginx的根目录中执行.
规范: 启动nginx之后,执行nginx的重启指令,检查是否有异常.
1).启动nginx start nginx 即使启动不成功,也不会报错!!!!
2).重启nginx nginx -s reload 如果配置文件编辑异常,则会显示报错信息
3).停止nginx nginx -s stop
入门案例
1、 业务需求
用户通过http://localhost:80的网址,要求跳转到系统的默认页面中.效果如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kgWpIF7h-1607441879589)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711150127258-1594456093003.png)]
2、反向代理入门案例
http {
server {
listen 80; # 监听端口号
server_name localhost; # 监听的服务名称
#反向代理的配置,获取用户指定的请求之后,将请求转向到什么位置
# / 请求访问的根目录
location / {
# root关键字 反向代理文件目录
root html;
# index关键字 默认跳转页面
index index.html index.htm;
}
}
}
3、反向代理效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fNTrC1kj-1607441879589)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711151202751.png)]
图片回显
业务分析
url地址: http://image.jt.com/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
磁盘地址: D:\JT-SOFT\images/2020/07/11/39ff8758-57bb-4452-bf29-db6061fff24a.jpg
利用nginx服务器实现反向代理机制, 当用户访问http://image.jt.com时 要求跳转到路径 D:\JT-SOFT\images\
编辑Nginx的配置文件
说明:修改nginx配置文件,之后重启即可.
# 配置图片服务器代理 个别windows中"_-"字符可能不识别
server {
listen 80;
server_name image.jt.com;
location / {
#映射到目录中,注意斜杠 \ 和 分号 ;
root D:\JT-SOFT\images;
}
# 浏览器访问:image.jt.com:80\xxx\xxx\
# 实际的访问:D:\JT-SOFT\images\xxx\xxx\
网络访问链路说明
HOSTS文件记录了本机访问的域名与IP的映射关系
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bVYhnGto-1607441879590)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711154736347.png)]
编辑HOSTS文件
位置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpJeNiUl-1607441879590)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200711155049587.png)]
用switchHosts编辑文件
修改hosts文件权限
负载均衡
什么是负载均衡?
说明:在分布式条件下,为了提高用户请求的响应能力,准备多台服务器.一起抗击高并发.需要用户通过同一个网址访问不同服务器的技术称之为负载均衡机制.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-haDrUBxM-1607441879590)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200713093738853.png)]
准备多台tomcat
规划说明
准备3台tomcat服务器,并且端口号依次为8081/8082/8083,之后完成项目Windows部署.
编辑MsgController
@RestController
public class MsgController {
@Value("${server.port}")
private int port;
//主要获取当前访问服务器的端口号信息!!!!
@RequestMapping("/getPort")
public String getMsg() {
return "您当前访问的服务器端口号:"+port;
}
}
项目打包
注意事项:
1).按照规定修改端口号信息 8081/8082/8083
2).将JT项目整体打包部署.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnP2Kjku-1607441879591)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200713100306543.png)]
3).项目打包成功展现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-erF89UBG-1607441879591)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200713095247259.png)]
4).将项目打包之后部署
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCIAg92R-1607441879592)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200713095951137.png)]
5).项目发布
利用命令实现项目发布: java -jar 8081.war
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yvqAl3gE-1607441879592)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200713100223989.png)]
关于项目方发布访问问题
说明: 通过命令发布项目之后,浏览器访问速度较慢.(不正常)
方式1: 直接关闭当前dos命令窗口
方式2: ctrl + c 方式 释放资源.
Nginx实现负载均衡
负载均衡需求说明
要求: 通过http://manage.jt.com 方式 依次访问8081/8082/8083服务器.
负载均衡策略—轮询
说明: 根据配置文件的顺序,依次访问tomcat服务器.
# 配置域名代理
server {
listen 80;
server_name manage.jt.com;
location / {
#proxy_pass http://localhost:8091; #代理的是服务器地址
proxy_pass http://jtW;
}
}
#定义多台tomcat服务器 1.轮询策略
upstream jtW {
server localhost:8081;
server localhost:8082;
server localhost:8083;
}
负载均衡策略—权重
权重策略: 让性能更优的服务器更多的处理请求.
#定义多台tomcat服务器 1.轮询策略 2.权重策略
upstream jtW {
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
负载均衡策略—iphash
说明: 如果需要用户与后端服务器进行绑定
时,可以使用IPhash策略.
案例A: 有时用户可能做登录操作,可能将用户信息保存到session对象 中,如果这时采用轮询/权重的策略,可能访问其他的业务服务器.导致用户频繁的登录.
配置信息:
#定义多台tomcat服务器 1.轮询策略 2.权重策略 3.ip_hash
upstream jtW {
ip_hash;
server localhost:8081 weight=6;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
IPHASH原理:
补充知识:
1).IPHASH一般只做测试时用.
2).使用IPHASH可能造成负载不均的现象. 某些服务器负载压力过高.有宕机的风险.
3).使用IPHASH时,如果后端服务器宕机,则直接影响用户的使用.
4).工作中如果需要实现用户信息的共享,一般采用SSO的方式进行.用户只需一次登录就可以访问所有相互信任的应用系统
Nginx属性配置
Nginx工作原理
默认条件下,nginx会按照指定的负载均衡规则访问服务器。如果访问的服务器又出现了问题,那么则会访问下一台服务器。但是随着负载均衡的继续,任然访问故障机.效率低.
down属性
说明:如果遇到某台tomcat服务器宕机,则可以通过down属性标识故障机,则nginx永远不会主动访问故障机.
#定义多台tomcat服务器 1.轮询策略 2.权重策略 3.ip_hash策略
upstream jtW {
#ip_hash;
server localhost:8081 weight=6 down;
server localhost:8082 weight=3;
server localhost:8083 weight=1;
}
backup 属性
说明: backup的作用表示标识备用机. 一般情况下备用不工作.当遇到主机全部宕机/遇忙时,这时备用机才会生效.
#定义多台tomcat服务器 1.轮询策略 2.权重策略 3.ip_hash策略
upstream jtW {
#ip_hash;
server localhost:8081 weight=6 down;
server localhost:8082 weight=3 down;
server localhost:8083 weight=1 backup;
}
设定访问超时
属性说明:
1.max_fails=1 允许访问失败的最多次数
2.fail_timeout=60s 失败的超时时间(理解为时间区间)
当服务器宕机时,这时配置文件还没有被标识为down时.开启了高可用的机制. 只要失败的次数超过最大失败次数,则在指定的时间周期之内,不会再次访问故障机.
#定义多台tomcat服务器 1.轮询策略 2.权重策略 3.ip_hash策略
upstream jtW {
#ip_hash;
server localhost:8081 max_fails=1 fail_timeout=60s;
server localhost:8082 max_fails=1 fail_timeout=60s;
server localhost:8083 max_fails=1 fail_timeout=60s;
}
Linux
虚拟机安装和使用
虚拟机介绍
虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机([Parallels Desktop](https://baike.baidu.com/item/Parallels Desktop) ,Vmware,VirtualBox,[Virtual pc](https://baike.baidu.com/item/Virtual pc))不同在于:虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷;虚拟系统只能模拟和现有操作系统相同的环境,而虚拟机则可以模拟出其他种类的操作系统;而且虚拟机需要模拟底层的硬件指令,所以在应用程序运行速度上比虚拟系统慢得多。
运行虚拟机镜像
将课前资料中的虚拟机镜像解压到本地磁盘中(不要有中文和空格),之后双击运行.vmx文件.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSYeGfFn-1607441879593)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps1.jpg)]
虚拟机配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9biMvHK-1607441879593)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps2.jpg)]
内存:一般最大为真实内存的3/4, 一般为512M-1G
硬盘:一般默认20G
如果上述的设置一旦确定,则直接向操作系统割裂对应数据的资源.
网络模式:桥接模式/NAT模式
网络模式
桥接模式
相当于将虚拟机直接接入局域网中,这时会独占IP地址.可以与本机通过局域网通信.
特点:所有的在局域网中的IP都可以访问虚拟机.
依赖:如果设置桥接模式,则必须有物理设备的支持.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-weaaCS53-1607441879594)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps3.jpg)]
NAT模式
相当于在网络环境中会开辟一块全新的网络空间.只有主机能够访问.
特点:NAT模式只有主机访问,其他人通过IP地址禁止访问.
虚拟机克隆
说明:JT虚拟机中安装了很多插件和环境.为了保护环境不被破坏.所以需要克隆虚拟机备份数据.之后的操作全部在备份机器上运行.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eegra8xd-1607441879594)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps5.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J1GQxAMt-1607441879595)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps6.jpg)]
LinuxIP划分和链接
IP划分
本 机 IP:192.168.126.***\*1\****
虚拟机IP:192.168.126.180
说明:以上的IP地址表示在同一个网络空间内.如果前三项不一致,则按照以下方式修改.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gknttkpt-1607441879595)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps7.jpg)]
IP地址动态修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jbC4Oy1n-1607441879595)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps8.jpg)]
配置租约:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTVyClVA-1607441879596)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps9.jpg)]
配置静态IP地址
设定ip地址:192.168.126.166
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j2zsZOtA-1607441879596)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps10.jpg)]
修改时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rv0gB78e-1607441879597)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps11.jpg)]
Xshell
Xshell介绍
说明:Xshell是远程连接Linux系统的工具.可以进行文件传输.命令的编辑等一列的操作.和操作真实的Linux系统一致.
连接步骤:
\1. 获取服务器IP地址
\2. 获取服务器用户名和密码
\3. Xshell远程连接工具都是加密传输 公钥和私钥
1.5.2 *远程连接方式*
说明:新建会话后连接远程虚拟机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-frOtRXJ5-1607441879597)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps12.jpg)]
Linux系统安装JDK
上传JDK安装包
说明:将JDK安装包上传到指定文件目录下/usr/local/src下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgrVey5m-1607441879597)(:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps13.jpg)]
解压JDK文件
命令: tar -xvf jdk-7u51-linux-x64.tar.gz
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eEZWr1eO-1607441879599)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps14.jpg)]
配置环境变量
说明:修改Linux系统中环境变量需要修改/etc/profile文件
vim /etc/profile
配置文件变量
\#set java env
JAVA_HOME=***\*/usr/local/src/java/jdk1.7.0_51\****
JAVA_BIN=/usr/local/src/java/jdk1.7.0_51/bin
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
环境变量生效:
source /etc/profile
检测JDK是否生效
java -version //命令:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1UKL7gc-1607441879599)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5Cwps15.jpg)]
Linux 快捷键
cd命令集
ifconfig/ip addr 检查IP地址
pwd 检查当前的位置
tab 自动补齐(注意唯一性)
cd / 返回根目录
cd ~ 用户主目录
cd . 当前目录
cd .. 返回到上一级目录
cd /usr 进入到usr目录
cd – 返回上一个目录
cd 直接回家
ls目录和文件
ls –l 详细格式,文件权限,时间
ll 和ls –l作用相同
ls *.txt 查看所有的txt类型文档
目录操作
mkdir a 创建 a目录
mkdir -p a/b 创建 a目录,并在a目录里创建b目录
mkdir -m 777 c 创建一个权限为777的C目录
rmdir 删除目录(如果目录里有文件,则不能用此命令)
Vi/vim创建/查看/编辑文件
命令行:Esc切换到命令行模式。
编辑模式:
按i,在光标前开始编辑
按a,在光标后开始编辑
按o,在当前行的下一行开始编辑
按u, 撤销之前的操作
底行模式:按 shift+:冒号。
:q! 不保存退出
:wq 保存退出
:/world 从当前光标处,向上查找world关键字
:?world 从当前光标处,向后查找world关键字
删除文件
rm n.txt 提示y删除n放弃
rm –f n.txt 不提示
rm –rf dirname 不提示递归删除目录下所以内容
rm –rf * 删除所有文件
rm –rf /* 删除所有子目录所有和文件
复制和移动文件
cp 复制文件
cp nginx.conf n.txt
cp –R tomcat1 tomcat2 #复制整个目录
mv 修改文件名,移动文件
mv n.txt m.txt 修改文件名称
浏览文件
cat 输出文件所有的内容
more 输出文档所有的内容,分页输出,空格浏览下一屏,q退出
less 用法和more相同,只是通过PgUp、PgOn键来控制
tail 用于显示文件后几号,使用频繁
tail -10 nginx.conf 查看nginx.conf的最后10行
tail –f nginx.conf 动态查看日志,方便查看日志新增的信息
ctrl+c 结束查看
打包命令
tar命令位于/bin目录下,它能够将用户所指定的文件或目录打包成一个文件,但不做压缩。一般Linux上常用的压缩方式是选用tar将许多文件打包成一个文件,再以gzip压缩命令压缩成name.tar.gz的文件。
-c 创建一个新的tar文件
-v 显示运行过程的信息
-f 指定文件名
-z 调用gzip压缩命令进行压缩
-t 查看压缩文件的内容
-x 解开tar文件
tar –cvf n.tar ./* 压缩当前目录下的所有文件和目录,文件名为n.tar
tar –xvf n.tar 解压压缩包中的文件到当前目录(如果长时间未解压成功 Ctrl+C推出)
tar –cvzf m.tar.gz ./* 压缩文件
tar -zxvf m.tar.gz 解压m.tar文件到当前目录
grep命令
grep root /etc/passwd 在文件中查找关键字root
grep root /etc/passwd –-color 高亮显示
grep root /etc/passwd –A5 –B5 高亮显示,A后5行,B前5行
grep -n root /etc/passwd 查找并显示行数
grep -v root /etc/passwd 取反,查出不含root的数据
Linux打包解压
1、tar格式(tar是打包,不是压缩):
2、tar.gz格式:
【压缩】:tar -zcvf 目录文件名.tar.gz 目录文件名
【解压】:tar -zxvf 目录文件名.tar.gz
3、zip格式:
【压缩】:zip -r 目录文件名.zip 目录文件名
【解压】:unzip 目录文件名.zip
4、rar格式:
【压缩】:rar a 目录文件名.rar 目录文件名
【解压】:unrar x 目录文件名.rar
5、gz格式:
【压缩】:gzip 文件名
【解压】:gzip -d 文件名.gz
6、bz2格式:
【压缩】:bzip2 -z 文件名
【解压】:bzip2 -d 文件名.bz2
Linux 环境搭建
安装JDK
打包及解压命令
tar命令位于/bin目录下,它能够将用户所指定的文件或目录打包成一个文件,但不做压缩。一般Linux上常用的压缩方式是选用tar将许多文件打包成一个文件,再以gzip压缩命令压缩成name.tar.gz的文件。
-c 创建一个新的tar文件
-v 显示运行过程的信息
-f 指定文件名
-z 调用gzip压缩命令进行压缩
-t 查看压缩文件的内容
-x 解开tar文件
tar –cvf n.tar ./* 压缩当前目录下的所有文件和目录,文件名为n.tar
tar –xvf n.tar 解压压缩包中的文件到当前目录(如果长时间未解压成功 Ctrl+C推出)
tar –cvzf m.tar.gz ./* 压缩文件
tar -zxvf m.tar.gz 解压m.tar文件到当前目录
上传JDK安装包
在/usr/local/src 下上传JDK安装包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xxooZ6z-1607441879606)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714094750960.png)]
1.1.3 解压JD
tar -zxvf jdk-8u51-linux-x64.tar.gz
删除修改文件
删除多余的安装包文件.修改文件名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zRwURww-1607441879606)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714095129918.png)]
修改环境变量
命令: vim /etc/profile
#设定jdk环境
export JAVA_HOME=/usr/local/src/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-95YYXBhN-1607441879606)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714095801292.png)]
让环境变量生效:
命令: source /etc/profile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbAphKle-1607441879607)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714095938782.png)]
京淘发布(mariadb)
项目部署流程图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P3dZRMeX-1607441879607)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714103144704.png)]
检查Linux网络是否畅通
说明:访问百度,出现61.165.169.121则表示ok。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8kMOswHD-1607441879608)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714103540159.png)]
ctrl+c 结束任务.
安装mariadb数据库
yum install mariadb-server
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WPH2NPd2-1607441879608)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071410403677.png)]
安装成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9McGEwN-1607441879609)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714104258814.png)]
操作数据库命令
启动数据库命令 systemctl start mariadb
停止数据库命令 systemctl stop mariadb
重启数据库命令 systemctl restart mariadb
配置数据
mysql_secure_installation
1).提示信息说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5d5duqTV-1607441879609)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714105054494.png)]
2.设定密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2PMdAEx-1607441879610)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714105132867.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQV5QLYm-1607441879610)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714105333428.png)]
数据库登录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-579u59sK-1607441879610)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714105802886.png)]
查询数据库权限
1).查看数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYuUtm3T-1607441879611)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714112517918.png)]
2).切换数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MgYiMuPM-1607441879611)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071411264498.png)]
设定数据库权限
说明:一般数据库中的权限在user表中进行了定义.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oxgWithR-1607441879612)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714113317229.png)]
2.修改用户权限列表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jlcjmt2R-1607441879612)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071411373215.png)]
3).修改之后的结果
作用: 以后任意的IP地址可以访问数据库,但是要求用户名和密码正确.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXUof27k-1607441879613)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714113823349.png)]
4). 刷新数据库权限
flush privileges;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfI7vZEv-1607441879613)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714115752843.png)]
关于Linux防火墙说明
防火墙的工作原理
说明:一般防火墙只拦截远程请求本服务器的请求.
防火墙的配置文件
改配置控制了防火墙 以后的操作状态信息.
1).配置以后不开启防火墙
systemctl disable firewalld.service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qd0W9eb-1607441879613)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714114714753.png)]
2).配置以后开启防火墙
systemctl enable firewalld.service
防火墙开关配置
1).检查防火墙工作状态
firewall-cmd --state
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2VTsc0O-1607441879615)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714115014785.png)]
2).关闭防火墙
改操作只能控制现在.当Linux系统重启时,改操作失效.
systemctl stop firewalld.service
systemctl start firewalld.service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xoJwMfOj-1607441879615)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714115216789.png)]
指定端口号开放
firewall-cmd --zone=public --add-port=3306/tcp --permanent
命令含义:
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
导入JTDB数据库
1).连接远程数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hyNOzJUa-1607441879615)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071412022899.png)]
2).导入数据库
搭建tomcat服务器
修改文件上传路径
1).准备图片存储目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q9QGEuU9-1607441879616)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714141138478.png)]
2).修改图片存储路径
#image.localDir=D:/JT-SOFT/images
image.localDir=/usr/local/src/images
image.imageUrl=http://image.jt.com
image.imageTypes=.jpg,.png,.gif,.jpeg
上传war包文件
说明:在/usr/local/src目录下创建tomcats目录.之后上传war包文件.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJ11M1fk-1607441879616)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071414184138.png)]
tomcat启动测试
1).启动tomcat服务器
该操作是前台启动的方式.会占用当前的控制台.
java -jar 8081.war & java -jar 8082.war & java -jar 8083.war &
2).关闭tomcat服务器
ps -ef | grep java* // 查询
kill -9 4379 // 杀死
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tv28Bxme-1607441879617)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714143602780.png)]
3).批量启动tomcat服务器
java -jar 8081.war & java -jar 8082.war & java -jar 8083.war &
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ng4xdhkR-1607441879617)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C2020071414374860.png)]
4).项目后台运行设定
说明: 通过java -jar xxxx.war 方式表示前台运行.
该方式不允许控制台关闭,如果控制台关闭之后,所有的服务都将停止.所以需要开启后台运行的方式.
nohup java -jar 8081.war -> 8081.log &
nohup java -jar 8082.war -> 8082.log &
nohup java -jar 8083.war -> 8083.log &
5).脚本start.sh启动
vim start.sh //新建start.sh文件
sh start.sh //启动脚本文件
// 脚本start.sh文件内容
#!/bin/sh
nohup java -jar 8081.war -> 8081.log &
nohup java -jar 8082.war -> 8082.log &
nohup java -jar 8083.war -> 8083.log &
安装Nginx(Linux)
下载nginx安装文件
1).打开nginx官网
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IGT5LToY-1607441879617)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714161345512.png)]
2).下载nginx安装包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G42nUb1u-1607441879618)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714161624589.png)]
安装准备
1).解压nginx tar -zxvf nginx-1.19.1.tar.gz
2).删除多余文件 rm -f nginx-1.19.1.tar.gz
3).修改文件名称 mv nginx-1.19.1 nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDGhchv5-1607441879618)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714161745335.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AIESIFB-1607441879618)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714162050748.png)]
nginx路径说明
说明: nginx的环境配置有2个环境.
环境1: /usr/local/src/nginx 该路径是nginx的源文件路径 主要负责编译/安装等工作 (安装)
环境2: /usr/local/nginx 该路径是nginx的工作路径 主要实现反向代理配置工作 (工作)
安装nginx服务器
命令1: ./configure
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6eeKCQ2-1607441879619)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714162714765.png)]
命令2: make
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtiJckR5-1607441879619)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714162820108.png)]
命令3: make install
相关信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9CMq8k4p-1607441879620)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714162926269.png)]
命令4: whereis nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7FcQjCze-1607441879620)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714162958353.png)]
启动nginx服务器
1).跳转到nginx工作目录中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0Coh5mp-1607441879621)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714163142261.png)]
2).跳转到sbin 目录中 执行启动命令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2YDnCrFk-1607441879621)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714163241791.png)]
命令:
1.启动nginx ./nginx
2.重启nginx ./nginx -s reload
3.关闭nginx ./nginx -s stop
启动效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OuooYTc5-1607441879621)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714163636824.png)]
配置winscp
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCnkTUD0-1607441879622)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714170201276.png)]
修改Linux的nginx配置信息
说明: 路径/usr/local/nginx/conf目录
#配置图片服务器
server {
listen 80;
server_name image.jt.com;
location / {
#配置反向代理的路径
root /usr/local/src/images;
}
}
#配置域名代理
server {
listen 80;
server_name manage.jt.com;
location / {
#代理tomcat服务器
proxy_pass http://tomcats;
}
}
#配置tomcat集群 默认是轮询策略
upstream tomcats {
server localhost:8081;
server localhost:8082;
server localhost:8083;
}
修改完成之后,重启nginx服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAGswwsw-1607441879622)(E:%5C%E8%B5%84%E6%96%99%5C4_jt%5C%E4%BA%AC%E6%B7%98%5CJinTao2.assets%5C20200714171420943.png)]
Ngnix的动静分离
server{
listen 80;
server_name manage.jt.com;
location / {
proxy_pass http://tomcats;
}
#静态文件交给nginx处理
location ~ .*\. (htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /usr/local/src/static/webapp;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)?$
{
root /usr/local/src/static/webapp;
expires 1h;
}
}
修改windows中的hosts文件
# 京淘环境配置
#127.0.0.1 image.jt.com
#127.0.0.1 manage.jt.com
#测试inux项目发布
192.168.126.129 image.jt.com
192.168.126.129 manage.jt.com
127.0.0.1 www.jt.com
127.0.0.1 sso.jt.com
解决开机没有IP的问题
systemctl restart NetworkManager
实现数据库高可用
数据库数据同步
数据库数据同步的流程图
问题描述1: 当数据库宕机之后,可能导致数据丢失.必须通过某些策略,保证数据的有效性.
问题描述2: 如果后端数据库宕机,则通过某些技术手段可以实现高可用(可以实现自动的故障迁移)
目的:为了保证数据不丢失
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YiENxgeH-1607441879623)(JinTao2.assets/20200715102735169-1595848223074.png)]
数据库热备份原理图
冷备份说明: 定期将数据库内容进行转储. 弊端:可能丢失数据. 公司中也会采用冷备份的方式以防万一.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mATifMGR-1607441879624)(JinTao2.assets/20200715103005841-1595848234702.png)]
2)数据库热备份原理
特点:可以保证数据的实时备份.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AkNVpTU1-1607441879624)(JinTao2.assets/20200715103819897-1595848245053.png)]
工作原理说明:
1.数据库主库将更新的数据信息写入到二进制日志文件
中.
2.数据库从库通过IO线程去主库中获取二进制文件修改内容. 之后写入到中继日志中
3.数据库从库中的Sql线程读取中继日志中的信息,实现数据的同步.并且为了降低组件之间的耦合性,采用异步的方式处理.
准备第二台Linux操作系统
复制虚拟机文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWl1dMRk-1607441879624)(JinTao2.assets/20200715105512639-1595848268361.png)]
运行虚拟机-并且修改名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FxjcFKJl-1607441879625)(JinTao2.assets/20200715105603291-1595848278060.png)]
修改虚拟机IP地址
规定: 主机IP地址 192.168.126.129 从机 192.168.126.130
1).进入修改IP地址目录
cd /etc/sysconfig/network-scripts/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aeDWbNIn-1607441879625)(JinTao2.assets/20200715110136825-1595848312915.png)]
2).修改配置文件信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIsHUAWf-1607441879626)(JinTao2.assets/2020071511095153-1595848325234.png)]
3).重置网卡
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hpNw5Qo-1607441879626)(JinTao2.assets/20200715110908184-1595848335678.png)]
在slave中安装数据库
根据之前的笔记自己独立完成数据库安装
利用sqlYog工具链接从库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JELV2B1N-1607441879627)(JinTao2.assets/20200715114809448.png)]
实现数据库导入导出
说明:在实现数据库主从之前,最好让主库和从库的数据一致.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CU15yqts-1607441879627)(JinTao2.assets/20200715114946430.png)]
数据库主从配置
开启数据库二进制文
1).说明:默认条件下 数据库二进制文件是关闭的.如果需要开启,则必须手动配置. 之后重启数据库.
修改配置文件: vim /etc/my.cnf
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PSnC4WE-1607441879628)(JinTao2.assets/20200715141604134.png)]
2).修改之后,重启数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9pM0HVZ-1607441879628)(JinTao2.assets/20200715141934368.png)]
从库开启二进制文件
说明:修改从库之后,重启数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-afKJym3e-1607441879629)(JinTao2.assets/2020071514222281.png)]
2).执行重启数据库指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UyKQkk9Q-1607441879629)(JinTao2.assets/2020071514241385.png)]
查询主库状态
说明:在数据库中执行如下指令
命令: show master status;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f4xTPMQO-1607441879629)(JinTao2.assets/20200715142641503.png)]
主从数据库挂载
说明:如果需要实现数据库的主从同步,应该由从库向主库进行挂载.
/*130是从机 实现主从的挂载 host/port/user/password/二进制文件/位置*/
change MASTER to MASTER_HOST="192.168.126.129",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=245;
/*开启主从服务*/
start slave;
/*检查主从同步状态*/
show SLAVE status;
主从状态说明:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Vk6V0wc-1607441879630)(JinTao2.assets/2020071514382898.png)]
挂载报错的说明
1.先查询日志信息
2.修改数据库配置之后重启
3.停止主从服务 STOP SLAVE;
STOP SLAVE;
4.重新挂载数据库
/*130是从机 实现主从的挂载 host/port/user/password/二进制文件/位置*/
CHANGE MASTER TO MASTER_HOST="192.168.126.129",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=245;
/*开启主从服务*/
START SLAVE;
测试主从同步
说明:操作数据库主库,检查数据库从库是否正确.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q37sAy8n-1607441879630)(JinTao2.assets/20200715150647850.png)]
数据库读写分离-负载均衡机制
读写分离说
当数据库执行写操作时,应该操作主库. 如果用户进行读操作时应该读从库.实现该机制需要准备一个代理数据库服务器.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sACZ7uP-1607441879631)(JinTao2.assets/20200715151414209.png)]
Mycat介绍
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FGumfPnl-1607441879631)(JinTao2.assets/2020071515180740.png)]
Mycat安装
1).上传Mycat安装包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CEfgsGP-1607441879631)(JinTao2.assets/20200715152042512.png)]
2).解压Mycat安装包
tar -xvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
server.xml
注意事项: 数据库代理的端口号 8066端口
<!--用户标签-->
<user name="root">
<property name="password">root</property>
<!--与schema.xml中的配置相同 注意数据库的大小写-->
<property name="schemas">jtdb</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">jtdb</property>
<property name="readOnly">true</property>
</user>
schema.xml
配置说明:该配置表示了读写分离/负载均衡的设置.
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
上传配置文件
1).删除原有配置文件信息
rm -rf schema.xml server.xml
2).上传新的配置文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtKQRhZ4-1607441879632)(JinTao2.assets/20200715155057562.png)]
启动mycat服务器
启动mycat
./mycat start
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ro3ym53N-1607441879632)(JinTao2.assets/20200715155304359.png)]
启动效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6HPNHL9-1607441879640)(JinTao2.assets/2020071515543631.png)]
修改数据源配置
spring:
datasource:
#引入druid数据源
#type: com.alibaba.druid.pool.DruidDataSource
#driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
负载均衡测试
启动程序链接数据库,检查数据访问是否正常。之后修改从库信息 检查负载均衡是否正确。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cXCD22u-1607441879640)(JinTao2.assets/20200715160517803.png)]
数据库的双机热备
数据库搭建原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRDLWofr-1607441879641)(JinTao2.assets/20200715162734130.png)]
双主模式配置
注意事项: 搭建之前保证数据库的数据一致(更新操作)!!!
1).检查主库的状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKdEBGah-1607441879641)(JinTao2.assets/20200715162955346.png)]
2).实现主从挂载
/*我之前是主库 现在是从库*/
CHANGE MASTER TO
MASTER_HOST="192.168.126.130",
MASTER_PORT=3306,
MASTER_user="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=482;
/* 启动主从服务*/
start slave
show SLAVE status;
3).主从状态检查
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROL56pUo-1607441879641)(JinTao2.assets/20200715163606641.png)]
配置数据库高可用
什么是数据库高可用
说明: 当其中有一台数据库宕机之后,用户依然可以正确的访问数据库不受任何影响,(实现了故障迁移).主要数据库能够正常的工作,则重新启动数据库之后则可以实现自动的数据的同步.
实现数据库高可用配置
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--name属性是自定义的 dataNode表示数据库的节点信息 jtdb表示逻辑库-->
<schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>
<!--定义节点名称/节点主机/数据名称-->
<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
<!--参数介绍-->
<!--balance 0表示所有的读操作都会发往writeHost主机 -->
<!--1表示所有的读操作发往readHost和闲置的主节点中-->
<!--writeType=0 所有的写操作都发往第一个writeHost主机-->
<!--writeType=1 所有的写操作随机发往writeHost中-->
<!--dbType 表示数据库类型 mysql/oracle-->
<!--dbDriver="native" 固定参数 不变-->
<!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
<!--switchType=1 表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
<!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳检测策略-->
<heartbeat>select 1</heartbeat>
<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
-->
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
<!--定义第二台主机 由于数据库内部已经实现了双机热备.-->
<!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.-->
<!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
<!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
<!--前提:实现双机热备.-->
<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">-
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
实现数据库高可用
1).将修改好的配置文件导入mycat
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kfq1MDTb-1607441879642)(JinTao2.assets/20200715170445686.png)]
2).重启mycat服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkSjcdax-1607441879642)(JinTao2.assets/20200715170531919.png)]
3).测试数据库高可用
主从服务*/
start slave
show SLAVE status;
3).主从状态检查
[外链图片转存中...(img-ROL56pUo-1607441879641)]
## 配置数据库高可用
### 什么是数据库高可用
说明: 当其中有一台数据库宕机之后,用户依然可以正确的访问数据库不受任何影响,(实现了故障迁移).主要数据库能够正常的工作,则重新启动数据库之后则可以实现自动的数据的同步.
### 实现数据库高可用配置
```xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--name属性是自定义的 dataNode表示数据库的节点信息 jtdb表示逻辑库-->
<schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>
<!--定义节点名称/节点主机/数据名称-->
<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
<!--参数介绍-->
<!--balance 0表示所有的读操作都会发往writeHost主机 -->
<!--1表示所有的读操作发往readHost和闲置的主节点中-->
<!--writeType=0 所有的写操作都发往第一个writeHost主机-->
<!--writeType=1 所有的写操作随机发往writeHost中-->
<!--dbType 表示数据库类型 mysql/oracle-->
<!--dbDriver="native" 固定参数 不变-->
<!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
<!--switchType=1 表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
<!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳检测策略-->
<heartbeat>select 1</heartbeat>
<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
-->
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
<!--定义第二台主机 由于数据库内部已经实现了双机热备.-->
<!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.-->
<!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
<!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
<!--前提:实现双机热备.-->
<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">-
<!--读数据库1-->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!--读数据库2-->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
实现数据库高可用
1).将修改好的配置文件导入mycat
[外链图片转存中…(img-Kfq1MDTb-1607441879642)]
2).重启mycat服务器
[外链图片转存中…(img-NkSjcdax-1607441879642)]
3).测试数据库高可用
先将主库宕机,之后查询数据,之后重启主库 检查主从同步的状态是否正确.