Spring Boot+Nacos+gRPC代码演示

Spring Boot+Nacos注册中心+gRPC代码演示  
本文实现的是springboot接入nacos注册中心并使用grpc进行服务间通讯的功能,主要用来探索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对应着三种不同的类型,分别是AnnotationConfigServletWebServerApplicationContextAnnotationConfigReactiveWebServerApplicationContext以及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问题,手动设置下编辑器的属性。

勾掉自动配置,然后加上你的自己的路径。

终于写完了,感谢观赏~~

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值