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 已跟踪(被纳入版本控制)

  1. Unmodified 未修改状态
  2. Modified 已修改状态
  3. 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/local

3.安装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常用注释

 这些注解的作用是让生成的 接口文档效果更好

比如在套餐中加

加之前

 加之后

 

 就有了相应的说明,更加的直观

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/107986.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI模型】gym强化学习仿真平台配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍gym强化学习仿真平台配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&…

202325读书笔记|《花间集评注》——金盏不辞须满酌,海棠花下思朦胧,醉香风。满身香雾簇朝霞。世间屏障,彩笔画娇娆。

202325读书笔记|《花间集评注》——金盏不辞须满酌&#xff0c;海棠花下思朦胧&#xff0c;醉香风。满身香雾簇朝霞。世间屏障&#xff0c;彩笔画娇娆。 花间集评注卷一花间集评注卷二花间集评注卷三花间集评注卷四花间集评注卷五花间集评注卷六花间集评注卷七花间集评注卷八花…

代码随想录第32天|122.买卖股票的最佳时机 II,55. 跳跃游戏 ,45. 跳跃游戏 II

122.买卖股票的最佳时机 II 122. 买卖股票的最佳时机 II 思路比较简单 class Solution {public int maxProfit(int[] prices) {int res0,sum0;for(int i0;i<prices.length-1;i){if(prices[i1]-prices[i]>0){sumprices[i1]-prices[i];}ressum>res?sum:res;}return …

Spring 容器启动耗时统计

为了了解 Spring 为什么会启动那么久&#xff0c;于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…

语言基础篇1——Python概述,Python是什么?Python能干什么?

概述 简介 Python&#xff0c;计算机高级语言&#xff0c;读作/ˈpaɪθən/&#xff08;英音&#xff09;、/ˈpaɪθɑːn/&#xff08;美音&#xff09;&#xff0c;意为蟒蛇&#xff0c;Python的logo为两条缠绕的蟒蛇 特点 Python以开发效率高而运行效率低著称 应用领域…

一键实现 Oracle 数据整库同步至 Apache Doris

在实时数据仓库建设或迁移的过程中&#xff0c;用户必须考虑如何高效便捷将关系数据库数据同步到实时数仓中来&#xff0c;Apache Doris 用户也面临这样的挑战。而对于从 Oracle 到 Doris 的数据同步&#xff0c;通常会用到以下两种常见的同步方式&#xff1a; OGG/XStream/Lo…

加油站抽烟烟火智能识别算法

加油站抽烟烟火智能识别系统通过yoloopencv网络模型图像识别分析技术&#xff0c;加油站抽烟烟火智能识别算法识别出抽烟和燃放烟火的情况&#xff0c;并发出预警信号以提醒相关人员&#xff0c;减少火灾风险。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的…

Linux(多进程与多线程)

目录 1、进程与线程概念 1.1 进程 1.2 线程 1.3 进程与线程区别 2、多进程 2.1多进程概念 2.2 进程相关API 2.3 多进程编程 3、多线程 3.1 多线程概念 3.2 多线程相关API 3.3 多线程编程 1、进程与线程概念 1.1 进程 在计算机科学中&#xff0c;进程是正在执行中…

不同版本.net引用同一个项目

项目文件.csproj文件内容如下&#xff1a; 重点是&#xff1a;不能有其他的 netstandard2;net40;net45;net46;net6 <Project Sdk"Microsoft.NET.Sdk"><PropertyGroup><TargetFrameworks>netstandard2;net40;net45;net46;net6</TargetFrame…

2023.08.27 学习周报

文章目录 摘要文献阅读1.题目2.重点3.引言4.方法5.实验结果6.结论 深度学习Majorization-Minimization算法1.基本思想2.要求3.示意图 总结 摘要 This week, I read a computer science on the prediction of atmospheric pollutants in urban environments based on coupled d…

Spring MVC详解

文章目录 一、SpringMVC1.1 引言1.2 MVC架构1.2.1 概念1.2.2 好处 二、开发流程2.1 导入依赖2.2 配置核心(前端)控制器2.3 后端控制器2.4 配置文件2.5 访问 三、接收请求参数3.1 基本类型参数3.2 实体收参【重点】3.3 数组收参3.4 集合收参 【了解】3.5 路径参数3.6 中文乱码 四…

postgresql 条件表达式

postgresql 条件表达式 简单CASE表达式搜索CASE表达式缩写函数nullif函数示例 coalesce函数 总结 简单CASE表达式 语法如下 case 表达式when 值1 then 结果1when 值2 then 结果2else 默认值 end;select e.first_name , e.last_name , case e.department_id when 90 then 管…

搭建web网站

1.基于域名www.openlab.com可以访问网站内容为welcome to openlab!!! (1).安装所需软件HTTPD、mod_ssl [rootserver ~]# yum install httpd mod_ssl -y 添加域名映射&#xff1a;vim /etc/hosts (2)创建网站目录及网页&#xff0c;修改主配置文件新建openlab目录网站 配置文…

java.lang.NullPointerException: null 不显示异常栈

一、问题 排查线上问题时&#xff0c;发现日志中异常输出的地方&#xff0c;仅有一行java.lang.NullPointerException: null&#xff0c;截图如下。 丢失了具体的异常栈&#xff0c;导致无法定位是哪行代码抛出了异常。 这里排除日志用法的问题&#xff0c;以前是正常能输出异…

Android BatteryManager的使用及BatteryService源码分析

当需要监控系统电量时&#xff0c;用 BatteryManager 来实现。 参考官网 监控电池电量和充电状态 获取电池信息 通过监听 Intent.ACTION_BATTERY_CHANGED 广播实现&#xff0c;在广播接收器中获取电池信息。 这是个粘性广播&#xff0c;即使过了广播发出的时间点后再注册广…

大数据Flink(六十六):Flink的重要概念和小结

文章目录 Flink的重要概念和小结 一、​​​​​​​​​​​​​​数据流图(Dataflow Graph)

尝试自主打造一个有限状态机(二)

前言 上一篇文章我们从理论角度去探索了状态机的定义、组成、作用以及设计&#xff0c;对状态机有了一个基本的认识&#xff0c;这么做有利于我们更好地去分析基于实际应用的状态机&#xff0c;以及在自主设计状态机时也能更加地有条不紊。本篇文章将从状态机的实际应用出发&am…

wazuh环境配置及案例复现

文章目录 wazuh环境配置及案例复现wazuh环境配置 案例复现 wazuh环境配置及案例复现 wazuh环境配置 进入官网下载ova软件 https://documentation.wazuh.com/current/deployment-options/virtual-machine/virtual-machine.html 打开下载的ova&#xff0c;密码和用户名会显示…

sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges

sql developer 连不上oracle数据库 报错 ORA-01031: insufficient privileges 1、问题描述2、问题原因3、解决方法4、sql developer 连接oracle 成功 1、问题描述 使用sys账户以SYSDBA角色登录失败 报错 ORA-01031: insufficient privileges 2、问题原因 因为没有给sys账户分…

【Go 基础篇】Go语言中的defer关键字:延迟执行与资源管理

介绍 在Go语言中&#xff0c;defer 是一种用于延迟执行函数调用的关键字。它提供了一种简洁而强大的方式&#xff0c;用于在函数返回之前执行一些必要的清理操作或者释放资源。defer 的灵活性和易用性使得它在Go语言中广泛应用于资源管理、错误处理和代码结构优化等方面。&…