1. 关于Redis缓存
1.1 什么是缓存穿透
说明:在高并发情况下,用户大量访问缓存不存在的数据,称之为缓存穿透
如何解决:
-通过IP限流(即单位时间内IP请求次数)
-布隆过滤器
1.1.1 布隆过滤器
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
1.1.2 布隆过滤器算法
1.1.3 算法优化
.说明:由于hahs碰撞带来的问题.所以需要对算法进行优化 降低hash碰撞的概率.
解决方案:
- 增加二进制向量的位数. 8/16/32/1024…
- 增加hash函数的个数.
总结: 适当的增加二进制向量的位数和hash函数个数,可以有效的降低hash碰撞的概率
1.2 什么是缓存击穿
说明:由于某个热点数据在缓存中失效,导致大量的用户直接访问数据库,导致数据库宕机
如何处理:采用多级缓存
1.3 什么是缓存雪崩
说明:由于大量的数据在缓存中失效,导致用户访问缓存的命中率低,则大量用户直接访问数据库。
如何处理:
1. 采用多级缓存
2. 设定超时时间不相同
2.京淘前台搭建
2.1 前台搭建说明
说明:根据规则实现前后端分离(业务分离)的操作,前端服务器只负责数据的页面展现,后端服务器负责数据的提取,前后端数据传输时一般采用Json方式返回。
2.2 搭建京淘前台(JT-WEB)
2.2.1 创建项目
2.2.2 导入pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>jt-web</artifactId>
<parent>
<artifactId>jt</artifactId>
<groupId>com.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--动态web资源暂时打包为war-->
<packaging>war</packaging>
<!--添加依赖-->
<dependencies>
<dependency>
<groupId>com.jt</groupId>
<artifactId>jt-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--跳过测试类打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2.3 导入静态资源src包
2.2.4 启动类报错提示
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
/**
* 由于继承了jt项目pom.xml的依赖包,基于开箱即用规则,默认记载依赖
* exclude=DataSourceAutoConfiguration.class 排除数据源启动
*/
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)//排除数据源启动
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class,args);
}
}
2.2.5 解决404报错问题
2.3 实现域名反向代理
2.3.1 遍历nginx配置文件
# 配置前台服务器
server{
listen 80;
server_name www.jt.com;
location / {
proxy_pass http://localhost:8092;
#proxy_pass http://jtWindows;
}
}
2.3.2 编辑host文件
2.3.4 启动nginx反向代理服务器
2.4 关于https转化问题
说明:由于浏览器处于安全性的考虑,将http协议规范动态转化为https协议规范,由于没有购买域名,所以无法使用。
如何解决:
输入网址:chrome://net-internals/#hsts:
按照下图操作即可
2.5 关于伪静态
2.5.1 伪静态简介
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结:
1. 搜索引擎只对静态页面友好,增加搜索曝光率(搜索引擎工作原理)
2. 静态页面损失动态页面效果
3. 伪静态是将动态页面实现以.html结尾的动态页面技术(欺骗浏览器)
2.5.2 搜索引擎工作原理
倒排索引:用关键字检索文章位置
2.5.3 实际应用场景
springMVC中默认拦截的都是前缀型请求:http://www.jt.com/index 视图解析器
springMVC中如果遇到后缀型请求不拦截:http://www.jt.com/index.html 找具体页面
2.5.4 实现伪静态
说明:使用springMVC拦截后缀型请求
实现过程:
1. controller跳转
2. 编辑配置类,开启后缀类型匹配
package com.jt.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MvcConfigurer implements WebMvcConfigurer{
//开启匹配后缀型配置
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(true);
}
}
3. 跨域业务说明
3.1 通用页面跳转
http://www.jt.com/user/login.html
http://www.jt.com/user/register.html
利用一个Controller的方法实现页面的统一跳转
package com.jt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import sun.security.pkcs11.Secmod;
@Controller
@RequestMapping("/user")
public class UserController {
/**
* 实现页面通用跳转
*/
@RequestMapping("/{model}")
public String model(@PathVariable String model){
return model;
}
}
3.2 跨域测试
3.2.1 同域测试
域名地址:http://manage.jt.com/test.html
Ajax地址:http://manage.jt.com/test.json
测试发现:协议|域名|端口号相同时,可以相互通信
3.2.2 跨域测试
域名地址: http://www.jt.com/test.html
Ajax地址: http://manage.jt.com/test.json
测试发现: 如果域名不相同时,无法实现远程的访问
3.2.3同源策略说明
说明: 浏览器出于安全性的考虑要求发起Ajax时,必须满足同源策略的规定.
要求: 1.协议名称相同 http/https
2.域名相同
3.端口号相同
如果上述的3条违反任意的一条即违反了同源策略.称之为跨域访问. 反之为同域访问
3.3 JSONP
3.3.1 JSONP介绍
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的
3.3.2 JSONP跨域原理说明
步骤:
1. 利用javaScript中的src属性,实现跨域
2. 自定义回调函数
3. 将返回值结果进行特殊的格式封装:callback(json)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript">
/*JS是解释执行的语言 */
/*定义回调函数 */
function hello(data){
alert(data.name);
}
</script>
<!--该json一直保存到浏览器中等待调用,但是没有函数名称无法调用 -->
<script type="text/javascript" src="http://manage.jt.com/test.json"></script>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
</head>
<body>
<h1>JS跨域问题</h1>
</script>
</body>
</html>
3.3.3 JSONP的API学习
- 编辑页面,发起跨域请求
- 编辑JSONPController
- 使用JSONP高级API
3.4 CORS
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
3.4.1 CORS工作原理
说明:在服务器中添加响应头信息.告知客户端 程序可以正常执行
3.4.2 CORS使用说明
- 客户端支持CORS
- 配置服务器端
4. 单点登录系统
4.1 创建项目
4.1.1 创建项目
4.1.2 添加继承/依赖/插件
<parent>
<artifactId>jt</artifactId>
<groupId>com.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>jt-sso</artifactId>
<!--添加依赖 jt-common-->
<dependencies>
<dependency>
<groupId>com.jt</groupId>
<artifactId>jt-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<!--添加插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4.1.4 编辑User POJO
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{
@TableId(type = IdType.AUTO)//设定主键自增
private long id;//id用户信息
private String username;//用户名
private String password;//密码
private String phone;//电话号码
private String email;//邮箱,暂时用电话号码代替
}
4.1.5 编辑UserMapper接口
package com.jt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.User;
public interface UserMapper extends BaseMapper<User> {
}
4.2 SSO案例
需求:通过http://sso.jt.com/findUserAll 获取全部的user的JSON数据.
4.2.1 编辑Controller
package com.jt.controller;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.jt.service.UserService;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findUserAll")
public List<User> findAll(){
return userService.findAll();
}
}
4.2.2 编辑Service以及ServiceImpl
package com.jt.service;
import com.jt.pojo.User;
import java.util.List;
public interface UserService {
List<User> findAll();
}
package com.jt.service;
import com.jt.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jt.mapper.UserMapper;
import java.util.List;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.selectList(null);
}
}
4.2.3 nginx的配置文件配置
#配置单点登录服务器
server {
listen 80;
server_name sso.jt.com;
location / {
proxy_pass http://localhost:8093;
}
}