Nginx是一款轻量级的Web服务区/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是 占有内存少,并发能力强。 https://nginx.org
用于 动静分离(部署静态资源), 反向代理, 负载均衡
1.在linux环境下安装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 -C /usr/local/nginx
4.进入目录:
cd /usr/local/nginx/nginx-1.16.1
5.输入命令:
./configure --prefix=/usr/local/nginx
6.输入命令:
make&&make install
2.Nginx重点目录/文件
conf/nginx.conf: nginx配置文件
html: 存放静态文件(html,css,js等)
logs: 日志目录,存放日志文件
sbin/nginx: 二进制文件,用于启动,停止Nginx服务
3.Ngin常用命令
1.查看Nginx版本:
./nginx -v
2.检查配置文件是否正确:
./nginx -t
3.重新加载配置文件(修改后重新加载才生效):
./nginx -s reload
4.启动nginx
./nginx
5.停止nginx
./nginx -s stop
6.查看nginx进程
ps -ef | grep nginx
4.Nginx配置文件结构
Nginx配置文件整体分为三部分:
全局块: 和Nginx运行相关的全局配置
events块: 和网络连接相关的配置
http块: 代理,缓存,日志记录,虚拟主机配置
注意:http块中可以配置多个Server块,每个Server块中可以配置多个location块。
5部署静态资源
Ngingx可以作为静态web服务器来部署静态资源。静态资源指在服务端真实存在并且能够直接展示的一些文件,比如常见的html页面,css文件,js文件,图片,视频等资源。
相对于Tomcat,Nginx处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到Nginx中, 将静态资源部署到Nginx非常简单,只需将文件复制到Nginx安装目录下的html目录即可。
6.反向代理
正向代理:
是一个位于客户端和原始服务器之间的服务器,为了从原始服务器中取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
典型用途:是为在防火墙内的局域网客户端提供访问Internet的途径。
正向代理一般是在客户端设置代理服务器,通过代理服务器转发请求,最终访问目标服务器。
反向代理:
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源,反向代理服务器负责将请求转发给目标服务器。
用户不需要知道目标服务器的地址,也无需在用户端作任何设定。
配置反向代理:
7.负载均衡
随着互联网的发展,业务越来越大并且业务逻辑也越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多态服务器组成应用集群, 进行性能的水平扩展以及避免单点故障出现。
应用集群:将同一应用部署到多台机器上,组成应用集群,接收负载均衡分发的请求,进行业务处理并返回响应数据。
负载均衡器:将用户请求根据对应的负载均衡算法分发到应用集群中一台服务器进行处理。
负载均衡策略:
小结:
nginx主要作用:
反向代理
负载均衡
内部服务器安全防护(充当内网防火墙)
缓存静态内容(部署静态资源)
8.前后端分离
开发人员同时负责前端和后端代码开发,分工不明确
开发效率低
前后端代码混合在一个工程中,不便于管理
对开发人员要求高,人员招聘困难
前后端分离开发,就是在项目开发过程中,对于前端代码的开发由专门的前端开发人员负责,后端代码则由后端开发人员负责,这样可以做到分工明确,各司其职,提高开发效率,前后端代码并行开发,可以加快项目开发进度。目前,前后端分离开发方式已经被越来越多的公司所采用,成为当前项目开发的主流开发方式。
Swagger接口文档
使用Swagger只需要按照它的规范去定义接口相关的信息,再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档。 https://swagger.io/
knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。
第一步:导入相关依赖
<!--swagger自动生成接口文档-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>Knife4j-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
第二步:导入knife4j相关配置类
@Slf4j
@Configuration
//开启swagger和Knife4j的功能
@EnableSwagger2
@EnableKnife4j
public class WebMvcConfig implements WebMvcConfigurer {
//声明一个Docker类型的bean,通过该bean来指定生成文档的信息
@Bean
public Docket createRestApi(){
// 文档类型
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.itheima.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("瑞吉外卖")
.version("1.0")
.description("瑞吉外卖接口文档")
.build();
}
}
注意:Docket声明时,指定的有一个包扫描的路径,该路径指定的是Controller所在包的路径。
因为Swagger在生成接口文档时就是根据这里指定的包路径,自动地扫描该包下的@Controller,@RestController,@RequestMapping等Spring MVC的注解,依据这些注解来生成对应的接口文档。
第三步:设置静态资源映射
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
注意:由于Swagger生成的在线文档中,涉及很多静态资源,这些静态资源需要添加静态资源映射,否则接口文档页面无法访问。
第四步:如果有拦截或过滤器的话需要放行
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginCheckInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/doc.html")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/swagger-resources")
.excludePathPatterns("/v2/api-docs")
;
}
注意:需要将Swagger及Knife4j相关的静态资源直接a放行,无需登录即可访问,否则就要登录以后才能访问了。
现在可以访问接口文档了。
Swagger常用注解
注解 | 说明 |
@Api | 用在请求的类上,例如:Controller,表示对类的说明 |
@ApiModel | 用在类上,通常是实体类,表示一个返回响应数据的信息 |
@ApiModelProperty | 用在属性上,描述响应类的属性 |
@ApiOperation | 用在请求的方法上,说明方法的用途,作用 |
@ApilmplicitParams | 用在请求的方法上,表示一组参数说明 |
@ApilmplicitParam | 用在@ApilmplicitParams注解中,指定一个请求参数的各个方面 |
@ApiModel("套餐dto对象")
@Data
public class Setmeal implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("套餐关联菜品集合")
private Long id;
.......
@Api(tags = "套餐管理模块")
@RestController
@RequestMapping("setmeal")
public class SetmealController {
@Autowired
private SetmealService setmealService;
@CacheEvict(cacheNames = "setmealCache",key = "#setmealDto.categoryId")
/**
* 套餐新增
* @param setmealDto
* @return
*/
@ApiOperation("套餐新增")
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
setmealService.saveWithDish(setmealDto);
return R.success("保存套餐成功");
}
....
Apifox
更先进的 API 设计/开发/测试工具
Apifox = Postman + Swagger + Mock + JMeter