分布式(十四)

1.SpringBoot整合Redis集群

1.1 编辑redis.properties配置文件

redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005

1.2 编辑配置类

@Configuration 	//我是一个配置类    一般都会与@Bean联用
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
	
	/**
	 * spring整合Redis集群
	 */
	@Value("${redis.nodes}")
	private String redisNodes;
	
	@Bean
	public JedisCluster jedisCluster() {
		Set<HostAndPort> nodeSet = new HashSet<HostAndPort>();
		String[] clusters = redisNodes.split(",");
		for (String cluster : clusters) {	//host:port
			String host = cluster.split(":")[0];
			int port = Integer.parseInt(cluster.split(":")[1]);
			nodeSet.add(new HostAndPort(host, port));
		}
		return new JedisCluster(nodeSet);
	}
}

1.3编辑AOP注入

在这里插入图片描述

1.4页面效果展现

在这里插入图片描述

2.京淘分布式架构-jt-web服务器

2.1 项目架构图设计

在这里插入图片描述

2.2 JT-WEB项目构建

2.2.1 新建项目

在这里插入图片描述

2.2.2 选择打包类型

在这里插入图片描述

2.2.3 添加继承依赖插件

 <parent>
    <groupId>com.jt.vip</groupId>
    <artifactId>jt</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <dependencies>
		<dependency>
			<groupId>com.jt.vip</groupId>
			<artifactId>jt-common</artifactId>
			<version>0.0.1-SNAPSHOT</version>
		</dependency>
	</dependencies>


	<!--3.添加插件 -->
	<!--负责项目打包 更新 maven操作相关的配置 必须添加 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

2.2.4 导入静态资源文件

说明: 将课前资料中的文件 添加到jt-web的项目中.
在这里插入图片描述

2.2.5 编辑主启动类

	/**
 * Failed to configure a DataSource: 'url' attribute is not 
 * specified and no embedded datasource could be configured.
   Reason: Failed to determine a suitable driver class
 * @author pc
 * springBoot项目 特点:开箱即用
 * 该springBoot启动时,不需要添加数据源
 */
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)
public class SpringBootRun {
	
	public static void main(String[] args) {
		
		SpringApplication.run(SpringBootRun.class,args);
	}
}

2.2.6 项目启动测试

在这里插入图片描述

2.2.7 配置nginx实现反向代理

1).修改HOST文件
在这里插入图片描述

2).修改nginx配置文件

#配置前端服务器 www.jt.com:80 转向到http://localhost:8092服务器中
	server {
		listen 80;
		server_name  www.jt.com;

		location / {
			proxy_pass http://localhost:8092;
		}
	}

3).效果展现
在这里插入图片描述

2.2.7 关于JT-WEB服务器发布问题

问题1: 访问http://www.jt.com时,访问报错
问题2: 访问http://www.jt.com时,跳转的是国外的网站

解决方案1: 让谷歌浏览器禁止将http自动的转化为https
在这里插入图片描述

地址栏中输入

chrome://net-internals/#hsts

在这里插入图片描述
键入之后,点击delete,之后清楚缓存,重启浏览器即可.

解决方式2: 如果改完hosts/nginx服务器之后依然跳转国外网站,则需要检查谷歌浏览器是否开启了VPN(翻墙工具)

3.用户数据校验

3.1页面通用跳转

3.1.1关于静态页面访问问题

说明: 浏览器通过网址查询静态页面时,需要在后端服务器中准备固定的页面.才能正确的访问.
在这里插入图片描述

准备页面:
在这里插入图片描述

疑问: 京东家的商品有上千万.如果采用上述的方式进行访问,则必须准备上千万的.html页面,才能实现商品的展现. 这样的方式不合理.

正确的方式: 应该准备一个公共的页面,之后根据商品的ID进行查询.之后在同一个页面中展现不同的商品信息即可.

3.1.2 开启后缀类型匹配

问题:如何能够拦截.html为结尾的请求,之后实现由mvc通过视图解析器实现程序的页面跳转
在这里插入图片描述

解决方案: 添加配置类

	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.1.3 编辑UserController

说明:编辑userController实现用户注册/登录页面跳转.

@Controller
@RequestMapping("/user")
public class UserController {
	/**
	 * 实现用户页面跳转
	 * http://www.jt.com/user/register.html    后端页面register.jsp
	 * http://www.jt.com/user/login.html	        后端页面login.jsp
	 * 重点:为了实现业务功能,拦截.html结尾的请求.
	 */
	
	@RequestMapping("/register")
	public String register() {
		
		//经过视图解析器,跳转指定的页面中
		return "register";
	}
	
	
	@RequestMapping("/login")
	public String login() {
		
		//经过视图解析器,跳转指定的页面中
		return "login";
	}
}

3.1.4 为什么页面以.html结尾

说明: .html结尾的请求更容易被搜索引擎收录.增强网站的曝光率.
倒排索引: 根据关键字检索文件的位置
搜索引擎工作原理:
在这里插入图片描述

3.1.5 伪静态

伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
总结: 以.html为结尾的展现动态页面的技术称之为伪静态.

3.2 创建jt-sso

3.2.1 创建jt-sso项目

在这里插入图片描述

3.2.2 选择jar包

在这里插入图片描述

3.2.3 添加继承/依赖/插件

<parent>
	<groupId>com.jt.vip</groupId>
	<artifactId>jt</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>jt-sso</artifactId>

<dependencies>
	<dependency>
		<groupId>com.jt.vip</groupId>
		<artifactId>jt-common</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</dependency>
</dependencies>

<!--3.添加插件 -->
<!--负责项目打包 更新 maven操作相关的配置 必须添加 -->
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

3.2.4.编辑POJO对象

@TableName("tb_user")
@Data
@Accessors(chain = true)
public class User extends BasePojo{
	
	@TableId(type = IdType.AUTO)
	private Long   id;
	private String username;
	private String password;		//密码加密处理
	private String phone;			//电话
	private String email;			//邮箱	
}

3.2.4.构建JT-SSO代码

在这里插入图片描述

3.2.5 编辑nginx配置文件

说明:要求 用户通过sso.jt.com的方式访问服务器localhost:8093

#配置前端服务器 sso.jt.com:80 转向到http://localhost:8093服务器中
server {
	listen 80;
	server_name  sso.jt.com;

	location / {
		proxy_pass http://localhost:8093;
	}
}

3.3 跨域实现

3.3.1 跨域访问测试

案例1:
页面网址:http://manage.jt.com:80/test.html
ajax请求: http://manage.jt.com:80/test.json
结论: 当请求协议://域名:port端口号都相同时 访问正常的.

案例2:
页面网址: http://www.jt.com:80/test.html
ajax请求: http://manage.jt.com:80/test.json
结论: 当浏览器的地址与ajax地址不同时,请求不能正常执行.

3.3.2 同源策略说明

说明:浏览器在发起AJAX请求时,必须遵守同源策略的规定.否则数据无法正常解析.
策略说明: 发起请求时,必须满足 协议://域名:端口都相同(和当前页面对比)时.满足同源策略要求.浏览器可以正确的发起请求,并且解析结果.,
但是如果上述的三项中有一项不同,则表示跨域访问.浏览器不予解析返回值结果.
在这里插入图片描述

例题: 问http://manage.jt.com/test.html 和http://localhost:8091/test.json 能否通信?
答案: 不能通信 1)域名不一致 2)端口不同

3.3.3 什么是跨域

定义: 当浏览器解析ajax时,ajax发起请求的地址如果与当前页面所在的地址违反同源策略时,则称之为跨域(请求)

3.4 JSONP(难)

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

3.4.1 JSONP跨域实现原理

1).利用javascript中的src属性实现跨域

<script type="text/javascript" src="http://manage.jt.com/test.json"></script>

2).自定义回调函数 function callback(){}

function hello(data){
		alert(data.name);
	}

3).将返回值结果 进行特殊的格式封装 callback(JSON数据)

hello({"id":"1","name":"tomcat猫"})

3.4.2 jQuery实现JSONP跨域访问

3.4.2.1 编辑html页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSONP测试</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
	$(function(){
		alert("测试访问开始!!!!!")
		//网页位置: www.jt.com/JSONP.html
		$.ajax({
			url:"http://manage.jt.com/web/testJSONP",
			type:"get",				//jsonp只能支持get请求  不支持post,因为src支持get
			dataType:"jsonp",       //dataType表示返回值类型  如果是跨域访问,则必须添加jsonp
			//jsonp: "callback",    //指定参数名称
			//jsonpCallback: "hello",  //指定回调函数名称
			success:function (data){   //data经过jQuery封装返回就是json串
				alert(data.id);
				alert(data.name);
				//转化为字符串使用
				//var obj = eval("("+data+")");
				//alert(obj.name);
			}	
		});	
	})
</script>
</head>
<body>
	<h1>JSON跨域请求测试</h1>
</body>
</html>

3.4.2.2 页面url分析

在这里插入图片描述

3.4.2.3 编辑JSONPController

说明: 在jt-manage中添加JSONPController.实现跨域访问

@RestController
public class JSONPController {
	
	/**
	 * url:http://manage.jt.com/web/testJSONP?callback=jQuery111107990405330439474_1595323762313&_=1595323762314
	 * @return JSONPObject 专门负责封装JSONP的返回值结果的.
	 * 注意事项:  返回值结果必须通过特殊的格式封装    callback(JSON数据)
	 */
	@RequestMapping("/web/testJSONP")
	public JSONPObject jsonp(String callback) {
		
		//准备返回数据
		User user = new User();
		user.setId(100L).setPassword("我是密码");
		return new JSONPObject(callback, user);
	}
	
	
}

3.4.2.4 JSONP服务器返回值

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值