python调用RPC接口

要调用RPC接口,python提供了一个框架grpc,那是google开源的

  很多新手壹听到接口就蒙逼,不知道接口是如何!其实接口便是RPC,通过中距离访问其余程序提供的措施,然后拿走该措施施行的接口,而不须要在本地推行该方法。正是地点方法调用的进级版而已,小编明日会上1篇怎么样通过socket完成rpc,以及服务的挂号和动态上下线。那里先上1篇RPC的落成者1webservice,便于前边精通源码试行进度,框架正是在常理的根底上提供更加便利的运用而已,协议正是基于TCP或UDP之上,服务者和调用者之间约定音信根据什么样的格式发送以及解析罢了。协议没什么高深莫测的。

rpc相关文书档案:

原稿和笔者一齐冲突:http://www.cnblogs.com/intsmaze/p/6055684.html

https://grpc.io/docs/tutorials/basic/python.html

manbetx手机网页版,博客园微博:intsmaze韩轩洋哥

 

微信:intsmaze

亟待设置的python包如下:

manbetx手机网页版 1

1.grpc安装

  下边是自个儿从小到大前读书webservice时,做的笔记,前几天整治一下,分享出来,为本身源码剖析RPC做准备。  

pip
install grpcio

  WebService,顾名思义正是依据Web的劳动。它应用Web(HTTP)格局,接收和响应外部系统的某种请求,从而达成远程调用。我们得以调用互联英特网查询天气新闻Web服务,然后将它内置到我们的次序(C/S或B/S程序)个中来,用户能够在我们的网点看到气候音讯,他会感到大家为她提供了大多的音信服务,但实际大家只是简单调用了壹晃服务器上的一段代码来调用旁人写好的WebService。WebService可以将你的劳务(1段代码)发表到互连网络让外人去调用,也得以调用旁人机器上公布的WebService,就好像使用本人的代码同样.

 

  webservice是三个软件系统之间的中距离调用,这里的调用是跨语言的调用。四个不等的应用程序之间通过xml进行数据交互的。这样任何一种语言都得以解析xml文件中的数据。数据开始展览互动坚守的商事是http协议。http协议,以及我们用jdbc访问数据库其实底层都是信赖socket连接。比自个儿大家平常在其他网址登入第一方账号也能够登入,其实也是用的webservice,其他网址得到账号到第2方提供的账号服务去申明。

贰.grpc的python
protobuf相关的编写翻译工具

  在JDK一.陆未来JAX-WS标准定义了哪些公布3个web瑟维斯服务。
  JAX-WS是指Java Api for XML –
WebService.
  用Jdk壹.陆.事后的版本公布二个WebService服务.
  与Web服务相关的类,都放在javax.jws.*包中。
  首要类有:
  @WebService - 它是三个讲授,将 Java
类标识为促成 Web Service,大概将 Java 接口标志为定义 Web Service接口。
  Endpoint –
此类为端点服务类,它的办法publish用于将1个早就加多了@WebService注脚对象绑定到一个地点的端口上,接收三个参数,叁个是地点的劳动地点,贰是提供服务的类。
  怎么着发表二个web服务:
  1、在类上增多@WebService申明。
  2、通过EndPoint(端点服务)static
Endpoint.publish(String address, Object implementor)
公布八个webService。
  EndPoint发布完毕劳动之后,将会运转1个独自的线程运转,这几个运行的线程其实正是3个servicesocket,它会吸收接纳来至别的端的socket连接。
  别的注意事项:
  一,给类加多上@Web瑟维斯评释后,类中保有的非静态方法都将会对外发表。不匡助静态方法,final方法。
  二,假若愿意有些方法(非static,非final)不对外祖父开,能够在章程上增添@WebMethod(exclude=true),阻止对曾祖父开。
  三,要是2个类上,被增加了@WebService证明,则必须此类至少有3个足以公开的法子,不然将会运行战败。

pip install
grpcio-tools

@WebService
public class HelloService {
    public String sayHello( String intsmaze){
        System.out.println("sayHello()...");
        return  "hello " + intsmaze;
    }
    public String sayHello2(String intsmaze){
        return "hello " + intsmaze;
    }
    public static void main(String[] args) {
        Endpoint.publish("http://127.0.0.1:6789/hello ", new HelloService());
     //这个地方其实就是进行了封装,里面根据指定参数启动了一个servicesocket,并且生成了一个WSDL文档。
        System.out.println("Server ready...");
    }
}

 

  服务宣布成功了,怎么着调用呢?请看表明-WSDL:
  任何三个服务在地点栏输入服务地点加?wsdl 如:http://127.0.0.1:6789/hello ?wsdl

3.protobuf相关python依赖库

  目前不是访问web瑟维斯,只是获得2个用来描述WebService的求证文件,即:wsdl文件.wsdl-
WebService Description Language,是以XML文件情势来叙述WebService的”表达书”,有了表达,大家才可以领略什么使用恐怕调用这些服务。

pip install
protobuf

wsimport.exe是jdk自带的,能够依照wsdl文书档案生成客户端调用代码。
本来,无论服务器端的WebService是用什么样语言写的,都将在客户端生成Java代码.服务器端用什么写的并不主要.
瞩目生成的这几个代码服务端并从未,不是从服务端下载的。
wsimport.exe位于JAVA_HOME\bin目录下.
常用参数为:
-d<目录>  – 将生成.class文件。暗中认可参数。
-s<目录> – 将生成.java文件。
-p<生成的新包名> -将转换的类,放于内定的包下:-p
com.intsmaze.demo
(wsdlurl) – http://server:port/service?wsdl,必须的参数。
示例:
C:/> wsimport –s . http://192.168.0.100/one?wsdl
瞩目:-s不能够分开,-s前边有个小点,用于钦赐源代码生成的目录。点即当前目录。(注意.前后有空格)
设若使用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。
.class代码,可以透过包装现在选取。java代码能够直接Copy到大家的花色中运作。
接下来只必要基于wsdl文件提供的新闻调用生成类提供的方法。提出从下往上看。

 

  wsimport.exe是jdk自带的,能够依赖wsdl文书档案生成客户端调用java代码,当然假如是用任何语言的切近工具,解析wsdl后将会变动对应语言的代码,那里只是用java为例子,注意那几个代码不是经过服务端下载的,而是通过分析wsdl生成对应java文件(正是一个本地IO)。
  wsimport.exe位于JAVA_HOME\bin目录下.

4.片段分布原型的生成python类的联谊:

常用参数为:
-d<目录>  - 将生成.class文件。默认参数。
-s<目录> - 将生成.java文件。
-p<生成的新包名> -将生成的类,放于指定的包下:-p com.intsmaze.demo
(wsdlurl) - http://server:port/service?wsdl,必须的参数。

pip install
googleapis-common-protos

示例:C:/> wsimport –s .
http://192.168.0.100/one?wsdl
留神:-s不能分开,-s后边有个小点,用于内定源代码生成的目录。点即当前目录。(注意.前后有空格)
设若利用了-s参数则会在目录下生成两份代码,一份为.class代码。一份为.java代码。.class代码,能够由此包装以后接纳。java代码能够直接Copy到大家的门类中运作。

 

变化代码

 

manbetx手机网页版 2

编写翻译protobuf文件:使用以下命令生成Python代码:

  然后只需求基于wsdl文件提供的消息调用生成类提供的措施。提出从下往上看。

python3 -m
grpc_tools.protoc -I<目的路线目录> –python_out=.
–grpc_python_out=<目的文件所在目录路线>
<目标文件data.proto>

wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:tns="http://jdkservice.intsmaze.com/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:ns1="http://schemas.xmlsoap.org/soap/http" 
name="HelloServiceService" 
targetNamespace="http://jdkservice.intsmaze.com/">这是服务端的包结构,一般来说通过注解修改最多,不要暴露出去!
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://jdkservice.intsmaze.com/" 
elementFormDefault="unqualified" targetNamespace="http://jdkservice.intsmaze.com/" version="1.0">
<xs:element name="sayHello" type="tns:sayHello"/>
<xs:element name="sayHelloResponse" type="tns:sayHelloResponse"/>
<xs:complexType name="sayHello">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
<xs:element name="arg1" type="xs:int"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="sayHelloResponse">6,子元素说明了它的类型,已经是参数还是返回值
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="sayHelloResponse">5,通过element可以知道参数类型
<wsdl:part element="tns:sayHelloResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="sayHello">
<wsdl:part element="tns:sayHello" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:portType name="HelloService">3,找到标签它的子元素就是提供的方法
<wsdl:operation name="sayHello">方法名
<wsdl:input message="tns:sayHello" name="sayHello"></wsdl:input>
4,输入参数,通过message的属性可以知道参数类型,但是如果生成本地代码,通过调用函数就可以知道参数类型了。
<wsdl:output message="tns:sayHelloResponse" name="sayHelloResponse">输出参数
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloServiceServiceSoapBinding" type="tns:HelloService">2,根据type的属性找到对应的标签
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHello">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="sayHello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloServiceService">服务的名称,创建具体服务对象。
<wsdl:port binding="tns:HelloServiceServiceSoapBinding" 1,根据这个名称找到对应的标签
name="HelloServicePort">服务对象调用getHelloServicePort()获取端口返回服务接口。
<soap:address location="http://127.0.0.1:7777/hello"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>  

python3 -m
grpc_tools.protoc -I. –python_out=. –grpc_python_out=.
data.proto

 

 

package com.intsmaze.jdkservice;
/**
 * 通过wsimport生成客户端代码调用webservice服务
 */
public class App {
    public static void main(String[] args) {
        /**
         * wsdl:<service name="HelloServiceService">
         */
        HelloServiceService hss = new HelloServiceService();
        /**
         * wsdl:<port name="HelloServicePort" binding="tns:HelloServicePortBinding">
         */
        HelloService soap = hss.getHelloServicePort();
        String str = soap.sayHello("intsmaze");//这里我们看视乎在调用我们本地的方法,其实内部把发送数据组装为soap协议,
        然后把数据发送到了服务端,服务端的线程接收到请求处理返回了数据。
        System.out.println(str);
    }
}

 

 大家应用过HttpWatch获取的HTTP的调用进度,并获得了HTTP的请求头及别的请求的详细音讯。既然WebServie也是通过HTTP进行通讯的,能不选取HTTP沃特ch来赢得它的请求进程吧?大家的代码不仅仅是向服务器发送的HTTP协议,更现实的说应该叫SOAP协议,它是WebService实行通讯的基础。为了获得SOAP数据发送和吸收的格式。我们有不能缺少选择多少个工具来深刻的摸底Web瑟维斯.
  我们接纳TCP/IP Monitor来监督拦截请求和响应具体多少的完好进程。 

注意:protobuf文本,为定义服务接口代码文件,那里是data.proto

以下发出HTTP请求

会生成:data_pb2.py
与 data_pb2_grpc.py

manbetx手机网页版 3

data_pb二.py是劳动接口映射

  响应的音信,同发送音信同样,先必须是HTTP协议,然后再根据SOAP协议。

data_pb2_grpc.py方法映射

manbetx手机网页版 4

 

 

protobuf内容示例:

syntax = "proto3";
package grpcDemo;

message HelloRequest {
   string name = 1;
}

message HelloReply {
   string message = 1;
}


service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

接口调用内容示例:

# -*- coding: utf-8 -*-
import grpc
import data_pb2,data_pb2_grpc

_HOST = 'localhost'
_PORT = '8080'

def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)
    client = data_pb2_grpc.gRPCStub(channel=conn)
    response = client.SayHello(data_pb2.HelloRequest(name='hello,world!'))
    print("received: " + response.text)

if __name__ == '__main__':
    run()

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图