proto中service 作用的理解

Posted 香吧香

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了proto中service 作用的理解相关的知识,希望对你有一定的参考价值。

转载请注明出处:

  在 proto 文件中,service 用于定义一组 RPC 方法,在服务端实现这些方法,并在客户端调用这些方法进行远程过程调用。

  service 的定义方式如下:

service MyService 
  rpc MyMethod(MyRequest) returns (MyResponse);

  其中,MyService 是服务的名称,MyMethod 是方法的名称,MyRequest 和 MyResponse 分别是输入和输出消息的类型。

  在 Java 中,使用 protoc 工具生成代码后,可以通过继承自动生成的 MyServiceGrpc 类来实现服务端和客户端。

  例如,服务端可以创建一个继承自 MyServiceGrpc.MyServiceImplBase 的类,实现 MyMethod 方法,处理客户端发送过来的 MyRequest 消息,并返回 MyResponse 响应消息。示例代码如下:

class MyServerImpl extends MyServiceGrpc.MyServiceImplBase 
  @Override
  public void myMethod(MyRequest request, StreamObserver<MyResponse> responseObserver) 
    // 处理请求消息
    ...
    // 发送响应消息
    MyResponse response = MyResponse.newBuilder().build();
    responseObserver.onNext(response);
    responseObserver.onCompleted();
  

  然后在启动服务器时将该服务添加到 ServerBuilder 中即可,示例代码如下:

Server server = ServerBuilder.forPort(PORT)
        .addService(new MyServerImpl())
        .build();
server.start();

  在客户端中,通过创建一个 MyServiceGrpc.MyBlockingStub 或 MyServiceGrpc.MyStub 对象来调用 MyMethod 方法。MyBlockingStub 提供了同步的阻塞式调用方式,而 MyStub 提供了异步的非阻塞式调用方式。示例代码如下:

ManagedChannel channel = ManagedChannelBuilder.forAddress(address, port).usePlaintext().build();
MyServiceGrpc.MyBlockingStub blockingStub = MyServiceGrpc.newBlockingStub(channel);
MyServiceGrpc.MyStub asyncStub = MyServiceGrpc.newStub(channel);

MyRequest request = MyRequest.newBuilder().build();
MyResponse response = blockingStub.myMethod(request);
asyncStub.myMethod(request, new StreamObserver<MyResponse>() 
  @Override
  public void onNext(MyResponse response) 
    // 处理响应消息
  

  @Override
  public void onError(Throwable t) 
    // 处理异常
  

  @Override
  public void onCompleted() 
    // 完成回调
  
);

  客户端发送请求时,首先创建一个 MyRequest 消息对象,并将其传递给对应的 BlockingStub 或 Stub 调用方法(例如 myMethod 方法)。BlockingStub 方法会直接返回响应消息,而 Stub 方法会使用 StreamObserver 来接收异步的响应消息或错误。

  在服务端接收到请求时,会根据请求消息里的方法名称调用相应的处理方法,并将请求消息作为参数传递给该方法提取所需信息并进行处理,然后返回所需的响应消息。整个过程中,双方都需要遵守相应的协议和格式规范。

 

  如果 proto 文件中没有定义 service,则使用 protoc 直接生成 Java 文件时并不会生成 gRPC 相关的类和方法。

  gRPC 的实现是基于 proto 文件中所定义的 Service,因此必须在 proto 文件中定义 Service 才能生成 gRPC 相关的类。

  proto 文件中service的示例:

syntax = "proto3";

package example;

message Greeting 
  string name = 1;


// 添加新的服务 Greeter
service Greeter 
  rpc SayHello(Greeting) returns (Greeting) 

 

深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用

SSM是sping+springMVC+mybatis集成的框架。

MVC即model view controller。

model层=entity层。存放我们的实体类,与数据库中的属性值基本保持一致。

service层。存放业务逻辑处理,也是一些关于数据库处理的操作,但不是直接和数据库打交道,他有接口还有接口的实现方法,在接口的实现方法中需要导入mapper层,mapper层是直接跟数据库打交道的,他也是个接口,只有方法名字,具体实现在mapper.xml文件里,service是供我们使用的方法。

mapper层=dao层,现在用mybatis逆向工程生成的mapper层,其实就是dao层。对数据库进行数据持久化操作,他的方法语句是直接针对数据库操作的,而service层是针对我们controller,也就是针对我们使用者。service的impl是把mapper和service进行整合的文件。

(多说一句,数据持久化操作就是指,把数据放到持久化的介质中,同时提供增删改查操作,比如数据通过hibernate插入到数据库中。)

controller层。控制器,导入service层,因为service中的方法是我们使用到的,controller通过接收前端传过来的参数进行业务操作,在返回一个指定的路径或者数据表。

在实际开发中的Service层可能被处理为实体Service层,而不是接口,业务逻辑直接写在Service(Class,不是Interface)层中,Controller直接调用Service,Service调用Mapper。

当然了,Service之间也是可以互相调用!

 

 技术图片

 

以上是关于proto中service 作用的理解的主要内容,如果未能解决你的问题,请参考以下文章

关于原型原型链和原型继承的理解

对于原型链自己浅薄的理解

原型链的理解

启动链码报rpc error: code = Unimplemented desc = unknown service protos.ChaincodeSupport start error(示例代码

原型和原型链的理解

JS原型链的理解和使用