在前一篇文章《Grpc框架实战微服务调用系列(七)实现grpc的客户端》我们实现了grpc客户端得需求,但是在客户端调用得时候,我们可以看到这里使用得是内部类接收返回结果得。如下图:
像这种方式的话,我们其实一般都用在异步处理的情况下。如果是放在线上的实时接口上,这种方式就不太适合了。这是为什么呢?
其实主要是因为我们在定义proto文件的时候,我们把response添加了关键词stream,示例如下:
这种就相当于是流式的返回,所以如果我们想要把这种服务端放在线上这种同步的接口上使用的话,一般我们就不用带有这个stream关键词,所以在这里我们演示一下:
一、重新编译userservice.proto
这里我们把这个userservice.proto的文件里面的list方法的stream去掉,然后重新编译下这两个proto文件,示例如下:
编译之后,我们继续按照原来的方式把编译后的文件放在src/main/java文件中:
这里的示例还是一样的。
二、修改客户端
这里我们的服务端是不需要改的。所以我们只需要修改客户端即可,这里的客户端模块,我们需要使用UserServiceBlockingStub,所以在客户端里面我们的代码示例如下:
package org.grpc.client.controller; import org.grpc.api.user.dto.UserRequest; import org.grpc.api.user.dto.UserResponse; import org.grpc.api.user.service.UserServiceGrpc.UserServiceBlockingStub; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import net.devh.boot.grpc.client.inject.GrpcClient; @RestController @Slf4j public class UserController { @GrpcClient("grpc-server") private UserServiceBlockingStub userServiceStub; @RequestMapping("/getUser") public String getUser(@RequestParam("uid") int uid) { UserRequest request = UserRequest.newBuilder().setUid(uid).build(); UserResponse response = userServiceStub.list(request); return JSON.toJSONString(response); } }
然后我们把项目启动起来测试一下:
可以看到这里我们调用grpc结果正常,返回了对应的数据。
备注:
1、这里对应的实体如果直接返回对象的话,那么整个userResponse的所有属性都会被编译,因此这里我们建议使用beanutils转一下。
最后按照惯例附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...