GitRedisNginx合集
目录
文件传下载
Git常用命令
Git工作区中文件的状态
远程仓库操作
分支操作
标签操作
idea中使用git
设置git.exe路径
操作步骤
linux配置jdk
安装tomcat
查看是否启动成功
查看tomcat进程
防火墙操作
开放指定端口并立即生效
安装mysql
修改mysql密码
安装lrzsz软件上传下载
手工部署项目
停止springboot程序
通过shell脚本自动部署
linux安装git
使用git克隆远程仓库
redis基础
redis简介
Redis应用场景
redis下载地址
redis安装:
启动和停止redis
redis远程连接
redis数据类型
Redis常用命令
字符串string操作命令
哈希hash操作命令
列表list操作命令
集合set操作命令
有序集合sorted set操作命令
通用命令
java中操作redis
Spring Cache框架
Spring Cache常用注解
读写分离
主从复制
配置-前置条件
配置主库master
配置-从库slave
Sharding-JDBC实现读写分离介绍
Nginx
nginx概述
nginx安装
安装完成
编辑 open() "/usr/local/nginx/logs/access.log" failed (21: Is a directory)nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
编辑
Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
启动和停止
配置环境变量,简化命令
Nginx配置文件结构
Nginx具体应用
部署静态资源
正向代理
反向代理
配置反向代理
负载均衡
负载均衡策略
前后端分离开发
Swagger
swagger常用注释
文件传下载
upload.html中
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传</title><!-- 引入样式 --><link rel="stylesheet" href="../../plugins/element-ui/index.css" /><link rel="stylesheet" href="../../styles/common.css" /><link rel="stylesheet" href="../../styles/page.css" />
</head>
<body><div class="addBrand-container" id="food-add-app"><div class="container"><el-upload class="avatar-uploader"action="/common/upload":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeUpload"ref="upload"><img v-if="imageUrl" :src="imageUrl" class="avatar"></img><i v-else class="el-icon-plus avatar-uploader-icon"></i></el-upload></div></div><!-- 开发环境版本,包含了有帮助的命令行警告 --><script src="../../plugins/vue/vue.js"></script><!-- 引入组件库 --><script src="../../plugins/element-ui/index.js"></script><!-- 引入axios --><script src="../../plugins/axios/axios.min.js"></script><script src="../../js/index.js"></script><script>new Vue({el: '#food-add-app',data() {return {imageUrl: ''}},methods: {handleAvatarSuccess (response, file, fileList) {this.imageUrl = `/common/download?name=${response.data}`},beforeUpload (file) {if(file){const suffix = file.name.split('.')[1]const size = file.size / 1024 / 1024 < 2if(['png','jpeg','jpg'].indexOf(suffix) < 0){this.$message.error('上传图片只支持 png、jpeg、jpg 格式!')this.$refs.upload.clearFiles()return false}if(!size){this.$message.error('上传文件大小不能超过 2MB!')return false}return file}}}})</script>
</body>
</html>
controller下的commoncontroller
package com.reggie.controller;import com.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {@Value("${zhfood.path}")private String basePath;
// @Value("zhfood.path.name")
// private String pathName;/*** 文件上传* @param file* @return*/@PostMapping("/upload")public R<String> upload(MultipartFile file){//file是一个临时文件,需要转存到指定的位置,否则本次请求后临时文件会被删除log.info(file.toString());//使用原始文件名String originalFilename = file.getOriginalFilename();//截取原始文件名的后缀String suffix= originalFilename.substring(originalFilename.lastIndexOf("."));//使用uuid生成文件名,防止文件名重复造成覆盖String fileName = UUID.randomUUID().toString()+suffix;//创建一个目录对象File dir =new File(basePath);//判断当前目录是否存在if(!dir.exists()){dir.mkdirs();//不存在就创建出来}try {//将临时文件转出到指定的位置file.transferTo(new File(basePath+fileName));} catch (IOException e) {e.printStackTrace();}return R.success(fileName);}/*** 下载文件(展示到浏览器)* @param name* @param response*/@GetMapping("/download")public void download(String name, HttpServletResponse response){try { //输入流,通过输入流读取文件内容FileInputStream fileInputStream =new FileInputStream(new File(basePath+name));//输出流。通过输出流将文件写回溯给浏览器,在浏览器中展示图片ServletOutputStream outputStream =response.getOutputStream();//设置相应的为图片文件response.setContentType("image/jpeg");int len=0;byte [] bytes=new byte[1024];while ((len=fileInputStream.read(bytes))!=-1){outputStream.write(bytes,0,len);outputStream.flush();}//关闭资源outputStream.close();fileInputStream.close();} catch (Exception e) {e.printStackTrace();}}
}
json数据传输要加@requestBody注解
传入数据用session存起来,之后取可以用BaseContext取出
计算总金额
AtomicInteger amount = new AtomicInteger(0);//原子操作,保证线程安全(普通的int无法)//stream流进行操作List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> {//将订单明细设置出来OrderDetail orderDetail = new OrderDetail();orderDetail.setOrderId(orderId);orderDetail.setNumber(item.getNumber());orderDetail.setDishFlavor(item.getDishFlavor());orderDetail.setDishId(item.getDishId());orderDetail.setSetmealId(item.getSetmealId());orderDetail.setName(item.getName());orderDetail.setImage(item.getImage());orderDetail.setAmount(item.getAmount());//计算总金额amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue()); return orderDetail;}).collect(Collectors.toList());
Git常用命令
版本库:.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
工作区:包含git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码
暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
Git工作区中文件的状态
Git工作区中的文件存在两种状态
untracked :未跟踪(未被纳入版本控制)
tracked 已跟踪(被纳入版本控制)
- Unmodified 未修改状态
- Modified 已修改状态
- Staged 已暂存状态
注意: 这些文件的状态会随着我们执行Git的命令发生变化
本地仓库常用命令如下
git status 查看文件状态
git add 将文件的修改加入暂存区
git reset 将暂存区的文件取消暂存或者是切换到指定版本
git commit 将暂存区的文件修改提交到版本库
git log 查看日志
远程仓库操作
前面执行的命令操作都是针对的本地仓库,本节我们会学习关于远程仓库的一些操作,具体包括:
git remote 查看远程仓库
git remote add origin url 添加远程仓库
git clone 从远程仓库克隆
git pull 从远程仓库拉取
git push 推送到远程仓库
分支操作
分支是Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。同一个仓库可以有多个分支,各个分支相互独立,互不干扰。通过git init 命令创建本地仓库时默认会创建一个master分支
git branch 查看分支
git branch [name] 创建分支
git checkout [name] 切换分支
git push[shortName][name]推送至远程仓库分支(shortname是远程仓库的别名,一般为origin)
git merge [name] 合并分支
标签操作
标签是指某个分支某个特定的时间段的状态
git tag 列出已有的标签
git tag [name] 创建标签
git push [shortName] [name] 将标签推送至远程仓库
git checkout -b [branch] [name] 检出标签
这个标签记录的是master分支下的所有内容
新增版本
检出某一版本,检出标签时,需要新建一个分支来指向某一版本
idea中使用git
设置git.exe路径
获取git仓库
在IDEA中使用Git获取仓库有两种方式:
- 本地初始化仓库
- 从远程仓库克隆
初始化仓库
获取远程仓库
操作步骤
修改网络初始化配置,设定网卡在系统启动时初始化
linux配置jdk
安装tomcat
查看是否启动成功
查看tomcat进程
ps命令是linux下非常强大的进程查看命令,通过ps -ef可以查看当前运行的所有进程的详细信息“”在Linux中称为管道符,可以将前一个命令的结果输出给后一个命令作为输入使用ps命令查看进程时,经常配合管道符和查找命令 grep 一起使用,来查看特定进程
防火墙操作
systemctl是管理Linux中服务的命令,可以对服务进行启动、停止、重启,查看状态等操作
firewall-cmd是Linux中专门用于控制防火墙的命令
为了保证系统安全,服务器的防火墙不建议关闭
开放指定端口并立即生效
firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --reload
访问测试
安装mysql
安装过程可以参考
linux下mysql安装
修改mysql密码
通过登录mysql系统
1 mysql -uroot -p
2 Enter password: 【输入原来的密码】
3 mysql>use mysql;
4 mysql> update user set password=passworD("123456") where user='root';
5 mysql> exit;
注意:如果Mysql的版本是5.7及以上的话update语句更换如下:
1 mysql> update user set authentication_string=passworD("123456") where user='root';
安装lrzsz软件上传下载
手工部署项目
先将springboot程序打成jar包
改为后台运行SpringBoot程序,并将日志输出到日志文件
目前程序运行的问题
- 线上程序不会采用控制台霸屏的形式运行程序,而是将程序在后台运行
- 线上程序不会将日志输出到控制台,而是输出到日志文件,方便运维查阅信息
查看文件
停止springboot程序
查找关于java的进程
ps -ef |grep java关闭进程
kill -9 进程id
通过shell脚本自动部署
linux安装git
使用git克隆远程仓库
cd /usr/local/ //进入一个目录
git clone https://gitee.com/GKBSKC/hellow.git //克隆一个仓库地址
redis基础
Redis是一个基于内存的key-value结构数据库
基于内存存储,读写性能高
适合存储热点数据(热点商品、资讯、新闻)
企业应用广泛
redis简介
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库NoSal(Not Only SOL),不仅仅是SQL,泛指非关系型数据库。NoSql数据库并不是要取代关系型数据库,而是关系型数据库的补充。
Redis应用场景
- 缓存
- 任务队列
- 消息队列
- 分布式锁
redis下载地址
linux版本下载地址:Index of /releases/
window版本下载地址:https://github.com/microsoftarchive/redis/releases
redis安装:
在Linux系统安装Redis步骤
1.将Redis安装包上传到Linux
2.解压安装包,命令:tar -zxvf redis-4.0.0.tar.gz-C /usr/local3.安装Redis的依赖环境gcc,命令: yum install gcc-c++
4.进入/usr/local/redis-4.0.0,进行编译,命令: make
5.进入redis的src目录,进行安装,命令:make install
启动和停止redis
找到redis解压的位置,找到redis.server
停止redis服务:ctrl+c
redis默认在前台显示,这不是很方便查看,修改配置文件可以让到后台显示
进入文件可以先输入\dae找到文件位置,然后输入i插入模式修改
显示的加载配置文件,并启动了redis服务
redis远程连接
而且得关闭防火墙,就可以连接成功
redis数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型
- 字符串 string
- 哈希 hash
- 列表list
- 集合set
- 有序集合 sorted sets
value的数据类型,key固定是string类型
Redis常用命令
字符串string操作命令
redis中字符串类型常用命令
set key value 设置指定key的值
get key 获取指定key的值
setex key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds秒
setex key value 只有在key不存在时设置 key的值
MSET:批量添加多个String类型的键值对
MGET:根据多个key获取多个String类型的value
INCR:让一个整型的key自增1
INCRBY:让一个整型的key自增并指定步长,例如: incrby num 2让num值自增2
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
哈希hash操作命令
Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:
hset key field value 将哈希表 key 中的字段 field 的值设为 value
hget key field 获取存储在哈希表中指定字段的值
hdel key field 删除存储在哈希表中的指定字段
hkeys key 获取哈希表中所有字段
hvals key 获取哈希表中所有值
hgetall key 获取在哈希表中指定key的所有字段和值
列表list操作命令
Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:
lpush key value1 value2 将一个或多个值插入到列表头部
lrange key start stop 获取列表指定范围内的元素
rpop key 移除并获取列表最后一个元素
llen key 获取列表长度
brpop key1 [key2 ] timeout 移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
集合set操作命令
Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令
sadd key member1[member2]向集合添加一个或多个成员
smembers key 返回集合中的所有成员
scard key 获取集合的成员数
sinter key1 [key2] 返回给定所有集合的交集
sunion key1 [key2] 返回所有给定集合的并集
sdiff key1 [key2] 返回给定所有集合的差集
srem key member [member2] 移除集合中一个或多个成员
有序集合sorted set操作命令
Redis sorted set有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数score)。redis正是通过分数采为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。
常用命令:
zadd key score1 member1 [score2 member2]向有序集合添加一个或多个成员,或者更新已存在成员的分数
zrange key start stop [withscores] 通过索引区间返回有序集合中指定区间内的成员
zincrby key increment member有序集合中对指定成员的分数加上增量increment
zrem key member[member ...]移除有序集合中的一个或多个成员
通用命令
keys patern 查找素有符合给定模式(pattern)的key
exists key 检查给定的key是否存在
type key 返回key所储存的值的类型
ttl key返回给定key的剩余生命时间(ttl,time to live),以秒为单位
del key 用于在key存在时删除key(可以一次性删除多个,如del name age ...)
java中操作redis
Redis的Java 客户端很多,官方推荐的有三种:
- Jedis
- Lettuce
- Redisson
Spring 对Redis客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即spring-boot-starter-data-redis
在springboot项目中,可以使用spring data Redis来简化Redis操作,maven坐标
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对iedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:
- ValueOperations:简单K-V操作
- SetOperations: set类型数据操作
- ZSetOperations: zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
Spring Cache框架
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。
CacheManager是Spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实现不同的CacheManager:
Spring Cache常用注解
在spring boot项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。
例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可
读写分离
读和写所有压力都由一台数据库承担,压力大数据库服务器磁盘损坏则数据丢失,单点故障
分离的情景:
主从复制
MySOL主从复制是一个异步的复制过程,底层是基于Mysgl数据库自带的二进制日志功能。就是一合或多合MySOL数据库(slave,即从库)从另一台MySOL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySOL主从复制是MvSOL数据库自带功能,无需借助第三方工具。
MySQL复制过程分成三步
- master将改变记录到二进制日志 (binary log)
- slave将master的binary log拷贝到它的中继日志 (relay log)
- slave重做中继日志中的事件,将改变应用到自己的数据库中
配置-前置条件
准备好两台服务器,都按装好mysql并启动服务成功
systemctl start mysqld.service启动mysql服务
使用service mysqld status
查看运行状态
主库(master)
配置主库master
第一步:修改Mysql数据库的配置文件/etc/my.cnf
[mysqld]
log-bin=mysql-bin#[必须]启用二进制日志
server-id=134 #[必须]服务器唯一ID
第二步:重启mysql服务
systemctl restart mysqld
第三步:登录mysql数据库,执行如下sql
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
注,上面sql的作用是创建一个用户xiaoming,密码为Root@123456,并目给xiaoming用户损REPLICATION SLAV权眼。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制
第四步:登录msql数据库,执行下面的sql记录下结果中fule和position的值
show master status;
注:上面SQL的作用是查看Master的状态,执行完此SQL后不要再执行任何操作
配置-从库slave
第一步:修改Mysq1数据库的配置文件/etc/my.cnf
[mysqld]
server-id=135 #[必须]服务器唯一ID
第二步:重启mysql服务
systemctl restart mysqld
第三步,登录mysql数据库,执行如下sql
change master to master_host='192.168.99.134', master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=853;
start slave
第四步;执行下面sql,查看从库状态
show slave status;
将赋值到查看器中
在主库中的操作,从表也会有变化
Sharding-JDBC实现读写分离介绍
ShardingDBC定位为轻量级/ava框架,在Java的]DBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。
适用于任何基于]DBC的ORM框架,如:JPA,Hibernate,Mybatis,SpringJDBCTemplate或直接使用JDBC.
支持任何第三方的数据库连接池,如: DBCP,C3PO,BoneCP,Druid,HikariCP等。
支持任意实现]DBC规范的数据库。目前支持MySQL,Oracle,LServer,PostgresQL以及任何遵循SQL92标准的数据库。
使用Sharding-JDBC实现读写分离步骤
- 1、导入maven坐标
- 2、在配置文件中配置读写分离规则
- 3、在配置文件中配置允许bean定义覆盖配置项
配置
spring:application:name: reggie_take_out2shardingsphere:datasource:names:master,slave#主数据源master:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.99.134:3306/reggie?characterEncoding=utf-8username: rootpassword: 123456#从数据源slave:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.99.135:3306/reggie?characterEncoding=utf-8username: rootpassword: 123456masterslave:#读写分离配置,负载均衡load-balance-algorithm-type: round_robin #轮询(轮流)#最终的数据源名称name: dataSource#主库数据源名称master-data-source-name: master#从库数据源名称列表,多个用逗号分隔slave-data-source-names: slaveprops:sql:show: true #开启sql显示(控制台),默认falsemain:allow-bean-definition-overriding: true #允许bean覆盖
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version>
</dependency>
Nginx
nginx概述
Nginx是一款轻量级的web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网站有:百度、京东新浪、网易、腾讯、淘宝等。
Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler,ru站点(俄文: Pam6nep)开发的,第一个公开版本@.1.@发布于2094年10月4日。
nginx安装
1、安装依赖包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
2、下载Nginx安装包 wget https://nginx.org/download/nginx-1.16.1.tar.gz
3、解压 tar -zxvf nginx-1.16.1.tar.gz
4、cd nginx-1.16.1创建Nginx目录 mkdir -p /usr/local/nginx
5、./configure --prefix=/usr/local/nginx
6、make && make install
安装完成
open() "/usr/local/nginx/logs/access.log" failed (21: Is a directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
是说这个access是一个目录,需要进入这个logs目录把这个access.log删除,使用命令
rm -rf access.log ,有时候权限不够,需要su root ,删除完成之后,使用touch access.log创建
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
使用这个命令结束即可 sudo fuser -k 80/tcp
被占用,ps -ef |grep nginx查看 nginx的进程
使用kill -9 xxx 杀死进程进程即可
Restarting network (via systemctl): Job for network.service failed because the control process exited with error code. See "systemctl status network.service" and "journalctl -xe" for details.
没有ip地址时候,
重启network网络报错
$ systemctl stop NetworkManager
$ systemctl disable NetworkManager
# 重启network
$ systemctl start network.service
重点目录/文件:
conf/nginx.conf nginx配置文件
html存放静态文件 (htm1、CSs、Js等)
logs日志目录,存放日志文件
sbin/nginx 二进制文件,用于启动、停止Nginx服务
查看版本号
检查配置文件的正确性
找到安装nginx的位置
启动和停止
在sbin目录下
启动Nginx服务使用如下命令 ./nginx
停止Nginx服务使用如下命令: ./nginx -s stop
启动完成后可以查看Nginx进程 ps -ef | grep nginx
重新加载 :nginx -s reload
配置环境变量,简化命令
vim /etc/profile进入配置文件
然后在这加入红线部分的话
Nginx配置文件结构
整体结构介绍
Nginx具体应用
部署静态资源
Nginx可以作为静态web服务器来部署静态资源。静态资源指在服务端真实存在并且能够直接展示的一些文件,比如常见的html页面、css文件、js文件、图片、视频等资源。
相对于Tomcat,Nginx处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到Nginx中。将静态资源部署到Nginx非常简单,只需要将文件复制到Nginx安装目录下的html目录中即可。
将文件放在nginx目录下的html目录下
从外部访问linux,注意防火敲是否关闭,或者端口是否开放
正向代理
是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。正向代理的典型用途是为在防火墙内的局域网客户端提供访问internet的途径。正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问到目标服务器
反向代理
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器用户不需要知道目标服务器的地址,也无须在用户端作任何设定。
配置反向代理
server {listen 82;server_name localhost;location / {proxy_pass http://192.168.99.135:8080; #反向代理配置,将请求转发到指定服务}
}
客户端通过访问一个反向代理服务器,转发到指定的web服务器
负载均衡
早期的网站流量和业务功能都比较简单,单台服务器就可以满足基本需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器组成应用集群进行性能的水平扩展以及避免单点故障出现。
应用集群:将同一应用部署到多台机器上,组成应用集群,接收负载均衡器分发的请求,进行业务处理并返回响应数据
负载均衡器:将用户请求根据对应的负载均衡算法分发到应用集群中的一台服务器进行处理
同样是在反向代理那边配置
负载均衡策略
server 192.168.138.101:8080 weight=10
server 192.168.138.101:8081 weight=5;
在集群中的服务器中加入即可,weight默认是1,值越大,权重越大,概率也就越大
前后端分离开发
前后端分离开发,就是在项目开发过程中,对于前端代码的开发由专门的前端开发人员负责,后端代码则由后端开发人员负责,这样可以做到分工明确、各司其职,提高开发效率,前后端代码并行开发,可以加快项目开发进度。目前,前后端分离开发方式已经被越来越多的公司所采用,成为当前项目开发的主流开发方式
前后端分离开发后,从工程结构上也会发生变化,即前后端代码不再混合在同一个maven工程中,而是分为前端工程和后端工程。
开发流程
前后端分离开发后,面临一个问题,就是前端开发人员和后端开发人员如何进行配合?,可以按照一下流程进行
接口(API接口)就是一个http的请求地址主要就是去定义:请求路径、请求方式、请求参数、响应数据等内容。
如:
前端的技术栈
Swagger
使用swagger腻子需要按照它的规范去定义接口以及接口相关的信息,在通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等。
官网:https://swagger.io/
knife4j是为java MVC框架集成Swagger生成api文档的增强解决方案
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version>
</dependency>
使用方式
操作步骤:
- 1、导入knife4j的maven坐标
- 2、导入knife4j相关配置类
- 3、设置静态资源,否则接日文档页面无法访问
- 4、在LoginCheckFilter中设置不需要处理的请求路径
1、导入坐标
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version>
</dependency>
2、WebMvcConfig类中
以及加上两个注解
//开启swagger文档功能 @EnableSwagger2 @EnableKnife4j
@Beanpublic Docket createRestApi(){//文档类型return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.reggie.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo(){return new ApiInfoBuilder().title("外卖平台").version("1.0").description("外卖平台接口文档").build();}
3、设置静态资源映射(WebMvcConfig类中的addResourceHandlers方法),否则接口文档页面无法访问
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
4、在loginCheckFilter中设计不需要处理的请求路径
配置完成访问端口加doc.htm就可以获得所有
swagger常用注释
这些注解的作用是让生成的 接口文档效果更好
比如在套餐中加
加之前
加之后
就有了相应的说明,更加的直观
相关文章:
![](https://img-blog.csdnimg.cn/c147cf6e83d942e1b25f57ac960e5db9.png)
GitRedisNginx合集
目录 文件传下载 Git常用命令 Git工作区中文件的状态 远程仓库操作 分支操作 标签操作 idea中使用git 设置git.exe路径 操作步骤 linux配置jdk 安装tomcat 查看是否启动成功 查看tomcat进程 防火墙操作 开放指定端口并立即生效 安装mysql 修改mysql密码 安装lrzsz软…...
![](https://img-blog.csdnimg.cn/f9e6fe13fda9445e861a95aa7cc37727.png)
系统架构设计师之缓存技术:Redis与Memcache能力比较
系统架构设计师之缓存技术:Redis与Memcache能力比较...
![](https://img-blog.csdnimg.cn/e4a623cdda0e4e45a409d6f1fa7044d6.png)
02.sqlite3学习——嵌入式数据库的基本要求和SQLite3的安装
目录 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模型 ubuntu 22.04下的SQLite安装 嵌入式数据库的基本要求和SQLite3的安装 嵌入式数据库的基本要求 常见嵌入式数据库 sqlite3简介 SQLite3编程接口模…...
![](https://img-blog.csdnimg.cn/9f2a9fb7fe104716999befd19e10a7eb.jpeg)
AIGC ChatGPT 按年份进行动态选择的动态图表
动态可视化分析的好处与优势: 1. 提高信息理解性:可视化分析使得大量复杂的数据变得易于理解,通过图表、颜色、形状、尺寸等方式,能够直观地表现不同的数据关系和模式。 2. 加快决策速度:数据可视化可以帮助用户更快…...
![](https://img-blog.csdnimg.cn/3902fc0e6887439d9a7c19f0555a035c.webp)
分布式—雪花算法生成ID
一、简介 1、雪花算法的组成: 由64个Bit(比特)位组成的long类型的数字 0 | 0000000000 0000000000 0000000000 000000000 | 00000 | 00000 | 000000000000 1个bit:符号位,始终为0。 41个bit:时间戳,精确到毫秒级别&a…...
![](https://img-blog.csdnimg.cn/img_convert/e79f6e613e905077a3eb4eeb68a6e596.jpeg)
Python语言实现React框架
迷途小书童的 Note 读完需要 6分钟 速读仅需 2 分钟 1 reactpy 介绍 reactpy 是一个用 Python 语言实现的 ReactJS 框架。它可以让我们使用 Python 的方式来编写 React 的组件,构建用户界面。 reactpy 的目标是想要将 React 的优秀特性带入 Python 领域,…...
![](https://img-blog.csdnimg.cn/e1695c70261c4c809cde4bd3c078f878.png)
Netty入门学习和技术实践
Netty入门学习和技术实践 Netty1.Netty简介2.IO模型3.Netty框架介绍4. Netty实战项目学习5. Netty实际应用场景6.扩展 Netty 1.Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&…...
![](https://img-blog.csdnimg.cn/img_convert/66964dafe4e5329126e7aa074a7976ad.jpeg)
MySQL详细安装与配置
免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的 标准化语言,其特点为体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,在 Web 应用方面 MySQL 是最好的 RDBMS(Relation…...
![](https://img-blog.csdnimg.cn/c02484afee5145f7a7a475914aa0d901.png)
裸露土堆识别算法
裸露土堆识别算法首先利用图像处理技术,提取出图像中的土堆区域。裸露土堆识别算法首通过计算土堆中被绿色防尘网覆盖的比例,判断土堆是否裸露。若超过40%的土堆没有被绿色防尘网覆盖,则视为裸露土堆。当我们谈起计算机视觉时,首先…...
![](https://www.ngui.cc/images/no-images.jpg)
说说你对Redux的理解?其工作原理?
文章目录 redux?工作原理如何使用后言 redux? React是用于构建用户界面的,帮助我们解决渲染DOM的过程 而在整个应用中会存在很多个组件,每个组件的state是由自身进行管理,包括组件定义自身的state、组件之间的通信通…...
![](https://www.ngui.cc/images/no-images.jpg)
《基于 Vue 组件库 的 Webpack5 配置》7.路径别名 resolve.alias 和 性能 performance
路径别名 resolve.alias const path require(path);module.exports {resolve: {alias: {"": path.resolve(__dirname, "./src/"),"assets": path.resolve(__dirname, "./src/assets/"),"mixins": path.resolve(__dirname,…...
![](https://img-blog.csdnimg.cn/2336ca295add42cc89c62e928fd0d493.png)
基于PaddleOCR2.7.0发布WebRest服务测试案例
基于PaddleOCR2.7.0发布WebRest服务测试案例 #WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. #警告:这是一个开发服务器。不要在生产部署中使用它。请改用生产WSGI服务器。 输出结果…...
![](https://www.ngui.cc/images/no-images.jpg)
Solidity 合约安全,常见漏洞 (下篇)
Solidity 合约安全,常见漏洞 (下篇) Solidity 合约安全,常见漏洞 (上篇) 不安全的随机数 目前不可能用区块链上的单一交易安全地产生随机数。区块链需要是完全确定的,否则分布式节点将无法达…...
![](https://www.ngui.cc/images/no-images.jpg)
nodejs根据pdf模板填入中文数据并生成新的pdf文件
导入pdf-lib库和fontkit npm install pdf-lib fs npm install pdf-lib/fontkit 具体代码 const { PDFDocument, StandardFonts } require(pdf-lib); const fs require(fs); const fontkit require(pdf-lib/fontkit) let pdfDoc let font async function fillPdfForm(temp…...
![](https://img-blog.csdnimg.cn/3637f2aac29243a2bbe205f847960eee.png#pic_center)
UE4与pycharm联合仿真的调试问题及一些仿真经验
文章目录 ue4与pycharm联合仿真的调试问题前言ue4端的debug过程pycharm端 一些仿真经验小结 ue4与pycharm联合仿真的调试问题 前言 因为在实验中我需要用到py代码输出控制信息给到ue4中,并且希望看到py端和ue端分别在运行过程中的输出以及debug调试。所以…...
![](https://img-blog.csdnimg.cn/e93dd6cce4a64f8797430f56db2af2db.png)
【数据分析】波士顿矩阵
波士顿矩阵是一种用于分析市场定位和企业发展战略的管理工具。由美国波士顿咨询集团(Boston Consulting Group)于1970年提出,并以该集团命名。 波士顿矩阵主要基于产品生命周期和市场份额两个维度,将企业的产品或业务分为四个象限…...
![](https://img-blog.csdnimg.cn/6620ac5ea5b0425cba00d5e5f21cd442.gif#pic_center)
sizeof和strlen的对比
文章目录 🚩前言🚩sizeof🚩strlen🚩sizeof和strlen对比 🚩前言 很多小白在学习中,经常将sizeof和strlen弄混了。本篇文章,小编讲解一下sizeof和strlen的区别。🤷♂️ 🚩…...
![](https://www.ngui.cc/images/no-images.jpg)
Flutter系列文章-Flutter 插件开发
在本篇文章中,我们将学习如何开发 Flutter 插件,实现 Flutter 与原生平台的交互。我们将详细介绍插件的开发过程,包括如何创建插件项目、实现方法通信、处理异步任务等。最后,我们还将演示如何将插件打包并发布到 Flutter 社区。 …...
![](https://img-blog.csdnimg.cn/img_convert/34f822450e40531545dd70f987b7c91c.jpeg#?w=1050&h=1164&e=jpg&b=fefefe)
基于SpringBoot实现MySQL与Redis的数据最终一致性
问题场景 在并发场景下,MySQL和Redis之间的数据不一致性可能成为一个突出问题。这种不一致性可能由网络延迟、并发写入冲突以及异常情况处理等因素引起,导致MySQL和Redis中的数据在某些时间点不同步或出现不一致的情况。数据一致性问题的级别可以分为三…...
![](https://www.ngui.cc/images/no-images.jpg)
mysql与oracle数据库备份
mysql 1在执行mysql数据备份前,可先执行命令查看磁盘容量: # df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 46G 1.6G 97% / tmpfs 1.9G 92K 1.9G 1% /dev/shm /dev/sda1 485M 39M 421M 9% /boot…...
![](https://img-blog.csdnimg.cn/24c31763ebfb4bb28322c9208e994b9f.png)
UE4 材质学习笔记
CheapContrast与CheapContrast_RGB都是提升对比度的,一个是一维输入,一个是三维输入,让亮的地方更亮,暗的地方更暗,不像power虽然也是提升对比度,但是使用过后的结果都是变暗或者最多不变(值为1…...
![](https://static.oschina.net/uploads/img/202308/25230004_B8aK.png)
TiDB 源码编译之 TiProxy 篇
作者: ShawnYan 原文来源: https://tidb.net/blog/3d57f54d TiProxy 简介 TiProxy 是一个基于 Apache 2.0 协议开源的、轻量级的 TiDB 数据库代理,基于 Go 语言编写,支持 MySQL 协议。 TiProxy 支持负载均衡,接收来…...
![](https://www.ngui.cc/images/no-images.jpg)
利用驱动漏洞
sbyt3/IObitUnlocker.Wrapper (github.com)...
![](https://img-blog.csdnimg.cn/13aa3a7c9c5744bda913816027d231ed.png)
开始MySQL之路——MySQL约束概述详解
MySQL约束 create table [if not exists] 表名(字段名1 类型[(宽度)] [约束条件] [comment 字段说明],字段名2 类型[(宽度)] [约束条件] [comment 字段说明],字段名3 类型[(宽度)] [约束条件] [comment 字段说明] )[表的一些设置]; 概念 约束英文:constraint 约束实…...
![](https://www.ngui.cc/images/no-images.jpg)
CMake基础和命令介绍
CMake是一个跨平台的构建工具,它可以生成各种不同平台上的构建文件,例如Makefile或Visual Studio项目文件。以下是一些常用的CMake命令: 1. cmake_minimum_required:指定需要的最小CMake版本。 2. project:定义项目名…...
![](https://img-blog.csdnimg.cn/88bc45340fe0483890f4c388851078e2.png#pic_center)
【matlab利用shp文件制作mask白化文件】
matlab白化文件 mask文件的作用matlab制作mask文件mask结果 mask文件的作用 地理信息绘图中的 “mask” 通常指的是遮罩或掩膜,用于在地图或图像上隐藏、高亮或标记特定区域。 数据可视化: 地理信息绘图 mask 可以用于突出显示特定地理区域,使…...
![](https://img-blog.csdnimg.cn/0372681c38d048a0a99532d406e8717f.png#pic_center)
【LLM】解析pdf文档生成摘要
文章目录 一、整体思路二、代码三、小结Reference 一、整体思路 非常简单的一个v1版本 利用langchain和pdfminer切分pdf文档为k块,设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成,然后利用prompt2对多个摘要进行连贯组合/增删模型可以使…...
![](https://img-blog.csdnimg.cn/img_convert/12b81c0dcfe358fa70f93b754000573a.png)
方案:AI边缘计算智慧工地解决方案
一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python】【数据结构和算法】查找最大或最小的N个元素
除了直接排序,还可以利用heaq模块的nlargest()和nsmallest()方法,例如: >>> nums [3, 5, 2, 4, 1] >>> smallest heapq.nsmallest(3, nums) >>> print(smallest) [1, 2, 3] >>> largest heapq.nlarg…...
![](https://img-blog.csdnimg.cn/e32123a9788a4a7c80632e4a408ce693.png)
C++day1(笔记整理)
一、Xmind整理: 二、上课笔记整理: 1.第一个c程序:hello world #include <iostream> //#:预处理标识符 //<iostream>:输入输出流类所在的头文件 //istream:输入流类 //ostream:输出流类using namespace std; //std&#x…...
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
网站制作商业模式/sem代运营费用
题目大意:有N个点,M条路,如果两条路不连通的话,就将这两条路的距离设置为L 现在要求你求出每两点之间的最短距离和 接着要求 求出炸断 给出的M条路中的一条路后,每两点之间的最短距离和的最大值(翻译来自…...
![](https://yqfile.alicdn.com/fab1a2b29fed9792f06ff13dcd26b21d2de9b3c9.png)
新版wordpress增加备案/一键识图找原图
锤子“坚果手机”发布会因故推迟、PPT一堆错漏、抢红包故障,据悉是因锤子官网服务 器遭遇了数十G流量DDoS恶意攻击,现场PPT也是临时赶制、边写边用。关于DDoS攻击(分布式拒绝服务),Akamai技术公司也发布了二季度的互 联…...
![](https://img2018.cnblogs.com/blog/1732067/201909/1732067-20190921111344454-1723214566.jpg)
做网站用哪里的服务器比较好/百度精准营销获客平台
1、调整状态 最近发生了很多事,很多不好的事,以至于时常状态不在线,没有去调整,会告诉自己都是假的,然后继续低落难过,这些负面影响抛不掉,今天尝试调整 (1)尽量不要去看…...
![](https://images0.cnblogs.com/i/587057/201404/190025051825721.png)
公司网站管理制度/百度学术论文查重官网入口
打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据。 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据。 关键是抓取到网页之后如何获取到想要的数据呢?然…...
![](https://oscimg.oschina.net/oscnet/89fadc78b5b08791d652e204cd70e3912ce.jpg)
怎么做跟别人一样的网站吗/seo网站推广工作内容
2019独角兽企业重金招聘Python工程师标准>>> 条件查询: db.Test_One.find({}) 无条件--查询所有 db.getCollection(Test_One).find({"name": "演员的自我修养","nation":"俄国"})or查询:$or db.getC…...
![](https://img-blog.csdnimg.cn/img_convert/e3c7e867ae52ba5d2fda27bcda8af773.png)
北京住房建设部网站/网建
我在多线程应用程序中使用本地时间我必须用一个线程安全的版本来替换它,我知道这个版本叫做Localtime但是,在执行此操作时,由于链接失败,我无法完成生成我甚至不知道从哪里开始寻找解决方案我的系统组件是:我假设(虽然我不确定)这…...