当前位置: 首页 > news >正文

网站测试软件/百度seo关键词优化方案

网站测试软件,百度seo关键词优化方案,做网站的公司都有哪些业务,400电话西安网站制作 彩铃制作青春虚度无所成,白首衔悲补何及【RPC---远程过程调用协议】主要内容1. 项目结构变化2. RPC简介3. HttpClient实现RPC4. RMI实现RPC5. Zookeeper安装6. Zookeeper客户端常用命令7. 向Zookeeper中注册内容8. 从Zookeeper中发现内容9. 手写RPC框架一、 项目架构变化1. …

0cf819b0be2d42d4aa3b7d968659630f.png

青春虚度无所成,白首衔悲补何及

【RPC---远程过程调用协议】

主要内容

1. 项目结构变化

2. RPC简介

3. HttpClient实现RPC

4. RMI实现RPC

5. Zookeeper安装

6. Zookeeper客户端常用命令

7. 向Zookeeper中注册内容

8. 从Zookeeper中发现内容

9. 手写RPC框架

一、 项目架构变化

1. 单体架构

1.1 架构图

单体架构就是一个项目里面包含这个项目中全部代码。一个应用搞定全部功能。

DNS 服务器可以是单映射,也可以配置多个映射。

371c3dc36584c07309270f16c139e8a7.png

1.2 软件代码结构

在单体架构项目中,团队都是通过包(package)进行区分每个模块。

总体包结构:com.bjsxt.*.分层包。

e49a722081f211c25df665bf853917df.png

1.3 优缺点

优点:

  • 部署简单、维护方便、成本低

缺点:

  • 当项目规模大、用户访问频率高、并发量大、数据量大时,会大大降低程序执行效率,甚至出现服务器宕机等情况。

1.4 适用项目

传统管理项目,小型互联网项目。

2. 分布式架构

2.1 架构图(简易版)

分布式架构会把一个项目按照特定要求(多按照模块或功能)拆分成多个项目,每个项目分别部署到不同的服务器上。

ee236e9b2323af3ec91dfc81210fe846.png

2.2 软件代码结构

f3ea2ebd9f9c3519bab9915f1030c33a.png

2.3 优缺点

优点:

  • 增大了系统可用性。减少单点故障,导致整个应用不可用。
  • 增加重用性。因为模块化,所以重用性更高。高内聚、低耦合。
  • 增加可扩展性。有新的模块增加新的项目即可。
  • 增加每个模块的负载能力。因为每个模块都是一个项目,所以每个模块的负载能力更强。

缺点:

  • 成本更高。
  • 架构更加复杂。
  • 整体响应之间变长,一些业务需要多项目通信后给出结果。
  • 吞吐量更大。吞吐量= 请求数/秒。

2.4 适用项目

中、大型互联网项目。客户多,数据多,访问并发高,压力大,吞吐量高。

2.5 待解决问题

分布式架构中各个模块如何进行通信?

可以使用Http协议,也可以使用RPC协议通信,也可以使用其他的通信方式。我们本阶段使用的是RPC协议,因为它比HTTP更适合项目内部通信。

二、RPC简介

1. RFC

RFC(Request For Comments) 是由互联网工程任务组(IETF)发布的文件集。文件集中每个文件都有自己唯一编号,例如:rfc1831。目前RFC文件由互联网协会(Internet Society,ISOC)赞助发行。

RPC就收集到了rfc 1831中。可以通过下面网址查看:

https://datatracker.ietf.org/doc/rfc1831/

2. RPC

RPC在rfc1831中收录 ,RPC(Remote Procedure Call) 远程过程调用协议

40ad2e8521e2496fafcec5b137be9c9a.png

RPC协议规定允许互联网中一台主机程序调用另一台主机程序,而程序员无需对这个交互过程进行编程。在RPC协议中强调当A程序调用B程序中功能或方法时,A是不知道B中方法具体实现的。

RPC是上层协议,底层可以基于TCP协议,也可以基于HTTP协议。一般我们说RPC都是基于RPC的具体实现,如:Dubbo框架。从广义上讲只要是满足网络中进行通讯调用都统称为RPC,甚至HTTP协议都可以说是RPC的具体实现,但是具体分析看来RPC协议要比HTTP协议更加高效,基于RPC的框架功能更多。

RPC协议是基于分布式架构而出现的,所以RPC在分布式项目中有着得天独厚的优势。

3. RPC和HTTP对比

1.1 具体实现

  • RPC:可以基于TCP协议,也可以基于HTTP协议。
  • HTTP:基于HTTP协议

1.2 效率

  • RPC:自定义具体实现可以减少很多无用的报文内容,使得报文体积更小。
  • HTTP:如果是HTTP 1.1 报文中很多内容都是无用的。如果是HTTP2.0以后和RPC相差不大,比RPC少的可能就是一些服务治理等功能。

1.3 连接方式

  • RPC:长连接支持。
  • HTTP:每次连接都是3次握手。(断开链接为4次挥手)

1.4 性能

  • RPC可以基于很多序列化方式。如:thrift
  • HTTP主要是通过JSON,序列化和反序列效率更低。

1.5 注册中心

  • RPC :一般RPC框架都带有注册中心。
  • HTTP:都是直连。

1.6 负载均衡

  • RPC:绝大多数RPC框架都带有负载均衡测量。
  • HTTP:一般都需要借助第三方工具。如:nginx

1.7 综合结论

RPC框架一般都带有丰富的服务治理等功能,更适合企业内部接口调用。而HTTP更适合多平台之间相互调用。

三、HttpClient实现RPC

1. HttpClient简介

在JDK中http://java.net包下提供了用户HTTP访问的基本功能,但是它缺少灵活性或许多应用所需要的功能。

HttpClient起初是Apache Jakarta Common 的子项目。用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本。2007年成为顶级项目。

通俗解释:HttpClient可以实现使用Java代码完成标准HTTP请求及响应。

2. 代码实现

2.1 服务端

新建项目HttpClientServer

10c34a924b5e1adfcbd4e66cc04240b8.png

1) 新建控制器

com.bjsxt.controller.DemoController

@Controller
public class DemoController {@RequestMapping("/demo")@ResponseBodypublic String demo(String param){return "demo"+param;}
}

2) 新建启动器

com.bjsxt.HttpClientServerApplication

@SpringBootApplication
public class HttpClientServerApplication {public static void main(String[] args) {SpringApplication.run(HttpClientServerApplication.class,args);}
}

2.2 客户端

新建HttpClientDemo项目

8d569e76dfbb0e193258cf24dc896242.png

1) 添加依赖

<dependencies><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.10</version></dependency>
</dependencies>

2) 新建类

新建com.bjsxt.HttpClientDemo,编写主方法。

① 使用POST方式访问

public class HttpClientDemo {public static void main(String[] args) {try {CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost post = new HttpPost("http://localhost:8080/demo");HttpEntity httpEntity= null;List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("param","123"));StringEntity entity = new UrlEncodedFormEntity(params,"utf-8");post.setEntity(entity);CloseableHttpResponse response = httpClient.execute(post);String result = EntityUtils.toString(response.getEntity());System.out.println(result);response.close();httpClient.close();} catch (IOException e) {e.printStackTrace();}}
}

② 使用GET方式访问

public static void main(String[] args) {try {CloseableHttpClient httpClient = HttpClients.createDefault();URIBuilder uriBuilder = new URIBuilder("http://localhost:8080/demo");uriBuilder.addParameter("param", "get123");HttpGet get = new HttpGet(uriBuilder.build());CloseableHttpResponse response = httpClient.execute(get);String result = EntityUtils.toString(response.getEntity(), "utf-8");System.out.println(result);response.close();httpClient.close();} catch (URISyntaxException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}
}

3. HttpClient请求包含JSON

java代码实现

public class HttpClientDemo {public static void main(String[] args) {try {CloseableHttpClient httpClient = HttpClients.createDefault();HttpPost post = new HttpPost("http://localhost:8080/demo");HttpEntity httpEntity= null;
String json = "{}";StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);post.setEntity(entity);CloseableHttpResponse response = httpClient.execute(post);String result = EntityUtils.toString(response.getEntity());System.out.println(result);response.close();httpClient.close();} catch (IOException e) {e.printStackTrace();}}
}

4. 服务端控制器接口参数

@RequestBody把请求体中流数据转换为指定的对象。多用在请求参数是json数据且请求的Content-Type="application/json"

@RequestMapping("/demo4")
@ResponseBody
public String demo4(@RequestBody List<People> list) {System.out.println(list);return list.toString();
}

5. Jackson用法

5.1 把对象转换为json字符串

ObjectMapper objectMapper = new ObjectMapper();
People peo = new People();
String jsonStr = objectMapper.writeValueAsString(peo);

5.2 把json字符串转换为对象

ObjectMapper objectMapper = new ObjectMapper();
People peo = objectMapper.readValue(jsonStr, People.class);

5.3 把json字符串转换为List集合

ObjectMapper objectMapper = new ObjectMapper();
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, People.class);
List<People> list = objectMapper.readValue(jsonStr, javaType);

6. Ajax发送json参数写法

var json = '[{"id":123,"name":"bjsxt"},{"id":123,"name":"bjsxt"}]';
$.ajax({url:'/demo5',type:'post',success:function(data){alert(data);for(var i = 0 ;i<data.length;i++){alert(data[i].id +"  "+data[i].name);}},contentType:'application/json',//请求体中内容类型dataType:'json',//响应内容类型。data:json});

7. 跨域

  • 跨域:协议、ip、端口中只要有一个不同就是跨域请求。
  • 同源策略:浏览器默认只允许ajax访问同源(协议、ip、端口都相同)内容。
  • 解决同源策略:在控制器接口上添加@CrossOrigin。表示允许跨域。本质在响应头中添加Access-Control-Allow-Origin: *
@RequestMapping("/demo5")
@ResponseBody
@CrossOrigin
public List<People> demo5(@RequestBody List<People> list) {System.out.println(list);return list;
}

四、RMI实现RPC

1. RMI简介

RMI(Remote Method Invocation) 远程方法调用。

RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。

RMI 是Java语言的远程调用,无法实现跨语言。

2. 执行流程

577d588c562ac2e1653e8dffc7e4b6c2.png

Registry(注册表)是放置所有服务器对象的命名空间。 每次服务端创建一个对象时,它都会使用bind()或rebind()方法注册该对象。 这些是使用称为绑定名称的唯一名称注册的。

要调用远程对象,客户端需要该对象的引用。即通过服务端绑定的名称从注册表中获取对象(lookup()方法)。

3. API介绍

3.1 Remote

java.rmi.Remote 定义了此接口为远程调用接口。如果接口被外部调用,需要继承此接口。

4d481ee16c415118ee855781b0a7eb2e.png

3.2 RemoteException

java.rmi.RemoteException

继承了Remote接口的接口中,如果方法是允许被远程调用的,需要抛出此异常。

3.3 UnicastRemoteObject

java.rmi.server.UnicastRemoteObject

此类实现了Remote接口和Serializable接口。

自定义接口实现类除了实现自定义接口还需要继承此类。

3.4 LocateRegistry

java.rmi.registry.LocateRegistry

可以通过LocateRegistry在本机上创建Registry,通过特定的端口就可以访问这个Registry。

3.5 Naming

java.rmi.Naming

Naming定义了发布内容可访问RMI名称。也是通过Naming获取到指定的远程方法。

4. 代码实现

4.1 创建服务端

创建RmiServer项目

fce685f6b0048e16b38a8ada9f0374e9.png

1) 编写接口

com.bjsxt.service.DemoService 编写

public interface DemoService extends Remote {String demo(String demo) throws RemoteException;
}

2) 编写实现类

com.bjsxt.service.impl.DemoServiceImpl 编写。

注意:构造方法是public的。默认生成protected

public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {public DemoServiceImpl() throws RemoteException {}@Overridepublic String demo(String demo) throws RemoteException {return demo+"123";}
}

3) 编写主方法

编写com.bjsxt.DemoServer类,生成主方法

public class DemoServer {public static void main(String[] args) {try {DemoService demoService = new DemoServiceImpl();LocateRegistry.createRegistry(8888);Naming.bind("rmi://localhost:8888/demoService",demoService);} catch (RemoteException e) {e.printStackTrace();} catch (AlreadyBoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();}}
}

4) 运行项目

运行后,项目一直处于启动状态,表示可以远程访问此项目中的远程方法。

81242c98ef089fa3e8bb96ba992df70b.png

4.2 创建客户端

创建项目RmiClient

e316bc5a185744c37673819b28eb6147.png

1) 复制服务端接口

把服务端com.bjsxt.service.DemoService粘贴到项目中。

注意:复制代码仅为快速完成案例,学习技术,在商业开发中,DemoService接口应该使用独立的工程定义,并在服务端和客户端工程中通过依赖的方式引入。

2) 创建主方法类

新建com.bjsxt.DemoClient

public class DemoClient {public static void main(String[] args) {try {DemoService demoService =(DemoService) Naming.lookup("rmi://localhost:8888/demoService");String result = demoService.demo("demo34");System.out.println(result);} catch (NotBoundException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();}}
}

需要更多Java资料的小伙伴可以在评论区留言或者私信我

http://www.lbrq.cn/news/1296757.html

相关文章:

  • 做中国o2o网站领导/免费创建个人网页
  • 网站维护 代码/宁波关键词排名优化
  • 佛山微网站建设多少钱/合肥网站排名提升
  • 前端培训学校/开鲁网站seo转接
  • 购物网站英文介绍/合肥网站seo公司
  • 网站标题如何修改/百度网盘官网
  • 建设网上银行官方网站/网络营销的方式和方法
  • 无锡装修网站/新闻头条今天最新消息
  • 给企业做网站公司/关键词排名软件
  • 网站可以用什么做/制作网站软件
  • 做pcb网站的公司/软文营销文章500字
  • 电商 网站 降低 跳出率 措施 效果/广州网络推广选择
  • 网站建设php怎么安装/网站权重什么意思
  • 网站备案对网站负责人的要求/竞价推广账户竞价托管公司
  • 柳州住房和城乡建设部网站/如何推广一个网站
  • 网站seo诊断书/谷歌浏览器下载安装2022最新版
  • 响应式网站文字大小/企业建站
  • 县政府网站建设框架/网站公司
  • 外网无法访问WordPress/厦门seo代运营
  • 海南省建设人力资源网站/重庆seo全网营销
  • 境外注册网站/淘宝推广引流方法有哪些
  • 医院网站制作/自动外链
  • 苏州网站设计公司哪家便宜/路由器优化大师
  • 阜阳恒亮做网站多少钱/安卓优化大师官网
  • wordpress 建网页/网站优化推广方案
  • 哪里有专门做gif的网站/软文通
  • 注册网站大全/友链交换有什么作用
  • 怎么把网站链接做二维码/创新驱动发展战略
  • 北京网站制作的/国家免费职业培训平台
  • 国外那些视频网站做的不错/seo搜索引擎优化期末考试
  • 手写tomcat
  • Twisted study notes[2]
  • 使用pytorch创建模型时,nn.BatchNorm1d(128)的作用是什么?
  • AWS Partner: Accreditation (Technical)
  • lvs原理及实战部署
  • MySQL数据丢失救援办法