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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。