欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

程序员文章站 2022-07-10 11:17:21
...

分布式思想编写项目: 直接将整个web前端服务器单独拿出来,然后通过RPC远程过程调用(面向服务编程)调用服务端,实现跨系统,跨域访问,降低项目之间的耦合 --大项目要这样,小项目貌似不需要,这样会降低性能! --项目追求目标–高效,低耗!!!

由浅入深:JsonP/CORS(跨域请求)–HttpClient–Dubbo–微服务SpringCloud(貌似任何微服务的问题这里都能解决!!)

关于跨域的说明 –只是在一个网址下发送另一个网址的ajax请求叫跨域!!! 其他如重定向等不叫跨域!!
说明:
浏览器在解析ajax时,如果发现请求的协议名称://请求的域名:请求的端口号网址的地址都相同的时满足同源策略的规定,浏览器可以正确的解析返回值.该访问称之为同域访问.该策略叫做同源策略.
但是如果违反了同源策略中的任意一条,则叫做跨域访问.浏览器出于安全性的考虑.不予解析返回值(请求正常的被处理,但是接收不到返回值).
例如:
测试1: 同服务器测试
1.浏览器的网址信息: http://manage.jt.com/test.html
2.ajax请求的地址信息: http://manage.jt.com/test.json
发现: 请求协议名称://域名:端口号都相同时,请求可以正常进行.
测试2: 不同的服务器测试
1.浏览器的网址信息: http://www.jt.com/test.html
2.ajax请求的地址信息: http://manage.jt.com/test.json
结论: 域名地址不相同时请求不能正常获取响应的结果. --在http://www.jt.com/test.html这个网址下发送另一个域名**(违反同源策略的ajax请求)**的ajax请求
概括: 浏览器解析ajax时,由于请求违反了同源策略则称之为跨域请求.
细说:就是在该网址下发送了跨域请求后(违反同源策略的另一个网址的ajax请求后)对方服务器是能接收到请求的!!并且能响应了该请求返回了数据!!!只是自己这边客户端/WEB端浏览器不予解析!!!
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

=开始正题 1 JSONP实现跨域请求
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。
1 javaScript中的src属性不受同源策略的约束.可以获取远程服务器数据.

<!--该json一直保存到浏览器中等待调用,但是没有函数名称无法调用  -->
	<script type="text/javascript" src="http://manage.jt.com/test.json"></script>

2 只能自定义回调函数来接收获取src获取到的json 名称任意

/*定义回调函数  */
		function hello(data){
			alert(data.name);
		}

3 那服务端只能将数据做一步封装在JSON对象外面加上函数名称与括号,**名称()**将返回值结果进行特殊的格式封装 客户端/Web端的请求回调函数 名称(JSON); –服务端与客户端/Web端的函数名称一致才行…否则还是用不了src返回的json数据!!!

<!--  将该网址http://manage.jt.com/test.json下的返回值进行特殊封装     名称(Json对象)  -->
hello({"id":"1","name":"tomcat猫"})

以上为jsonp的引入,下面是项目中jsonp的应用
1 JSONP的Ajax调用 --在www.jt.com网址下ajax请求manage.jt.com域名下的网址

<script type="text/javascript">
/*$(){}结构必然是jQuery函数类库导入后才能正确执行*/
	$(function(){
		alert("测试访问开始!!!!!")
		$.ajax({
			url:"http://manage.jt.com/web/testJSONP",
			type:"get",				//jsonp只能支持get请求 src只能是get请求
			dataType:"jsonp",       //dataType表示返回值类型  --jsonp请求必须指定该类型!!!!
			//jsonp: "callback",    //指定参数名称    --不指定该参数时默认即为callback!!!  --jsonp: 回掉函数名的参数名,默认callback,服务端通过它来获取到回掉函数名,使用jsonp这种类型的话,会创建一个查询字符串参数 callback=?拼接到url地址中,这个参数会加在请求的URL后面,并且这个参数的值(?这一部分就是下面的jsonpCallback的回调函数名称!!)--另外服务器端应当在JSON数据前加上回调函数名(就是下面的指定jsonpCallback或者不指定就是随机生成的,如:jsonp1294734708682),以便完成一个有效的JSONP请求。
			//jsonpCallback: "hello",  //指定回调函数名称  --若该参数指定则最后url请求是这样的http://manage.jt.com/web/testJSONP?callback=hello...大约这个样子,callback是参数名称(服务端通过它接受该参数值),jsonCallback是回调函数名称
			success:function (data){   //data经过jQuery封装返回就是json串  --貌似没有指定回调函数名默认是随机生成的,浏览器会自动生成,这里会自动解析..暂时不研究,因为这里用不到...反正就是指定了回调函数名,别的地方用的时候就用指定的回调函数名即可!!
				alert(data.itemId);
				alert(data.itemDesc);
			}
		});	
	})
</script>

2 编辑后台Controller返回数据(服务器与客户端交互的数据貌似一般都是Json或者String…而这里返回值是将json特殊封装后的String类型–因为做了字符串拼接callback参数的值即回调函数的名称+json!!…但是核心数据还是必须是Json!!) --manage.jt.com域名下的网址的controller

package com.jt.web.controller;
@RestController
public class JSONPController {
    /**
     * 测试跨域访问是否成功
     * url地址: http://manage.jt.com/web/testJSONP?callback=jQuery111106536880527642785_1600138715329&_=1600138715330  //最后面的&_=1600138715330是jsp中额外加的毫秒值,由于浏览器内部有缓存机制,所以如果遇到了一个相同的请求地址,浏览器可能会使用之间的结果.(使用缓存),但是有些数据必须要求浏览器重数据库中动态获取数据,为了避免浏览器缓存一般在url最后添加随机数或者时间毫秒数区分url请求.实现该功能.
     * 返回值的应该是经过特殊格式封装的数据.  callback(JSON)
     */
    @RequestMapping("/web/testJSONP")
    public String  jsonp(String callback){
        ItemDesc itemDesc = new ItemDesc();
        itemDesc.setItemId(100L).setItemDesc("跨域测试成功!!!!");
        String json = ObjectMapperUtil.toJSON(itemDesc);
        return callback+"("+json+")";  //这里返回值为json特殊封装后的值  --回调函数名称jQuery111106536880527642785_1600138715329+json  //客户端浏览器自动生成的会点函数名称,它也会自动解析该名称的!!
    }
}

2 这一步上面自己手动封装有点low直接用JSONPObject对象封装

/** JSONPObject参数说明:
     *  1.function 回调函数名称
     *  2.返回的对象之后可以自动被转化为JSON!!!
     */
    @RequestMapping("/web/testJSONP")
    public JSONPObject jsonp(String callback){
        ItemDesc itemDesc = new ItemDesc();
        itemDesc.setItemId(100L).setItemDesc("API测试!!!");
        return new JSONPObject(callback, itemDesc);
    }

=正题 2 CORS实现跨域请求 – 这个貌似更好用!!!
CORS跨域说明
说明:当下的主流的浏览器默认支持cors跨域的形式,但是需要服务器添加响应的信息.否则浏览器不支持数据的获取.
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
服务器分布式简图:
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

===代码=
1 jt-common中添加编辑CORS配置类 --貌似若不放在通用项目下,直接放在业务服务端就行因为虽然是web服务端发出的ajax跨域请求,但是必须是业务服务端在响应信息中标识允许跨域访问才行,这样web服务器端浏览器才能解析…貌似是这样

package com.jt.config;
@Configuration  //指明这是一个配置类
public class CORSConfig implements WebMvcConfigurer {
    /**
     * 实现跨域的方式
     * 需要配置服务端程序
     * 方法说明:
     *      1.addMapping(/**) 允许什么样的请求可以跨域  所有的请求--貌似这样在响应信息中就会添加上相应的允许跨域的信息,客户端浏览器就可以正常解析了json返回值了
     *      2.allowedOrigins("*")可以允许任意的域名
     *      3.allowCredentials(true) 跨域时是否允许携带cookie等参数
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowCredentials(true);
    }
}

2 跨域测试 京淘单点登录系统 --域名sso.jt.com
JT-SSO项目作用:主要为jt-web的服务器提供用户的数据的支持,但凡涉及到user的CRUD操作都应该由该系统完成.
打包方式: jar包程序
注意事项: 继承jt/ 依赖jt-common 添加插件.
端口号: 8093

jt-web中 注册:url地址http://www.jt.com/user/register.html
登录的url地址:http://www.jt.com/user/login.html

  1. 编辑UserController
package com.jt.controller;
@Controller //由于设计到页面跳转功能.
@RequestMapping("/user")
public class UserController {
    /**
     * 通用页面跳转实现
     * 1.http://www.jt.com/user/login.html       login.jsp页面
     * 2.http://www.jt.com/user/register.html    register.jsp页面
     */
    @RequestMapping("/{moduleName}")
    public String module(@PathVariable String moduleName){
        return moduleName;
    }
}

创建JT-SSO项目
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

  1. 编辑pom.xml配置文件 --聚合项目就记住了添加继承(父级工程),依赖(通用工程)和插件(build – plugin)
<?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-sso</artifactId>
  <!--添加继承项-->
    <parent>
        <artifactId>jt</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <!--添加依赖项-->
    <dependencies>
        <dependency>
            <groupId>org.example</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>
</project>
  1. 编辑User的POJO对象
@TableName("tb_user")
@Data
@Accessors(chain = true)    //貌似只有vo对象需要添加无参构造和有参构造
public class User extends BasePojo{
    @TableId(type = IdType.AUTO)    //主键自增
    private Long id;
    private String username;    //用户名
    private String password;    //密码
    private String phone;       //电话
    private String email;       //邮箱 由于email暂时没有使用电话代替
}

JT-SSO代码结构
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
3) 编辑hosts文件及Nginx实现反向代理

#搭建jt-sso服务器
	server {
		listen 80;
		server_name sso.jt.com;

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

===开始sso单点登录正式项目代码
1)页面js分析

$.ajax({  //废弃的 escape() 方法生成新的由十六进制转义序列替换的字符串. 使用 encodeURI 或 encodeURIComponent 代替.
     url : "http://sso.jt.com/user/check/"+escape(pin)+"/1?r=" + Math.random(),
            	dataType : "jsonp",
            	success : function(data) {      //状态信息:200 成功   状态信息:201 失败
                    checkpin = data.data?"1":"0";
                    if(data.status == 200){
                        if (!data.data) {
                            validateSettings.succeed.run(option);
                            namestate = true;
                        }else {
                            validateSettings.error.run(option, "该用户名已占用!");
                            namestate = false;
                        }
                    }else{
                        //标识后台服务器运行异常
                        validateSettings.error.run(option, "服务器正忙,请稍后!!!(我后台报错了我也不知道啥错!!!)");
                        namestate = false;
                    }
                }
          });       	
  1. 一般公司都有word文档说明 -文档分析
    6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
  2. 编辑jt-sso的UserController
package com.jt.controller;
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("/findAll")
    public List<User> findAll(){
        return userService.findAll();
    }
    /**
     * JSONP的跨域请求  特殊的格式封装.....
     * 需求分析:校验用户的数据是否可用.  -- 失焦时函数...检查该次用户的注册信数据库里是否重复..重复则返回false,js中会在浏览器页面显示该用户已存在..
     * url: http://sso.jt.com/user/check/{param}/{type}
     * 参数: param/type
     * 返回值结果: SysResult对象
     */
    @RequestMapping("/check/{param}/{type}")
    public JSONPObject chcekUser(@PathVariable String param,
                                 @PathVariable Integer type,
                                 String callback){
        //根据信息查询数据库获取响应记录
        Boolean flag = userService.checkUser(param,type);
        return new JSONPObject(callback, SysResult.success(flag));
    }
}
  1. 编辑jt-sso的UserService
package com.jt.service;
@Service
public class UserServiceImpl implements  UserService{
    private static Map<Integer,String> paramMap = new HashMap<>();  //利用map集合封装客户端浏览器发来的三种数字类型对应pojo中的三个属性..  
    static {
        paramMap.put(1, "username");
        paramMap.put(2, "phone");
        paramMap.put(3, "email");
    }
   @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }
    /**
     * 校验数据是否存在即可. 查询总记录数即可.
     * @param param   需要校验的数据
     * @param type    校验的类型 1username 2phone 3 email 6789910
     * @return
     */
    @Override
    public Boolean checkUser(String param, Integer type) {
        String column = paramMap.get(type);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(column, param);
        //boolean flag = userMapper.selectCount(queryWrapper)>0?true:false;  //返回false表示数据库没有该注册用户,表示该当前用户可以用此名字注册!!
        return userMapper.selectCount(queryWrapper)>0;
    }
}
  1. 修改全局异常处理机制 --因为异常也是需要返回给客户端所以为@RestController,又因为该异常处理属于aop拦截了所有controller类的异常所以加注解@Advice最后合并为**@RestControllerAdvice**
package com.jt.aop;
@RestControllerAdvice   //作用: 标识我是一个通知方法,并且只拦截Controll层的异常.并且返JSON.
public class SysResultException {
    //需要定义一个全局的方法 返回指定的报错信息.
    //ExceptionHandler 配置异常的类型,当遇到了某种异常时执行该方法.
    //JSONP的异常处理应该是 callback({status:201,msg:"",data:""})
    //利用Request对象动态获取callback参数.之后动态封装返回值
    @ExceptionHandler(RuntimeException.class)
    public Object exception(Exception e, HttpServletRequest request){
        e.printStackTrace();
        String callback = request.getParameter("callback");
        if(!StringUtils.isEmpty(callback)){ //若callback不为空则该请求为jsonp请求,执行以下代码返回jsonp类型数据
            return new JSONPObject(callback, SysResult.fail());
        }
           //日志记录/控制台输出. 让程序员知道哪里报错!!!
        return SysResult.fail();
    }
}

========上面是jsonp和cors的两种跨域请求,下面才是到了正宗的微服务RPC远程过程调用HttpClient–Dubbo–SpringCloud

微服务框架介绍

浏览器解析ajax发起跨域请求.程序虽然可以正确的调用,但是浏览器可以监控用户的所有的参数及返回值.在一些特定的条件下该操作不安全.
一般使用跨域的请求都是用来获取其他服务器的数据(查询操作),如果遇到了POST需要提交的参数应该使用更加安全的请求方式实现. --HttpClient–Dubbo–SpringCloud
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

====代码
HttpClient入门案例

  1. 添加依赖
<!--添加httpClient jar包 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

2)test测试

package com.jt.test;
public class TestHttpClient {
    /**
     * 步骤:
     *  1.实例化httpClient工具API
     *  2.定义请求url地址  任意网络地址....
     *  3.定义请求的类型  get/post/put/delete
     *  4.发起请求,获取响应的结果
     *  5.判断响应的状态码信息.  200 404 500 406 400....
     *  6.动态解析返回值执行后续操作.
     */
    @Test
    public void test01(){
        HttpClient httpClient = HttpClients.createDefault();  //通过HttpClients来获取HttpClient对象
        String url = "https://www.baidu.com/";   //1 指定远程调用的url  --这个示例调用baidu只是获取网页上的信息
        HttpGet get = new HttpGet(url);   //2 指定请求类型 
        try {
            HttpResponse httpResponse = httpClient.execute(get);  //3 通过httpClient对象执行请求
            //判断状态码是否正确
            int statusCode = httpResponse.getStatusLine().getStatusCode();
            if(statusCode == 200){
                //表示请求正确
                HttpEntity httpEntity = httpResponse.getEntity(); //获取服务器的全部响应信息(json/html/xml/xxxx)
                String result = EntityUtils.toString(httpEntity,"UTF-8");  //利用EntityUtils工具API将获取的响应信息httpEntity转化为字符串....并且指定了字符集类型 --这只是个HttpClient测试,貌似没啥用..
                //获取之后可以执行业务处理......
                System.out.println(result);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

======HttpClient应用的真正的项目代码=
需求说明:
需求:根据userId查询用户的信息.
1.用户的url地址: http://www.jt.com/findUserById/7;
2.需要在jt-web的Controller中动态的接收数据.将请求转给sso单点登录系统
url:http://sso.jt.com/findUserById/7
3.在jt-sso中的Controller根据userId查询用户信息. --后面直接就web端写controller,在服务端写service和mapper即可

  1. 编辑jt-web Controller
/**
     * 为了测试httpClient 实现业务功能查询用户信息
     * url地址:http://www.jt.com/user/findUserById/7
     * 参数:  7用户ID
     * 返回值: user对象
     */
    @RequestMapping("/findUserById/{userId}")
    @ResponseBody
    public User findUserById(@PathVariable Long userId){
        return userService.findUserById(userId);
    }
  1. 编辑前端 Service
@Service
public class UserServiceImpl implements UserService{
    /**
     * 由jt-web向jt-sso进行数据的请求.之后获取数据.
     * @param userId
     * @return
     */
    @Override
    public User findUserById(Long userId) {
        //1.定义url地址
        String url = "http://sso.jt.com/user/findUserById/"+userId;
        HttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse httpResponse = httpClient.execute(httpGet);
            if(httpResponse.getStatusLine().getStatusCode() == 200){
                HttpEntity httpEntity = httpResponse.getEntity();
                //将json转化为user对象返回给congtroller后返回给客户端
                String result = EntityUtils.toString(httpEntity, "UTF-8");  //解析出来是json格式的类型
                return ObjectMapperUtil.toObject(result, User.class);
            }else{
                throw new RuntimeException("请求失败,请校验地址信息");
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}
  1. 编辑后端服务器 Controller
 /**
     * 测试httpClient调用方式
     * url地址: http://sso.jt.com/user/findUserById/"+userId
     * 返回:  user对象的JSON数据Web服务器端再将json格式对象解析为User对象即可--服务器之间的数据传输一般都要用Json!!!  aaa@qq.com/@ResponseBody 
     */
    @RequestMapping("/findUserById/{userId}")
    public User findUserById(@PathVariable Long userId){
        return userService.findUserById(userId);
    }
  1. 编辑后端 Service
@Override
    public User findUserById(Long userId) {
        return userMapper.selectById(userId);
    }

HttpClient调用流程图
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

篇幅太大一篇里面写不完跨域请求JsonP/Cors和远程过程调用(微服务面向服务编程)HttpClient–Dubbo–SpringCloud,下一篇再开始写Dubbo框架!!!

放到前面去的程序,因为不重要…没什么代码就放在后面了,重要代码引入放在了前面
项目示例:
web项目创建说明
1.端口号: 8092
2.域名: http://www.jt.com
3.web服务器不需要链接数据库. --后期微服务中web只写controller,远程端的服务器只写service和mapper连接数据库即可!!
4.打包: war (JSP页面)
5.注意事项: 继承父级jt/依赖工具API jt-common配置maven插件.
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

==开始项目=
1 pom文件添加继承/依赖/插件

<?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>
    <!--设定打包方式 默认是jar包不需要写web的war包及父级的pom包必须写!!!-->
    <packaging>war</packaging>

    <!--添加继承-->
    <parent>
        <artifactId>jt</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!--添加依赖项-->
    <dependencies>
        <dependency>
            <groupId>org.example</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>
</project>

2 前端的html,css,js,jquery,jsp,easyUI等等就不展示了,还是比较喜欢写后端
3 配置项目启动项 – 貌似在idea中项目中的启动项都需要配置一下,否则页面报404 为啥后面的测试项目里都不需要配置这个也可以页面直接访问…后面再研究,反正先都配置上即可…
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
注意:SpringBoot特点: 开箱即用,由于jt-web继承jt所以web服务器启动时,会加载数据源的自动化配置(spring-boot-starter-jdbc,mybatis-plus-boot-starter).但是由于web不需要链接数据库所以yml文件里没有连接数据库的配置,所以导致程序异常,报错…
方案:
***在启动类上添加注解属性(exclude=DataSourceAutoConfiguration.class)***排除数据源自动配置即可!!
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
4 若使用不存在的域名(没花钱买的…)需要配置hosts系统文件,配置好之后nginx中实现服务器反向代理(域名映射到具体的服务项目)即可!!
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud

#搭建jt-web服务器
	server {
		listen 80;
		server_name www.jt.com;

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

==
小料:
1 谷歌浏览器禁用https
浏览器键入 chrome://net-internals/#hsts
6 项目解析1--项目前台搭建RPC远程调用 --JsonP/CORS(这俩是跨域请求)--后面的是微服务的远程调用HttpClient--Dubbo--微服务SpringCloud
2 搜索引擎工作原理:–倒排索引: 根据关键字检索文章的位置.
一般搜索引擎只能检索静态页面信息不能检索.jsp等动态的页面结构,所以一般为了提高网站的曝光率,使得商品更加容易的被用户检索,所以一般的商品页面都是.html的.
伪静态
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。–(貌似就是在例如jsp页面名称的后面加上后缀.html后伪装为静态页面方便了搜索引擎的检索记录,并且我们的服务器端可以设置拦截到.html文件后直接跳转到对应名称的jsp页面文件…)
概括: 以.html结尾的"动态页面"脚本技术. (.JSP/.html)
3 在高并发的条件下由于引入缓存,但是可能会引发如下的问题,导致数据库服务器宕机,影响用户的体验
缓存-穿透
特点: 用户高并发的环境下,访问一个数据库中不存在的数据就叫缓存穿透!!!–因为数据库里没有,所以缓存中肯定没有,所以不走缓存会直接一直访问数据库,数据库一直查询搜索查询
解决方案: 限制用户单位时间内的访问次数 , 封禁IP地址. 网关过滤.
缓存-击穿
特点: 某些高频的访问数据由于操作不当导致缓存失效.从而使得大量的用户直接访问数据库. (一个)–缓存中之前有,但是不小心删掉没了,而使大量访问瞬间直接访问冲击数据库
解决方案: 配置多级缓存
缓存-雪崩
特点: 由于redis中的高频key在同一时间内大量的失效.导致用户的请求直接访问数据库,导致宕机的风险. (flushAll)
解决方案: 配置多级缓存,设定不同的超时时间.

==开始编写项目代码=
1 编辑配置类:目的:springMVC可以拦截以.html为结尾的请求.

@Configuration					//配置web.xml配置文件
public class MvcConfigurer implements WebMvcConfigurer{
	
	//开启匹配后缀型配置,为了实现静态页面的跳转而准备的  --这里,没有设置.html而是直接拦截所有的后缀类型后跳转到对应名称的jsp文件..
	@Override
	public void configurePathMatch(PathMatchConfigurer configurer) {
		
		configurer.setUseSuffixPatternMatch(true);
	}
}