重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

java实现rpc代码 java 实现rpc

请教一下java和php协同开发的方法

引用

“专业、务实、高效、创新、把客户的事当成自己的事”是我们每一个人一直以来坚持追求的企业文化。 成都创新互联是您可以信赖的网站建设服务商、专业的互联网服务提供商! 专注于网站建设、成都网站设计、软件开发、设计服务业务。我们始终坚持以客户需求为导向,结合用户体验与视觉传达,提供有针对性的项目解决方案,提供专业性的建议,创新互联建站将不断地超越自我,追逐市场,引领市场!

因为在做垂直搜索工作中,使用的是java编写的一个搜索类库。做垂直搜索,很多实用要使用到配置。当搜索的信息量大时,网站的更新。搜索程序的配置维护是一个不可忽视的问题。所以用了php做网页,提供配置界面,这样就可以不用直接修改配置文件或是配置数据库表。当把配置信息配置好了,我们需要检测配置是否正确,因为使用的是java程序,所以检测配置的正确与否使用的也是java程序来检测。这里就存在一个问题,就是需要把php页面上的信息传入到java程序中去检测。这个时候就需要php和java通信了。下面我就来介绍下怎么使php跟java通信(当然,你也可以使用类似webservice等技术)也就是php中调用java程序。 php要调用java程序:需要以下准备,php程序,java程序,还有就是shell程序或是bat程序。下面分别介绍下在linux服务器下php调用java程序和在windows服务器下调用java程序。前提是php,apache,jdk的环境都已经配置好。

一 在linux下php调用java程序是通过shell文件。分别是以下三个文件: test_shell.php test_shell.java test_shell.sh 他们的源代码如下:

1.test_shell.java程序代码

public class test_shell {

public static void main(String[] args) {

System.out.println("你输入的参数是:"+args[0]+"t"+args[1]);

}

}

2.test_shell.php程序代码

?php

/*

* 该函数是用来执行shell命令的,其实还可以使用:exec(),system(),

* popen()和pclose(),passthru() 函数。最长用的是前面两个和例中使

* 用的shell_exec()。

*/

$args1="我喜欢你";

$args2="我很爱你山槐渗";

// 注意空格

$r=shell_exec("./test_shell.sh $args1 $args2");

echo $r;

?

3.test_shell.sh程序代码是

#!/bin/sh

JAVA_HOME=/usr/local/jdk

CLASSPATH=.:/usr/local/jdk/jre/lib/rt.jar:/usr/local/apache/htdocs/test_shell/test_shell.class

PATH=$PATH:$JAVA_HOME/明含bin

export JAVA_HOME CLASSPATH PATH

cd /usr/local/apache/htdocs/test_shell

java test_shell

#shell代码结束

以下是三个程序的存放路径和运行次序。

1.三个文件都必须在同一目录下,比如在/usr/local/apache/htdocs/test_shell/下,不然php很难调到java程序。

2.把test_shell.java程序编译成test_shell.class,然后把test_shell.class文件存放到CLASSPATH中。如果系统配置了那些环境变量,这里在配置一次是没有坏处的,也不会影响配置好的系统环境变量。这里设置的好处是当没有配逗脊置jdk环境配置,只有jre时,则需把jre放到/usr/local/jdk下就以。

二、下面先介绍在windows服务器下,php调用java程序是通过bat文件来的。分别是以下三个文件: test_bat.php test_bat.java test_bat.sh 他们的源代码如下:

1.java程序

public class test_bat {

public static void main(String[] args) {

System.out.println("你输入的参数是:"+args[0]+"t"+args[1]);

}

}

2.test_bat.php程序代码

?php

/*

* 该函数是用来执行shell命令的,其实还可以使用:exec(),system(),

* popen()和pclose(),passthru() 函数。最长用的是前面两个和例中使

* 用的shell_exec()。

*/

$args1="我喜欢你";

$args2="我很爱你";

// 注意空格

$r=shell_exec("./test_shell.sh $args1 $args2");

echo $r;

?

3.test_bat.sh程序代码是

@echo off

set path=%path%;%cd%jrebin

set CLASSPATH=.;%cd%jrelibrt.jar;%cd%test_bat.class

java test_bat %1 %2

#bat代码结束

1.三个文件都必须放在同一目录下,比如在/usr/local/apache/htdocs/test_bat/下,不然php很难调到java程序。

2.把test_bat.java程序编译成test_bat.class,然后把test_bat.class文件存放到CLASSPATH中。如果系统配置了那些环境变量,这里在配置是没有坏处的,也不会影响配置好的系统环境变量。这里设置的好处是当没有配置jdk环境配置,只有jre时,则需把jre放到跟跟test_bat.java同一目录下就行了。

三、上面两个例子中,test_shell.sh用的绝对路径,test_bat.bat是用的相对路径。不管是绝对还是相对,只要路径对了就行了。

RPC协议及实现方式(分布式微服务治理的核心)

分布式微服务治理的核心在于: 微服务和分布式

Remote Procedure Call,翻译过来应该是“远程程序调用”,目前业内通用的翻译是“远程过程调用”,但是“过程”这个词很容易造成误解,翻译成“程序”更好理解RPC的意义。

一般所谓的XX协冲简议就是个文档,类似于我们的需求文档,只说了要做什么,但是具体怎么做是由各大开源大佬做的。 一般情况下都会实现核心功能,不同的开源在细节上实现都会不一样,这个需要芹芹注意!

RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出的,在 Nelson 的论文 "Implementing Remote Procedure Calls" 中,他提到了几个 RPC的特点 :

除此之外,这位大佬还给出了实现RPC框架的 详细架构图 :

结合上图,Nelson 的论文中指出实现 RPC 的程序包括 5 个部分:

所以这架构图的意思是:当 user 想发起一个远程调用时,它实际是通过本地调用 User-stub。并通过本地的RPCRuntime传输 。远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起本地端调用,调用结果再返回给 User 端。

看完协议内容,跟着就得实现这个协议啦,这时候你是不是发现了问题的严重性: 自!己!一!点!思!路!都!没!有!

所以我们需要再理解一下RPC协议,根据Nelson的论文知道我们要做的两件事:

上述两点其实是实现RPC协议的两大要素: 序列化协议和传输协议 。

因为RPC本质上是进程间通信,而“本地调用和远程调用的对比”实际上就是“进程内通信和进程间通信的对比”。通过两者的对比,我们才能理解到 序列化协议和传输协议 的作用,如下图:

最基本的RPC框架就是 单点式 的,因为A服务直接调用B服务,不经过第三方,这种是最简单的。但是必须是A和B同时部署一套,A1只能调用B1,A2只能调用B2。

所以需要一台A服务对多台B服务,利用第三方服务(注册中心)找到其他B服务,而不是写死B服务的地址。这种RPC才是 分布式 RPC,也是业内主流。

单点RPC框架只需要:

但是我们要做分布式的啊,所以需要:

实际上在生产环境中,我们嫌判毕需要实时监控服务的调用情况,所以需要一个微服务管理中心,甚至是一个自动化运维的管理中心,所以需要:

在文章的第二节我们看到大佬论文中对RPC的总结,其中一个很重要的一点:“通用”。

所以我们需要:

对的,能实现上述五点的,才是一个合格的RPC框架,但还不是优秀,因为我们还要考虑下性能。

先打个底,目前流行的RPC框架大多都是多管闲事,不单单只是RPC框架,你可以看看Dubbo和SpringCloud中除了RPC还有什么骚功能。

可以看看别人的各种RPC框架总结:

在网上找到了个图,但是没有提到SpringCloud,暂且看看先,因为有些不认为是对的:

我们可以看到各个RPC框架使用的序列化协议,注册中心,管理中心,是否跨语言,但是传输协议没有提到。

参考这篇博客:

综合来说,在性能上rpcx是首选,但是考虑到框架的生态,其实还是推荐Dubbo或者SpringCloud的,因为除了性能,成本也是很重要的,无论是学习成本还是研发成本。


网站名称:java实现rpc代码 java 实现rpc
浏览路径:http://cqcxhl.cn/article/dsphpho.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP