Nacos 注册中心 – gRPC
文章目录
前言
gRPC 一开始由 Google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。
与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。
新秀Nacos出现就耀眼夺目,官网是这么介绍的:Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。废话不多说,直接上代码。
一、创建Maven项目
当然注册Nacos得先下载Nacos服务器,下载安装可参考博主其他文章。
首先感谢fafeidou[1], 此项目部分源码来至fafeidou的项目https://github.com/fafeidou/fast-cloud-nacos
- 点击New Project
-
选择Maven
-
填写GroupId、ArtifactId
二、引入依赖
<dependencies>
<dependency>
<groupId>fast.cloud.nacos</groupId>
<artifactId>fast-common-grpc</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.14</version>
</dependency>
</dependencies>
如果报错 Error:(103,55) java: -source 1.5 中不支持方法引用,可以添加以下可以解决
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
三、编写代码
此项目proto使用
fafeidou
的,不再重新定义,项目已被封装好了,一个@GRpcService注解就可以实现gRPC的注册,具体实现可以下载源码进行查看。
项目结构
-
com/itsqh/client 客户端实现
-
com/itsqh/controller 客户端测试
-
com/itsqh/grpc proto 生成文件
-
com/itsqh/fast/cloud/nacos/common.grpc.*
fafeidou
项目封装代码 -
com/itsqh/service 服务端实现
proto文件
GrpcTestService.proto
syntax = "proto3";
option java_generic_services = true;
option java_multiple_files = true;
option java_outer_classname = "GrpcTestServiceProto";
service GrpcTestService {
rpc reqString (GrpcTestService_Request_String) returns (GrpcTestService_Response_String) {};
rpc reqStringClientStream (stream GrpcTestService_Request_String) returns (GrpcTestService_Response_String){};
rpc reqStringServerStream (GrpcTestService_Request_String) returns(stream GrpcTestService_Response_String){};
rpc reqStringBothStream (stream GrpcTestService_Request_String) returns(stream GrpcTestService_Response_String){};
}
message GrpcTestService_Request_String {
string name = 1;
}
message GrpcTestService_Response_String {
string result = 1;
}
GrpcNacosConfig.proto
fafeidou将配置文件写在了此文件中,读者可自行提取出来,改为读取配置文件
syntax = "proto3";
import "google/protobuf/descriptor.proto";
option java_generic_services = true;
option java_multiple_files = true;
option java_outer_classname = "GrpcNacosProto";
// this config is a must if you want to integrate nacos with grpc
extend google.protobuf.MessageOptions {
int32 grpc_nacos_port = 50001;
string nacos_uri = 50002;
}
message GrpcNacosOptions {
option (nacos_uri) = "http://127.0.0.1:8848";
option (grpc_nacos_port) = 50051;
}
服务实现类
import com.itsqh.grpc.GrpcTestServiceGrpc;
import com.itsqh.grpc.GrpcTestService_Request_String;
import com.itsqh.grpc.GrpcTestService_Response_String;
import fast.cloud.nacos.common.grpc.annoation.GRpcService;
import io.grpc.stub.StreamObserver;
import org.springframework.beans.factory.annotation.Value;
@GRpcService
public class GrpcTestServiceImpl extends GrpcTestServiceGrpc.GrpcTestServiceImplBase {
@Value("${grpc.port}")
private int port;
@Override
public void reqString(GrpcTestService_Request_String request,
StreamObserver<GrpcTestService_Response_String> responseObserver) {
String name = request.getName();
GrpcTestService_Response_String build =
GrpcTestService_Response_String.newBuilder()
.setResult("success: hello " + name)
.build();
responseObserver.onNext(build);
responseObserver.onCompleted();
}
}
客户端实现
import com.itsqh.grpc.GrpcTestServiceGrpc;
import com.itsqh.grpc.GrpcTestService_Request_String;
import com.itsqh.grpc.GrpcTestService_Response_String;
import io.grpc.ManagedChannel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
public class HelloService {
@Autowired
ManagedChannel managedChannel;
private GrpcTestServiceGrpc.GrpcTestServiceBlockingStub blockingStub;
public String hello(String name) {
GrpcTestService_Response_String grpcTestService_response_string =
blockingStub.reqString(
GrpcTestService_Request_String
.newBuilder()
.setName(name)
.build()
);
return grpcTestService_response_string.getResult();
}
@PostConstruct
private void initializeClient() {
blockingStub = GrpcTestServiceGrpc.newBlockingStub(managedChannel);
}
}
编写测试
import com.itsqh.client.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
private HelloService helloService;
@GetMapping("/{name}")
public String sayHello(@PathVariable String name) {
return helloService.hello(name);
}
}
四、测试
启动服务
查看Nacos服务注册列表
客户端发送请求测试
参考资料
[1] fafeidou:
https://github.com/fafeidou
以上仅为博主学习笔记,仅供参考。如有错误,感谢指出!抱拳。需要源码的关注公众号
Java编程与思想
后台回复ym