关于java:第四阶段day17

6次阅读

共计 4703 个字符,预计需要花费 12 分钟才能阅读完成。

day17

1.JSONP 全局异样解决机制
问题阐明:当后端服务器执行出错时, 会执行全局异样的解决, 然而 JSONP 的申请的调用要求 返回值类型 callback(JSON)构造 所以须要重构全局异样解决的返回值构造类型
代码如下
//@ControllerAdvice // 拦挡 controller 层
//@ResponseBody
@RestControllerAdvice // 定义全局异样的解决类 AOP= 异样告诉
public class SystemAOP {

/**
 *  定义全局异样的办法  当遇到了什么异样时, 程序开始执行   参数个别 class 类型
 *  如果一旦产生异样, 则应该输入异样的信息, 之后返回谬误数据即可.
 *
 *  解决跨域全局异样解决的规定: 京淘我的项目的跨域都是应用 JSONP.   http://xxxx?callback=xxxxx
 *  如果申请中携带了 callback 参数 则认为是 JSONP 跨域申请.
 *  难点: 如何获取 callback 参数呢??/
 */
@ExceptionHandler({RuntimeException.class})
public Object systemAop(Exception e, HttpServletRequest request){e.printStackTrace();
    String callback  = request.getParameter("callback");
    if(StringUtils.isEmpty(callback)){
        // 惯例办法调用形式
        return SysResult.fail();}else{
        // 证实是 jsonp 跨域申请
        return new JSONPObject(callback, SysResult.fail());
    }
}

}
HTTPClient
业务需要
业务阐明:当做某些操作时 可能会对数据进行业务加工, 之后由服务器与服务器之间造成通信

HttpClient 介绍
HTTP 协定可能是当初 Internet 上应用得最多、最重要的协定了,越来越多的 Java 应用程序须要间接通过 HTTP 协定来拜访网络资源。尽管在 JDK 的 java net 包中曾经提供了拜访 HTTP 协定的基本功能,然而对于大部分应用程序来说,JDK 库自身提供的性能还不够丰盛和灵便。HttpClient 是 Apache Jakarta Common 下的子项目, 用来提供高效的、最新的、功能丰富的反对 HTTP 协定的客户端编程工具包,并且它反对 HTTP 协定最新的版本和倡议。HttpClient 曾经利用在很多的我的项目中,比方 Apache Jakarta 上很驰名的另外两个开源我的项目 Cactus 和 HTMLUnit 都应用了 HttpClient。当初 HttpClient 最新版本为 HttpClient 4.5 .6(2015-09-11)

总结: 在 java 代理外部能够应用 httpClient 发动 http 申请拜访服务器获取资源.(工具 API)

HttpClient 入门案例
1. 引入 jar 包
<!– 增加 httpClient jar 包 –>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    

2. 编辑测试 API
public class HttpClientTest {

/**
 * 要求: 在 java 代码外部, 获取百度的页面.
 * 实现步骤:
 *  1. 确定指标地址: https://www.baidu.com/
 *  2. 创立 httpClient 客户端对象
 *  3. 创立申请类型
 *  4. 发动 http 申请. 并且获取响应的后果. 之后判断状态码是否为 200 如果等于 200 则申请正确
 *  5. 如果申请正确则动静获取响应值信息. 之后进行数据的再次加工....
 *  */
@Test
public void testGet() throws IOException {
    String url = "https://www.jd.com/";
    HttpClient httpClient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(url);
    HttpResponse httpResponse = httpClient.execute(httpGet);
    if(httpResponse.getStatusLine().getStatusCode() == 200) {
        // 示意用户申请正确
        // 获取返回值数据
        HttpEntity httpEntity = httpResponse.getEntity();
        String result = EntityUtils.toString(httpEntity, "UTF-8");
        System.out.println(result);
    }
}

}

3.HttpClient 增强案例
案例需要
用户通过网址 http://www.jt.com/getItems 要求采纳 httpClient 形式 获取 jt-manage 中的商品信息之后以 json 串的模式展示
jt-web 服务器拜访 jt-manage 时的网址 http://manage.jt.com/getItems

具体实现如下
1. 编辑前台 HttpClientController
@RestController
public class HttpClientController {

@Autowired
private HttpClientService httpClientService;
/**
 * 获取后端 manage 中的商品数据信息
 */
@RequestMapping("/getItems")
public List<Item> getItems(){return httpClientService.getItems();
}

}
2. 编辑前台 HttpClientService
@Service
public class HttpClientServiceImpl implements HttpClientService{

@Override
public List<Item> getItems() {List<Item> itemList = new ArrayList<>();
    //1. 定义近程拜访网址
    String url = "http://manage.jt.com/getItems";
    HttpClient httpClient = HttpClients.createDefault();
    HttpGet httpGet = new HttpGet(url);
    try {HttpResponse httpResponse = httpClient.execute(httpGet);
       if(httpResponse.getStatusLine().getStatusCode() == 200){
           String result =
                   EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
           //result 是 jt-manage 为 jt-web 返回的 List<Item> 的 JSON 串
           if(!StringUtils.isEmpty(result)){itemList = ObjectMapperUtil.toObj(result, itemList.getClass());
           }
       }
    } catch (IOException e) {e.printStackTrace();
        throw new RuntimeException(e);
    }

    return itemList;
}

}
3. 编辑后盾 HttpClientController
@RestController
public class HttpClientController {

@Autowired
private ItemService itemService;

/**
 * url 申请地址: http://manage.jt.com/getItems
 */
@RequestMapping("/getItems")
public List<Item> getItems(){return itemService.getItems();
}

}
4. 编辑后盾 HttpClientService

@Override

public List<Item> getItems() {return itemMapper.selectList(null);
}

SOA 思维(微服务代理编辑的规范)

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

RPC 思维介绍
RPC 是近程过程调用(Remote Procedure Call) 的模式的缩写
总结:
1. 当实现业务是本人没有方法间接实现时, 须要通过第三方帮忙能力实现的业务
2. 应用 RPC 时 ” 感觉 ” 上就是在调用本人的办法实现业务
微服务思维
外围:1. 分布式思维(拆) 2. 自动化(HA, 自动化)

传统我的项目的问题
1. 如果采纳 nginx 的形式 实现负载平衡 方服务数量扭转时, 都必须手动批改 nginx.conf 配置文件, 不够智能
2. 所有的申请都会通过 nginx 服务器作为直达 如果 nginx 服务器一旦宕机 则间接影响整个零碎 nginx 最好制作简略的 反向代理 即可
传统的形式不够智能

微服务调用形式介绍

调用步骤
1. 讲服务信息写入到注册核心(1. 服务名称 2. 服务 IP 地址 3. 端口)
2. 注册核心接管到服务器信息 会动静保护服务列表数据
3. 消费者启动时会连贯到注册核心 目标获取服务列表数据
4. 注册核心会将服务列表数据同步给消费者 并且保留到消费者本地 当前不便调用
5. 当消费者开始业务调用时 会依据已知的服务信息进行负载平衡操作 拜访服务提供者
6. 当服务提供者宕机时 因为注册核心会有心跳注册机制 所以会动静的保护服务列表
7. 当注册核心的服务列表发生变化时 则会全网播送 告诉所有消费者 更新本地服务列表
Zookeeper 注册核心介绍
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 Hbase 的重要组件。 它是一个为分布式应用提供一致性服务的软件 ,提供的性能包含:配置保护、域名服务、分布式同步、组服务等。
ZooKeeper 的指标就是封装好简单易出错的要害服务,将简略易用的接口和性能高效、性能稳固的零碎提供给用户。
ZooKeeper 蕴含一个简略的原语集,提供 Java 和 C 的接口。
ZooKeeper 代码版本中,提供了分布式独享锁、选举、队列的接口,代码在 $zookeeper_homesrcrecipes。其中散布锁和队列有 Java 和 C 两个版本,选举只有 Java 版本。
概括: ZK 次要的工作是 服务的调度 , 提供一致性的性能.

对于集群的常识介绍
1. 最小的集群单位有几台

公式: 存活节点的数量 >N/2 集群能够创立
1 台:1-1>1/2 假的
2 台: 2-1>2/2 假的
3 台: 3-1>3/2 真的
4 台: 4-1>4/2 真的
搭建集群的最小单位是 3 台
2. 为什么集群个别都是奇数?

1.3 台集群最多宕机几台 集群能够失常工作 最多宕机 1 台
2.4 台集群最多宕机几台 集群能够失常工作 最多宕机 1 台
如果实现雷同的性能 奇数台更优

3. 对于 zk 集群的选举规定

准则 myid 最大值优先 myid 值越大的越容易当主机 超半数批准即入选主机
题目 问 1 2 3 4 5 6 7 顺次启动
问 1. 谁当主机? 4 当主机
问 2. 谁永远不能入选主机? 1 2 3

正文完
 0