1. RPC技术介绍_单体架构_SOA架构
(1) 什么是单体架构
一个归档包(例如 war 格式或者 Jar 格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。也称之为单体应用架构,这是一种比较传统的架构风格。
优点:
便于开发:只需借助 IDE 的开发,调试功能即可完成
易于测试:只需要通过单元测试或浏览器即可完成测试
易于部署:打包成单一可执行 jar 或者 war 包,完成 jar 或者 war 部署即可
缺点:
复杂性高:整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,整个项目非常复杂,修改一个 BUG 都会造成隐含的缺陷。
部署速度逐渐变慢:随着代码的增加,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。
扩展能力受限:单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。
阻碍技术创新: 单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和架构,想要引入新的框架或技术平台非常困难。
(2) 什么是SOA架构
SOA 是 Service-Oriented Architecture 的英文缩写,就是面向服务的架构。这里的服务可以理解为 service 层业务服务。将系统拆分为不同的服务单元,通过网络协议服务单元之间进行通信。服务单元完成一个特定功能(如:验证、支付、登录等等),通过服务单元之间的集成组成完整的应用程序。
SOA 架构中由两个重要的角色: 服务提供者(Provider)和服务使用者(Consumer)
优点:
更易维护:业务服务提供者和业务服务使用者的松散耦合关系。当需求发生变化的时候,不需要修改提供业务服务的接口,只需要调整业务服务流程或者修改操作即可,整个应用系统也更容易被维护。
更高的可用性:该特点是在于服务提供者和服务使用者的松散耦合关系上得以发挥与体现。使用者无须了解提供者的具休实现细节。
更好的伸缩性:依靠业务服务设计、开发和部署等所采用的架构模型实现伸缩性。使得服务提供者可以互相彼此独立地进行调整,以满足新的服务需求。
缺点:
减低了系统的性能
系统之间交互需要使用远程通信,接口开发增加工作量
(3) 什么是 RPC 调用
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。请求程序就是一个客户机,而服务提供程序就是一个服务器
(4) RPC 的应用场景
支付宝、微信、银联等第三方支付接入
公司内部的不同业务系统,不同技术平台的整合
(5) RPC 的实现方式
RMI:Java 提供的基于 java 平台 RPC 远程调用技术,服务消费者和服务提供者是 java 平台
WEBSERVICE:通过 Http 协议,请求发送 xml 和响应 xml 的 RPC 远程调用技术,最大的特征使用xml 进行数据交互,可以实现跨平台调用。
HttpClient:Http 客户端工具,Java 程序通过 HttpClient 发送 Http 协议的请求,直接获得远程资源。
2. RMI远程服务发布_消费_结构优化
(1) 什么是RMI远程调用
RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
(2) 实现RMI相关的API类有哪些,以及作用
Romote 接口 标识某个方法可以被远程调用
UnicastRemoteObject 类 实现 Remote 远程对象的导出
Naming 给提供远程服务的对象的绑定 url
通过远程的 url,获得提供远程服务的代理对象
LocateRegistry 类 指定发布的远程服务的方法端口
3. WEBSERVICE远程服务发布_消费
(1) 什么是webservice
Web service 是一个平台独立的,低耦合的 web 的应用程序用于开发分布式的互操作的应用程序。Web Service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。
(2) 什么是soap和wsdl
SOAP(Simple Object Access Protocol) 简单对象访问协议:
SOAP=http+xml
WSDL(Web Services Description Language) Web Service 的描述语言:
一个 webservice 服务的说明书,通过该说明书可以完成 webservice 服务的调用
(3) 实现webService相关的API类有哪些,以及作用
@WebService :指定发布远程的服务,哪些功能发布为远程服务,发布远程的 web 服务,默认情况下该接口中的所有 public 方法都会被发布
EndPoint: 发布具体的远程服务,给提供远程服务的对象绑定一个 url
(4) wdsl 文档
服务消费端代码:
public class WsConsumerApp {
public static void main(String[] args) {
//完成webservice服务的消费
//创建服务类对象
UserServiceImplService service = new UserServiceImplService();
//创建远程服务代理对象
UserServiceImpl userService = service.getUserServiceImplPort();
System.out.println(userService.getClass().getName());
//通过代理对象调用方法
String rest = userService.sayHello("泰罗");
System.out.println("结果"+rest);
}
}
4. httpClient_进行远程服务的发布_消费
(1) 谈谈自己对HttpClient的理解
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
HttpClient 是 Apache Jakarta Common 下的子项目,供高效的、最新的、功能丰富的支持
HTTP 协议的客户端编程工具包。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)支持RestFul。
(2) Http远程服务使用什么形式进行远程数据响应
使用Json形式进行数据响应
请求消息:
package com.bjsxt.test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.bjsxt.commons.HttpClientUtil;
import com.bjsxt.domain.Order;
public class TestHttpClient {
public static void main(String[] args) {
//不带参数
// String rest2 = HttpClientUtil.doPost("http://localhost:7070/order/loadOrderList02");
// System.out.println(rest2);
// //将结果解析为Order集合(json-->object)
// List<Order> list = JSON.parseArray(rest2, Order.class);
// for (Order order : list) {
// System.out.println(order.getId()+" "+order.getTotal()+" "+order.getDate());
// }
//带参数
Map<String,String> map = new HashMap<>();
map.put("uid", "11111");
String rest3 = HttpClientUtil.doPost("http://localhost:7070/order/loadOrderList02", map);
//将结果解析为Order集合
List<Order> list = JSON.parseArray(rest3, Order.class);
for (Order order : list) {
System.out.println(order.getId()+" "+order.getTotal()+" "+order.getDate());
}
}
}
Pom文件需要依赖(json转换为list集合):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
5. Spring_RestTemplate消费远程Http服务
(1) 什么是RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。
(2) RestTemplate对象能提交哪些http请求
Get、post
package com.bjsxt.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map.Entry;
import javax.swing.text.html.parser.Entity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import com.bjsxt.domain.Order;
@Controller
public class RedController {
@Autowired
private RestTemplate resttemplate;
@RequestMapping("/loadOredrList01")
@ResponseBody
public Object loadOredrList01(String uid) {
//发送远程http请求url
String url="http://localhost:7070/order/loadOrderList02";
//发送的参数
MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
map.add("uid", uid);
//通过restTemplate对象发送post请求
Order[] orders = resttemplate.postForObject(url, map, Order[].class);
return Arrays.asList(orders);
}
@RequestMapping("/loadOredrList02")
@ResponseBody
public Object loadOredrList02(String uid) {
//发送远程http请求url
String url="http://localhost:7070/order/loadOrderList02";
//发送的参数
MultiValueMap<String,Object> map = new LinkedMultiValueMap<>();
map.add("uid", uid);
//通过restTemplate对象发送post请求
ResponseEntity<Order[]> entity = resttemplate.postForEntity(url, map, Order[].class);
HttpHeaders headers = entity.getHeaders();
for (Entry<String,List<String>> e : headers.entrySet()) {
System.out.println(e.getKey()+" "+e.getValue());
}
Order[] orders = entity.getBody();
return Arrays.asList(orders);
}
}
6. RPC跨域访问_解决方案
(1) 什么是Ajax的跨域访问
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。
(2) Ajax跨域访问有哪些解决方案
①服务器段解决
服务端设置 response header 中 Access-Control-Allow-Origin 字段
②前端 JSONP 解决
利用 script 标签,不受同源策略的限制,用户从服务请求数据,服务器返回一个带有方法和数据的 js 代码。
7. RPC跨域问题_CorsFilter解决
(1) 谈谈CorsFilter解决跨域访问的原理
通过 CORSFilter 过滤器在服务器端修改 Http 的响应头
允许所有域访问:
Access-Control-Allow-Origin: *
允许特定域访问(域之间用逗号隔开):
Access-Control-Allow-Origin: http://example.com:8080/
(2) CorsFilter需要在哪里进行配置,描述配置细节
添加 CORSFilter 依赖
<dependency>
<groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId>
<version>2.5</version>
<scope>runtime</scope>
</dependency>
web.xml 配置 CORSFilter:
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowOrigin</param-name>
//配置允许访问的域
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type,
Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value></init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8. RPC跨域问题_JSONP解决
(1) 什么是jsonp
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
(2) jsonp解决跨域访问的原理
在 js 中,我们直接用 XMLHttpRequest 请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的 js 脚本文件却是可以的,jsonp 正是利用这个特性来实现的。
消息提供者pom文件中添加 fastjson 依赖
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
Controller 添加一个接收远程 ajax 请求的方法,该方法后一个接收回调函数的参数.
/****
* 接收 jsonp 请求,响应 js 的字符串到客户端
* @param uid
* @param callback
* @return
*/
@RequestMapping("/loadOrderList03")
@ResponseBody
public String loadOrderList03(String uid,String callback){
System.out.println("uid="+uid);
Order o1=new Order();o1.setId("111");
o1.setTotal(123.0);
o1.setDate("2018-10-10");
Order o2=new Order();
o2.setId("222");
o2.setTotal(1232.0);
o2.setDate("2018-10-13");
Order o3=new Order();
o3.setId("333");
o3.setTotal(333.0);
o3.setDate("2018-10-31");
List<Order> list = new ArrayList<>();
list.add(o1);
list.add(o2);
list.add(o3);
//result 是需要响应到客户端的 js 代码
String result=callback+"("+JSON.toJSONString(list)+")";
return result;
}
9. RPC_RMI部署集群服务_消费_服务发现
(1) 谈谈对服务发现的理解
(0)服务容器负责启动,加载,运行服务提供者。
(1)服务提供者在启动时,向注册中心注册自己提供的服务 URL。
(2)服务消费者在启动时,向注册中心订阅自己所需的服务。
(3)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送
变更数据给消费者。
(4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如
果调用失败,再选另一台调用。
让消费能够感知到服务提供者的状态发生了变化(宕机,重启)
(2) 谈谈对服务的集群点部署
将某个应用服务部署到,同时部署到 n 个服务器节点,由 n 个服务器节点对外提供相同服务.同时可以提供备用节点服务器.
10. Zookeeper_介绍_集群安装
(1) 什么是Zookeeper,有哪些应用场景
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。提供的功能包括:配置
维护、分布式同步、域名服务、组服务等。
(2) zk集群安装的zkserver个数有什么要求?为什么?
与配置的zookeeper的个数相同,使每个zookeeper得到相应的ip和端口以及选举端口
11. Zookeeper_数据模型_常用命令
(1) zk常用命令有哪些,作用是什么?
①连接 Zookeeper 集群命令
连接默认 ZkServer:./zkCli.sh
连接指定 ZkServer: ./zkCli.sh -server ip:port
②ls 命令
作用 :ls 命令用于获取路径下的节点信息(所有子节点),注意路径为绝对路径
语法 :ls /znodePath 如:ls /
③create 命令
作用: create 命令用于创建节点,默认为永久节点
语法:
create /znodePath znodeData (注意:没有数据 znodeData 为 null,否则没法创建成功) 如:create /hello hellozk
create -s /znodePath znodeData (-s:表示创建顺序节点,zk 自动会为创建的节点进行编号)
create -e /znodePath znodeData (-e:表示创建瞬时节点,当创建该节点的客户端断开与集群服务的连接的时候,该节点会自动消失)
④get 命令
作用: 获取 Zookeeper 指定节点的数据内容和属性信息
语法: get /znodePath
⑤set 命令
作用 :更新指定节点的数据内容
语法 :set /znodePath znodeNewData
⑥delete 命令
作用 :使用 delete 命令可以删除 Zookeeper 上的指定节点
语法: delete /znodePath
(2) 简单描述zk保存数据的数据结构,以及结构的要求?
数据模型: ZooKeeper 采用的类似文件系统的形式保存数据,文件系统中的每一个节点(Znode)都由一个路径唯一标识。在整个数据存储的路径中 / 表示根节点,其他的 Znode节点,都是相对于根节点。Znode 可以拥有子节点。
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。