cgb2010-京淘我的项目Day17

1.JT-SSO零碎搭建

1.1 编辑User POJO

1.2 创立JT-SSO我的项目

1.2.1 新建我的项目

1.2.2 增加继承/依赖/插件

`<?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">    <parent>        <artifactId>jt</artifactId>        <groupId>com.jt</groupId>        <version>1.0-SNAPSHOT</version>    </parent>    <modelVersion>4.0.0</modelVersion>    <artifactId>jt-sso</artifactId>    <dependencies>        <dependency>            <groupId>com.jt</groupId>            <artifactId>jt-common</artifactId>            <version>1.0-SNAPSHOT</version>        </dependency>    </dependencies>    <!--增加插件 有main办法时 须要增加插件-->    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <excludes>                        <exclude>                            <groupId>org.projectlombok</groupId>                            <artifactId>lombok</artifactId>                        </exclude>                    </excludes>                </configuration>            </plugin>        </plugins>    </build></project>

1.2.3 编辑构造代码

1.2.4 编辑UserController

实现jt-sso案例用户拜访测试.

1.2.5 编辑UserService

编辑Service 实现用户信息获取

1.2.6 配置nginx/hosts

要求: 通过sso.jt.com的形式拜访8093服务器.
1.编辑hosts文件

2.编辑Nginx配置文件

3.测试成果

2.用户数据校验

2.1 跨域页面剖析

2.1.1 url剖析

2.1.2 JS剖析

检索页面JS

2.2 用户接口文档阐明

2.3 编辑JT-SSO UserController

`//要求返回的数据都是JSON@RestController@RequestMapping("/user")public class UserController {    @Autowired    private UserService userService;    /**     * 实现用户数据的校验 JT-SSO我的项目     * url地址: http://sso.jt.com/user/check/{param}/{type}     * 参数:    param 校验数据/type 校验类型/callback 回调函数     * 返回值:  SysResult VO对象     data:true数据存在/false 数据不存在能够应用     * 提醒:  该申请是JSONP申请形式,,所以须要特定的格局封装...     */     @RequestMapping("/check/{param}/{type}")     public JSONPObject checkUser(@PathVariable String param,@PathVariable Integer type, String callback){         boolean flag = userService.checkUser(param,type);  //示意数据不存在,能够应用         SysResult sysResult = SysResult.success(flag);         return new JSONPObject(callback, sysResult);     }

2.4 编辑JT-SSO UserService

`package com.jt.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.jt.mapper.UserMapper;import com.jt.pojo.User;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.HashMap;import java.util.List;import java.util.Map;@Servicepublic class UserServiceImpl implements UserService{    private static Map<Integer,String> columnMap = new HashMap<>();    static {        columnMap.put(1, "username");        columnMap.put(2, "phone");        columnMap.put(3, "email");    }    @Autowired    private UserMapper userMapper;    @Override    public List<User> findAll() {        return userMapper.selectList(null);    }    //如果数据库中存在 返回true   不存在false    //如何判断 数据库中是否存在    //type=1 username  type=2 phone  type=3 email    @Override    public boolean checkUser(String param, Integer type) {        //String column = type==1?"username":(type==2?"phone":"email");        String column = columnMap.get(type);        QueryWrapper queryWrapper = new QueryWrapper();        queryWrapper.eq(column,param);        int count = userMapper.selectCount(queryWrapper);//0|1        //return count>0?true:false;        return count>0;    }}

2.5 对于全局异样解决

`package com.jt.aop;import com.fasterxml.jackson.databind.util.JSONPObject;import com.jt.vo.SysResult;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.servlet.http.HttpServletRequest;//定义全局异样的解决机制@RestControllerAdvicepublic class SystemAOP {    /**     * 业务阐明: 因为jsonp跨域调用即便谬误,也应该依照callback(JSON)的形式返回     * 所以应该重构全局异样解决.,对于JSONP返回的问题     * 思路: 因为jsonp调用个别都会携带callback参数 所以能够通过该参数是否存在判断是否为JSONP调用!!!     * @param     * @return     */    @ExceptionHandler({RuntimeException.class})    public Object result(Exception e, HttpServletRequest request){        e.printStackTrace();    //打印谬误日志        String callback = request.getParameter("callback");        if(StringUtils.hasLength(callback)){            //如果callback有值  依照jsonp形式返回            return new JSONPObject(callback, SysResult.fail());        }        return SysResult.fail();    }}

2.6 编辑页面JS

3.HttpClient介绍

3.1 近程调用剖析

3.2 HttpClient介绍

HTTP 协定是 Internet 上应用得最多、最重要的协定之一,越来越多的 Java 应用程序须要间接通过 HTTP 协定来拜访网络资源。尽管在 JDK 的 java net包中曾经提供了拜访 HTTP 协定的基本功能,然而对于大部分应用程序来说,JDK 库自身提供的性能还不够丰盛和灵便。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的反对 HTTP 协定的客户端编程工具包,并且它反对 HTTP 协定最新的版本和倡议。HttpClient 曾经利用在很多的我的项目中,比方 Apache Jakarta 上很驰名的另外两个开源我的项目 Cactus 和 HTMLUnit 都应用了 HttpClient。Commons HttpClient我的项目现已终止,不再开发。 它已被Apache HttpComponents我的项目里的HttpClient和HttpCore模块取代,它们提供了更好的性能和更大的灵活性。 [1]

3.3 HttpClient入门案例

3.3.1 编辑POM.xml文件

 `<!--增加httpClient jar包 -->        <dependency>            <groupId>org.apache.httpcomponents</groupId>            <artifactId>httpclient</artifactId>        </dependency>

3.3.2 入门案例

`package com.jt;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.junit.jupiter.api.Test;import java.io.IOException;public class TestHttpClient {    /**     * 1.实例化HttpClient对象     * 2.定义url地址     * 3.封装申请形式GET/POST/PUT....     * 4.发送申请获取响应的后果.response     * 5.判断响应是否正确. 200示意申请正确,获取响应的后果.     * 6.解析服务器返回值.获取无效数据     */    @Test//在java代码中发动http请    public void testGet() throws IOException {        HttpClient httpClient = HttpClients.createDefault();        String url = "https://www.cctv.com/";        HttpGet httpGet = new HttpGet(url);        HttpResponse httpResponse = httpClient.execute(httpGet);        int status  = httpResponse.getStatusLine().getStatusCode();   //获取状态码        if(status == 200 ){            HttpEntity entity = httpResponse.getEntity();   //获取响应的实体对象            String result = EntityUtils.toString(entity, "UTF-8");            System.out.println(result);        }    }}

3.3.3 对于HttpClient 案例2

需要: 用户通过浏览器网址http://www.jt.com/user/findAll申请,要求获取jt-sso中的所有的用户信息.
提醒: jt-web服务器没有方法间接拜访数据库…
jt-sso服务器能够拜访数据…
jt-web向jt-sso发动申请为http://sso.jt.com/user/findAll

3.3.4 对于httpClient和JSONP阐明

面试题:
问: HTTPClient是跨域申请吗? 不是 就是近程过程调用…

4.微服务思维(服务小型化)

4.1 SOA思维

面向服务的架构(SOA)是一个组件模型,它将应用程序的不同性能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协定分割起来。接口是采纳中立的形式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的零碎中的服务能够以一种对立和通用的形式进行交互。
核心理念: 服务松耦合的思维…

4.2 RPC

RPC是近程过程调用(Remote Procedure Call)的缩写模式。

漫话RPC:
一个阳光明媚的晚上,老婆又在翻看我订阅的技术杂志。

“老公,什么是RPC呀,为什么你们程序员那么多黑话!”,老婆还是判若两人的好奇。
“RPC,就是Remote Procedure Call的简称呀,翻译成中文就是近程过程调用嘛”,我一边看着书,一边掉以轻心的答复着。
“啥?你在说啥?谁不晓得翻译成中文是什么意思?你个废柴,快给我滚去洗碗!”
“我去。。。”,我如梦初醒,我对面坐着的可不是一个程序员,为了不去洗碗,我霎时调动起全副脑细胞,星辰大海在我脑中汇聚,灵感涌现…

“是这样,近程过程调用,天然是绝对于本地过程调用来说的嘛。”
“嗯哼,那先给老娘讲讲,本地过程调用是啥子?”
“本地过程调用,就好比你当初在家里,你要想洗碗,那你间接把碗放进洗碗机,关上洗碗机开关就能够洗了。这就叫本地过程调用。”

“哎呦,我可不干,那啥是近程过程调用?”
“近程嘛,那就是你当初不在家,跟姐妹们浪去了,忽然发现碗还没洗,打了个电话过去,叫我去洗碗,这就是近程过程调用啦”,如许通俗易懂的解释,我真是蠢才!

“哦!我明确了”,说着,老婆开始拾掇包包。
“你这是干啥去哦”
“我?我要出门浪去呀,待会记得接管我的近程调用哦,哦不,咱们要业余点,应该说,待会记得接管我的RPC哦!”

总结:
1.本地过程调用
实现业务时,如果能够调用本人的办法实现.称之为本地过程调用(本人调用本人的办法 同一个服务器中)

`2.近程过程调用    实现业务时,本人的办法不能操作或者没有该性能时,须要调用他人的服务器(办法)来实现业务.(不同的服务器之间的调用)    RPC:不同的服务器之间的调用就是RPC

4.3 微服务的调用思维

微服务思维: 将程序(我的项目)依照分布式的思维进行拆分(SOA),并且能够主动的实现故障的迁徙(服务主动发现机制),无需人为的干涉

4.3.1 传统形式调用

阐明:
1.依照惯例的调用形式,每次减少/缩小服务器时,都须要编辑conf配置文件. 没有发方法实现服务主动的发现(不够智能)
2.只有服务器进行RPC调用都必须通过nginx服务器,.则nginx压力很高

4.3.2 微服务调用思维


步骤:
1.服务启动时,会链接注册核心,将服务数据(服务名称|IP|端口)写入注册核心.
2.注册核心接管用户服务数据之后,动静保护服务列表.
3/4.消费者启动时,链接注册核心,之后将服务列表缓存到本地(缓存到消费者内存中(快)) 不便下次调用.
5.当用户调用服务消费者时.消费者依据以后服务列表的信息,进行负载平衡,筛选其中一个服务进行拜访.
6.注册核心为了保障服务列表的正确性,通过心跳检测机制.实时监控所有服务生产者,如果服务器宕机,则注册核心将第一工夫更新服务列表.并且全网播送 告诉所有的消费者.更新服务列表.
长处:用户每次拜访 简直能够保障拜访的服务器都是正确的.