grpc 使用demo示例

news2025/1/16 14:04:01

一、 编写proto文件

   1、idea新建java项目,在maven中引入以下依赖:

 <dependencies>
        <!--grpc底层通信组件-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty-shaded</artifactId>
            <version>1.42.0</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-protobuf</artifactId>
            <version>1.42.0</version>
        </dependency>
        <!--存根-->
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-stub</artifactId>
            <version>1.42.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>annotations-api</artifactId>
            <version>6.0.53</version>
            <!--provided:只能作用在编译和测试时,同时没有传递性-->
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.9.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

    </dependencies>


    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.6.2</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.6.1</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.17.3:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.42.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

  2、proto文件

syntax = "proto3";
//生成java类所在的包
option java_package = "com.cn.news.proto";

//生成多个类
option java_multiple_files = false;

//生成外层类类名
option java_outer_classname = "NewsProto";

//包名
package news;

//grpc要调用的service
service NewsService{
    //list是方法名,NewsRequest代表传入参数,NewsResponse代表返回响应
    rpc list(NewsRequest) returns (NewsResponse){}
}

//请求体
message NewsRequest{
    string date = 1;
    NewsDetail body = 2;
}

//响应体
message NewsResponse{
    //repeated说明是一个集合(数组),数组每一个元素都是News对象
    repeated News news = 1;
}

//News新闻实体对象
message News{
    //对应java的int
    int32 id = 1;
    //新闻标题
    string title = 2;
    //新闻内容
    string content = 3;
    //对应java的long
    int64 createTime = 4;
}

message NewsDetail{
    //1表示热点新闻 2表示普通新闻
    int32 msgType = 1;
    //0未读 1-已读
    int32 msgStatus = 2;
}

 3. 编译并生成java文件

二、 编写grpc服务端

    1、实现  NewsServiceGrpc.NewsServiceImplBase 接口,提供服务方法调用

package com.cn.news.service;

import com.cn.news.proto.NewsProto;
import com.cn.news.proto.NewsServiceGrpc;
import io.grpc.stub.StreamObserver;

/**
 * description: NewService <br>
 * date: 23.4.12 15:52 <br>
 * author: cn_yaojin <br>
 * version: 1.0 <br>
 */
public class NewService extends NewsServiceGrpc.NewsServiceImplBase {

    @Override
    public void list(NewsProto.NewsRequest request, StreamObserver<NewsProto.NewsResponse> responseObserver) {
        String date = request.getDate();
        System.out.println("收到客户端请求了,时间:" + date + ",参数体:" + request.getBody().getMsgType());
        NewsProto.NewsResponse newList = null;
        try {
            NewsProto.NewsResponse.Builder newListBuilder = NewsProto.NewsResponse.newBuilder();

            String title = "";
            if (request.getBody().getMsgType() == 1) {
                title = "实时热点";
            } else if (request.getBody().getMsgType() == 2) {
                title = "精准扶贫";
            } else {
                title = "为人民服务";
            }


            NewsProto.News news = NewsProto.News.newBuilder()
                    .setId(request.getBody().getMsgType())
                    .setTitle(title)
                    .setContent(request.getBody().getMsgType() + ":" + title)
                    .setCreateTime(System.currentTimeMillis())
                    .build();
            newListBuilder.addNews(news);

            newList = newListBuilder.build();
        } catch (Exception e) {
            e.printStackTrace();
            responseObserver.onError(e);
        } finally {
            responseObserver.onNext(newList);
        }

        responseObserver.onCompleted();
    }
}

    2、 grpc服务端,启动

package com.cn.news.service;

import io.grpc.Server;
import io.grpc.ServerBuilder;

/**
 * description: GRpcServer <br>
 * date: 23.4.12 16:29 <br>
 * author: cn_yaojin <br>
 * version: 1.0 <br>
 */
public class GRpcServer {

    public static void main(String[] args) {
        try {
            Server server = ServerBuilder.forPort(1031).addService(new NewService()).build().start();
            System.out.println("服务已启动,端口:" + server.getPort());
            server.awaitTermination();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

三、 编写grpc客户端,启动

package com.cn.news.service;

import com.cn.news.proto.NewsProto;
import com.cn.news.proto.NewsServiceGrpc;
import io.grpc.Channel;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * description: GRpcClient <br>
 * date: 23.4.12 16:32 <br>
 * author: cn_yaojin <br>
 * version: 1.0 <br>
 */
public class GRpcClient {

    private NewsServiceGrpc.NewsServiceBlockingStub newsServiceImplBase;


    public GRpcClient(Channel channel) {
        this.newsServiceImplBase = NewsServiceGrpc.newBlockingStub(channel);
    }

    public static void main(String[] args) {
        //初始化client与服务端的连接

        ManagedChannel channel = ManagedChannelBuilder.forTarget("127.0.0.1:1031")
                .usePlaintext()
                .build();

        GRpcClient gRpcClient = new GRpcClient(channel);

        //定时任务模拟提交数据
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

                //以下是构造请求参数
                NewsProto.NewsDetail.Builder detail = NewsProto.NewsDetail.newBuilder();
                long t = System.currentTimeMillis();
                if (t % 5 == 0) {
                    detail.setMsgType(1);
                } else if (t % 5 == 1) {
                    detail.setMsgType(3);
                } else {
                    detail.setMsgType(2);
                }
                detail.setMsgStatus(0);

                NewsProto.NewsRequest request = NewsProto.NewsRequest
                        .newBuilder()
                        .setDate(t + "")
                        .setBody(detail.build())
                        .build();
                gRpcClient.list(request);
            }
        }, 10, 30, TimeUnit.SECONDS);

        try {
            Thread.sleep(Long.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    /**
     * 调用grpc的提供的服务(此处调用NewService下的list方法)
     *
     * @param request
     */
    public void list(NewsProto.NewsRequest request) {
        try {
            NewsProto.NewsResponse response = newsServiceImplBase.list(request);
            List<NewsProto.News> list = response.getNewsList();
            if (list != null) {
                for (NewsProto.News t : list) {
                    System.out.println(String.format("收到服务端响应了,标题:%s,内容:%s,时间:%s", t.getTitle(), t.getContent(), t.getCreateTime()));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

四、启动后的运行示例 

grpc服务端
grpc服务端

 

grpc客户端
grpc客户端

 五、 编写node客户端

const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');

//以下proto文件与当前的index.js在同一个目录下
const PROTO_PATH = 'helloworld.proto';

const packageDefinition = protoLoader.loadSync(PROTO_PATH);
const hello_proto = grpc.loadPackageDefinition(packageDefinition).news;

function main() {
  const client = new hello_proto.NewsService('127.0.0.1:1031',
    grpc.credentials.createInsecure());
    var detail={
        msgType:2,
        msgStatus:2 
    };
    var user={
        date:123123123123,
        body: detail
    };

  client.list(user, function (err, response) {
    var items = response.news

    console.log('Greeting:', items);
  });
}

main();
node客户端运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java笔记_10(项目阶段----拼图游戏)

项目阶段 页面搭建创建窗口 界面设置和菜单搭建创建菜单 添加图片图片对象 打乱图片用一维数组添加值到二维数组中 事件美化页面移动图片查看完整图片&#xff0c;作弊器&#xff0c;判断胜利计步器和菜单业务的实现弹窗创建 更换图片和登陆页面的建立表单 所有源码的实现游戏规…

es7.x集群部署-多台物理机部署-docker环境部署-docker-compose管理

es集群部署文档 部署es服务的三台服务器的ip和host分分别是&#xff1a; iphost_name192.168.1.2web02192.168.1.3storage02192.168.1.4Storage03 这个配置需要在服务器上编写对应的hosts文件&#xff0c;然后才可以使用host进行配置。 本次部署没有外挂配置文件&#xff0…

容器内无tcpdump,如何在宿主机上抓容器的包

抓包的容器里&#xff0c;没有安装tcpdump 命令&#xff0c;我们可以去容器所在宿主机上&#xff0c;使用 nsenter 命令切换网络命名空间后&#xff0c;使用宿主机上的tcpdump 命令&#xff0c;对容器进行抓包分析。 此例中&#xff0c;我要抓取容器中端口是5240的包&#xff…

react3:受控组件(表单默认变成受控)-组件通信 - typescript项目(表单,tabbar)

受控组件&#xff1a;表单 非受控组件表单元素值不受所在组件状态的控制, 我们将这样的表单元素称作: 非受控组件. 受控组件受控组件 : 值受到 React 组件状态控制的表单元素一般是通过 defaultValue 属性, onChange 事件配合将非受控组件变为受控组件. 多表单元素操作 &#…

Unity中GPUInstance详解

为什么要用GPUInstance 在没有GPUInstance此技术之前&#xff0c;对于像草地、树木&#xff0c;割草游戏&#xff0c;它们往往是数据量很大&#xff0c;但同时又只存在微小的差别如位置、旋转、颜色等。如果像常规物体那样进行渲染&#xff0c;所使用的绘制指令必然很多…

3.3 向量与矩阵的范数

学习目标&#xff1a; 要学习向量与矩阵的范数&#xff0c;我会采取以下几个步骤&#xff1a; 了解基本概念&#xff1a;首先&#xff0c;我会了解向量和矩阵的范数的基本概念和定义&#xff0c;以及它们的性质和特点&#xff0c;这是理解和掌握范数的基础。 学习具体算法&am…

Nacos简介、基本概念、基本架构、安装部署

官网&#xff1a;https://nacos.io/zh-cn/ 官方文档&#xff1a; 什么是 Nacos Github&#xff1a;https://github.com/alibaba/nacos&#xff0c;阿里巴巴开源项目。 简介 什么是Nacos&#xff1f; Nacos&#xff1a;(Dynamic) Naming and Configuration Service&#xf…

空间相关性----地理探测器--学习记录

目录 相关教程--软件及数据准备 R语言数据分析1、R包、数据准备、GD综合代码2、分异及因子探测---q值 gd3、交互作用探测---评估因子gdinteract4、风险区探测--显著性--gdrisk()5、生态探测---交叉影响--gdeco() 数据准备注意&#xff1a;使用Arcgis首先创建.gdb&#xff08;本…

数学建模第二天:数学建模工具课之MATLAB绘图操作

目录 一、前言 二、二维绘图 1、曲线图、散点图plot 2、隐函数、显函数与参数方程的绘图 ①ezplot ②fplot 三、三维绘图 1、单曲线plot3 2、多曲线plot3 3、曲面 ①实曲面surf ②网格曲面mesh 四、特殊的二维、三维图 1、极坐标图polar 2、平面散点图scatter …

学网络安全都是一群什么人?

大家好呀&#xff0c;我是知了姐&#xff0c;又是一期学员故事栏目~ 3月下旬知了堂信安方向开新班&#xff0c;知了姐跟着去采访&#xff0c;了解到新学员们的求学故事&#xff0c;嘿你别说&#xff0c;虽然大家出身专业不同、经历背景不同&#xff0c;如今却在同一个地点相遇…

CAMX大气臭氧来源解析模拟

查看原文>>>基于CAMX大气臭氧来源解析模拟与臭氧成因分析实践技术应用 随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因…

【微信小程序】生命周期,插槽和组件间通信

一、组件的生命周期 1.1 组件全部的生命周期函数 小程序组件可用的全部生命周期如下表所示 生命周期函数参数描述说明created无在组件实例刚刚被创建时执行attached无在组件实例进入页面节点树时执行ready无在组件在视图层布局完成后执行moved无在组件实例被移动到节点树另一…

实战案例|聚焦攻击面管理,腾讯安全威胁情报守护头部券商资产安全

金融“活水”润泽千行百业&#xff0c;对金融客户来说&#xff0c;由于业务场景存在特殊性和复杂性&#xff0c;网络安全必然是一场“持久战”。如何在事前做好安全部署&#xff0c;构建威胁情报分析的防护体系至为重要&#xff0c;实现更为精准、高效的动态防御。 客户名片 …

Flink系列-8、Flink DataStream的简介和API开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录 流处理的介…

开放式耳机真的比封闭式强很多吗?推荐几款主流的开放式耳机

​开放式耳机&#xff0c;顾名思义&#xff0c;就是通过骨头振动来传导声音的耳机。相比于传统耳机&#xff0c;它的声音传输更加开放&#xff0c;不会对耳膜造成压迫感&#xff0c;也不会对耳膜旁的内毛细胞造成损害。因此开放式耳机既是运动蓝牙耳机&#xff0c;又是音乐蓝牙…

MAC 通过 brew安装 redis 并且设置开机启动

一.安装 mysql 1.安装 mysql 1.安装 redis brew install redis2.查看 redis 安装目录 brew list redis 记住安装目录 3.启动 redis 进入到安装目录下面 cd /opt/homebrew/Cellar/redis/7.0.11 cd bin ./redis-server 二.设置开机启动 上面安装好之后,redis 虽然能正常…

个性化的客户服务策略(二)

继续上次的策略&#xff0c;今天我们继续分享接下来的几点提供更加个性化的客户服务的方法。 6&#xff09;利用社交媒体发挥自己的优势 请求进入社交媒体渠道原因有很多。例如&#xff0c;愤怒的客户可能会对帖子发送直接消息或评论&#xff0c;因为它感觉更直接&#xff0c;…

【刷题之路Ⅱ】LeetCode 3381.搜索旋转排序数组ⅠⅡ

【刷题之路Ⅱ】LeetCode 33&81.搜索旋转排序数组Ⅰ&Ⅱ 一、题目描述二、解题1、方法1——暴力法1.1、思路分析1.2、代码实现 2、方法2——二分法2.1、思路分析2.2、代码实现2.3、升级到81题2.3.1、改进思路分析2.3.1、改进代码实现 3、改进二分法3.1、思路分析3.2、代码…

STM32F407ZIT6 国产替代者NS32F407ZIT6 NS32F407ZGT6 软硬件通用 无需修改任何程序代码

NS32F407ZIT6 NS32F407ZGT6 器件基于高性能的 ARM Cortex-M4 32位 RISC 内核&#xff0c;工作频率高达 168MHz。 Cortex-M4 内核带有单精度浮点运算单元(FPU)&#xff0c;支持所有 ARM 单精度数据处理指令和数据类型。它还 具有一组DSP指令和提高应用安全性的一个存储器保护…

Windows环境下调试DAB-DETR与Deformable-DETR

先前都是在服务器上运行DETR的相关程序&#xff0c;服务器使用的是Linux&#xff0c;所以运行较为简单&#xff0c;但如果想要简单的debug的话就没必要使用服务器了&#xff0c;今天便来在Winodws环境下调试DETR类项目&#xff0c;这里以Deformable-DETR与DAB-DETR为例。 首先是…