Spring Boot+Nacos注册中心+gRPC代码演示
本文实现的是springboot接入nacos注册中心并使用grpc进行服务间通讯的功能,主要用来探索nacos和grpc的使用。
目录
nacos安装
首先介绍关于nacos的安装,本地虚拟机运行centos7,因为是测试代码所以可以直接单机版。
登录 https://nacos.io/zh-cn/index.html 下载最新的nacos的服务版本
下载的可能会比较慢,在此推荐使用第三方的下载工具,Internet Download Manager,只要复制下载地址,然后新建下载就可以了。下载以后直接把包传到Linux服务器。
新建一个自己喜欢的目录, mkdir /server/nacos
使用命令 rz 上传文件
上传完以后就可以解压文件了
tar -zcvf nacos-server-1.4.0.tar.gz
然后 进入解压以后的目录
cd /nacos/bin
这时候使用ls命令可以看到很多文件
这个startup.sh就是启动文件了
直接执行 ./startup.sh -m standalone 启动nacos -m standalone 表示是单机版运行
如何判断服务启动 ?
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
返回 OK 表示服务已经启动了
这时候还可以通过页面访问,如果你的实体机可以访问到虚拟机 直接使用IP 比如我的虚拟机 192.168.182.3:8848 然后就可以看到登录页面 默认的账号 nacos nacos
创建服务端
服务端的创建没啥可说的直接就启动IDEA 新建项目
可以看到自动生成了是引用nacos服务发现的项目,见下图
一个服务端就创建完成了,但是我们要使用grpc通讯的,所以要加上关于grpc的引用。
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.10.1.RELEASE</version>
</dependency>
图就不贴了 就是增加一个依赖就好了 ,服务还要连接nacos注册中心,这么就只需要配置下就OK 了
这个就是配置的地方,配置完以后我们想创建一个真正的服务,这时候就需要考虑下关于grpc的东西了 grpc这个就需要再来一个新的项目了,为什么是新的项目,因为grpc使用IDL协议定义自己的东西,也就是说他有自己的语言。
grpc项目搭建
随便新建一个maven的项目就好了
因为IDEA没有自带支持的proto的文件编辑器,此处需要增加一个插件 protocal buffer editor
安装完以后继续我们的lib的代码的编写,先添加引用一些必要的类库
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.31.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.31.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.31.0</version>
</dependency>
build下面增加这几个引用配置
好了 一些准备就绪,开始写代码吧
首先新建一个proto的文件
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.greatblue.demo.nacos.grpc.lib";
service HelloGrpc{
rpc sayHello(SayHelloRequest) returns(SayHelloResponse) {}
}
message SayHelloRequest {
string userName = 1;
}
message SayHelloResponse {
string message = 1;
}
文件就这样写完了 ,解读下 service 标识一个服务, 后面的SayHelloRequest标识传递参数 return表示返回参数。
定义完以后,生成java包,先使用插件生成JAVA的调用代码。
然后安装到本地的maven仓库
好了安装完毕,现在服务端那边就可以继续往下走了。
实现服务端
回到刚才服务的项目,增加上一步中我们新建的lib包的引用。
自定义service 实现 lib中的Base
好了 启动服务
看了下nacos的服务列表 不好没有注册上,启动代码里面也没有,看下nacos的start,肯定有个开关
果然找到两个加载条件,配置文件果断加上,
然而并没有什么用,继续看代码 ……跟踪发现好像是问题出在这里
然后继续看,里面的判断
这个红框框是null返回了false,不走下面的start了,这个属性咋来的呢?
事件通知…… 那这个到底是什么事件?
是这个东西发布的事件。SpringCloud
本身对于服务注册的时机,是在发生WebServerInitializedEvent
事件之后,
protected ConfigurableApplicationContext createApplicationContext() {
Class<?> contextClass = this.applicationContextClass;
if (contextClass == null) {
try {
switch (this.webApplicationType) {
case SERVLET:
contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
break;
case REACTIVE:
contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
break;
default:
contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
}
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Unable create a default ApplicationContext, "
+ "please specify an ApplicationContextClass",
ex);
}
}
return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);
}
复制代码
contextClass
对应着三种不同的类型,分别是AnnotationConfigServletWebServerApplicationContext
、AnnotationConfigReactiveWebServerApplicationContext
以及AnnotationConfigApplicationContext
,而这三个中,只有前面两个Context
会触发WebServerInitializedEvent
事件的下发。
好了问题找到,我们只需要让他用前面的两种就行,直接用最简单的方式,添加一个jar包引用
好了 顺利注册服务
创建并实现客户端
客户端的代码很简单的啦,实现一个服务直接调用就可以了
新建项目以后 添加引用 注意这块是调用方 所以就要引用client的包了
别忘了这个包 咱们的GRPC类库
<dependency>
<groupId>org.greatblue.demo</groupId>
<artifactId>nacos-grpc-lib</artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
好了,都引用完成 写一个服务测试下
还要加个配置
注意事项
关于grpc的编辑,引用外部的proto文件的idea可能遇到 can not relove xxx.proto问题,手动设置下编辑器的属性。
勾掉自动配置,然后加上你的自己的路径。
终于写完了,感谢观赏~~