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.如果申请正确则动静获取响应值信息.之后进行数据的再次加工.... * */@Testpublic 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 {
@Autowiredprivate HttpClientService httpClientService;/** * 获取后端manage中的商品数据信息 */@RequestMapping("/getItems")public List<Item> getItems(){ return httpClientService.getItems();}
}
2.编辑前台HttpClientService
@Service
public class HttpClientServiceImpl implements HttpClientService{
@Overridepublic 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 {
@Autowiredprivate 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