python调用RPC接口

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

  繁多菜鸟一听到接口就蒙逼,不知情接口是怎么着!其实接口正是RPC,通过中远距离访问其他程序提供的措施,然后拿走该情势推行的接口,而不要求在本地试行该方法。就是地方方法调用的提高版而已,小编先天会上1篇怎么着通过socket完结rpc,以及劳动的挂号和动态上下线。这里先上1篇RPC的达成者壹webservice,便于后边精晓源码试行进度,框架正是在常理的基本功上提供越来越简便易行的行使而已,协议便是根据TCP或UDP之上,服务者和调用者之间约定音信根据什么的格式发送以及解析罢了。协议没什么高深莫测的。

rpc相关文书档案:

原稿和作者一齐座谈:http://www.cnblogs.com/intsmaze/p/6055684.html

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

天涯论坛天涯论坛:intsmaze万厚良洋哥

 

微信:intsmaze

内需设置的python包如下:

图片 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,别的网址得到账号到第一方提供的账号服务去验证。

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

  在JDK壹.陆未来JAX-WS规范定义了怎样发表多少个webService服务。
  JAX-WS是指Java Api for XML –
WebService.
  用Jdk一.陆.后头的本子发布一个WebService服务.
  与Web服务相关的类,都坐落javax.jws.*包中。
  主要类有:
  @WebService - 它是贰个声明,将 Java
类标记为贯彻 Web Service,只怕将 Java 接口标识为定义 Web Service接口。
  Endpoint –
此类为端点服务类,它的方法publish用于将一个一度增添了@WebService表明对象绑定到二个地方的端口上,接收多少个参数,三个是本土的服务地点,2是提供劳务的类。
  怎么样发布一个web服务:
  1、在类上增添@WebService表明。
  2、通过EndPoint(端点服务)static
Endpoint.publish(String address, Object implementor)
发表四个webService。
  EndPoint发布完结服务之后,将会运行一个单身的线程运转,这一个运行的线程其实便是2个servicesocket,它会接受来至别的端的socket连接。
  别的注意事项:
  1,给类加多上@WebService证明后,类中具备的非静态方法都将会对外公布。不援救静态方法,final方法。
  二,假诺期待有个别方法(非static,非final)不对曾祖父开,能够在情势上增多@WebMethod(exclude=true),阻止对曾外祖父开。
  三,要是1个类上,被增加了@WebService评释,则必须此类至少有贰个方可公开的不2诀要,不然将会运维战败。

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瑟维斯,只是得到多个用来描述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前面有个小点,用于钦点源代码生成的目录。点即当前目录。(注意.前后有空格)
1旦选择了-s参数则会在目录下生成两份代码,1份为.class代码。1份为.java代码。
.class代码,能够透过包装今后使用。java代码能够从来Copy到我们的品种中运营。
下一场只须要根据wsdl文件提供的音信调用生成类提供的不2秘籍。提议从下往上看。

 

  wsimport.exe是jdk自带的,可以依附wsdl文书档案生成客户端调用java代码,当然假设是用其余语言的好像工具,解析wsdl后将会变动对应语言的代码,那里只是用java为例子,注意那个代码不是由此服务端下载的,而是经过分析wsdl生成对应java文件(正是五个地面IO)。
  wsimport.exe位于JAVA_HOME\bin目录下.

四.片段布满原型的生成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参数则会在目录下生成两份代码,1份为.class代码。1份为.java代码。.class代码,能够因此包装未来使用。java代码能够直接Copy到我们的花色中运作。

 

退换代码

 

图片 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数据发送和接收的格式。大家有要求选择3个工具来深远的打听Web瑟维斯.
  大家利用TCP/IP Monitor来监督拦截请求和响应具体数额的一体化经过。 

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

以下发出HTTP请求

会生成:data_pb2.py
与 data_pb2_grpc.py

图片 3

data_pb二.py是劳务接口映射

  响应的消息,同发送音讯同样,先必须是HTTP协议,然后再依据SOAP协议。

data_pb2_grpc.py方法映射

图片 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地图