在前面的文章《Grpc框架实战微服务调用系列(二)Grpc框架项目api层实战》我们已经把api层定义了,这里的话我们来实现以下grpc的服务端。
一、创建grpc-server
在这里的话我们在GrpcDemo下创建一个module,这个module主要为grpc-server作为rpc的服务端,示例图如下:
二、引入api依赖
在之前的文章中我们介绍过,定义的api层会在client端和server端一起使用,所以这里我们需要把api的maven依赖引入到创建的server的module里面来,所以server的pom内容如下:
<dependencies> <dependency> <groupId>com.rpc.api</groupId> <artifactId>grpc-api</artifactId> <version>1.0</version> </dependency> <!-- grpc server和spring-boot集成框架 --> <dependency> <groupId>net.devh</groupId> <artifactId>grpc-server-spring-boot-starter</artifactId> <version>2.10.1.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
这里我们同时引入了grpc-server-spring-boot-starter的依赖,主要是服务端需要使用一些注解。
三、实现接口
接着我们就来实现下在api层定义的接口,我们这里实现的接口是在api层编码出来的base类,示例如下:
package org.grpc.server.impl; import org.grpc.api.user.dto.UserRequest; import org.grpc.api.user.dto.UserResponse; import org.grpc.api.user.service.UserServiceGrpc.UserServiceImplBase; import io.grpc.stub.StreamObserver; import lombok.extern.slf4j.Slf4j; import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @Slf4j public class UserServiceIml extends UserServiceImplBase { @Override public void list(UserRequest request, StreamObserver<UserResponse> responseObserver) { // 从request获取信息 int uid = request.getUid(); log.info("获取到的uid是:{}", uid); // 这里暂时没有对接数据库,因此直接创建一个用户 UserResponse userinfo = UserResponse.newBuilder().setUid(1).setName("张三").setAge(10).build(); // 把对象写给客户端 responseObserver.onNext(userinfo); // 写完毕 responseObserver.onCompleted(); } }
上面就是具体的实现,是不是很简单,主要的步骤是:
1、在实现类里面添加@GrpcService注解 2、这里我们虽然是实现api层定义的接口,但是我们这里具体的java代码实现是使用extends的,因为proto编译出来的接口是一个抽象类。 3、这里我们要实现的类是以Base结尾的抽象类,这个抽象类是proto生成的接口类里面的一个内部类。 4、需要获取request的话,可以直接在request属性里面获取即可。 5、需要返回response的话,需要分为2步骤,第一步骤是把对象写出去,第二步骤是声明流完成。
所以这里大家可以看到,实现一个grpc的服务端是不是很简单?
四、创建启动类
接着我们创建一个springboot的启动类,示例代码如下:
package org.grpc.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class GrpcServerApplication { public static void main(String[] args) { SpringApplication.run(GrpcServerApplication.class, args); } }
这里我们由于使用的是springboot作为基础框架,所以启动类还是@SpringbootApplication注解。
备注:
1、这里的服务端由于我们是grpcserver,所以这里不对外提供http的服务,因此整个项目引入的依赖是: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> 而不是: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
此时如果服务启动的话,就会启动netty,而不是默认的tomcat。走的是rpc二进制协议,不是http协议。
五、创建配置文件
这里我们既然是服务端,那么肯定是需要定义服务端的信息,例如端口,服务名等信息。所以这里我们在src/main/resources文件夹下创建一个application.yml,示例内容如下:
grpc: server: port: 3001 in-process-name: grpc-server spring: application: name: grpc-server
这里我们的配置内容主要有:
1、grpc服务端启动端口 2、grpc服务端服务名称 3、springboot服务名称
六、启动项目
接着我们把服务端启动起来,看下效果:
可以看到服务端已经可以正常启动起来了。然后我们使用apifox(apifox的测试教程见:《使用apifox工具调用grpc服务端的详细教程》)进行测试下:
可以看到服务端调用成功了,额米有任何问题。
最后按照惯例,附上本案例的源码,登陆后即可下载。
还没有评论,来说两句吧...