Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >gRPC rocks build your first gRPC service(part 2)

gRPC rocks build your first gRPC service(part 2)

作者头像
jimmyhzhao
发布于 2022-04-10 04:04:07
发布于 2022-04-10 04:04:07
25400
代码可运行
举报
文章被收录于专栏:SkemaloopSkemaloop
运行总次数:0
代码可运行

In the previous aritile, we have created the schema. In this article, I will introduce how to generate the stub and server code.

Publish Schema

After click the create schema, the protobuf has been pushed to the sandbox repo of my github.

github repo

The path follows the rules we have defined in the previous article. After the schema is published to the GitHub repo, the next step is to generate the stub and server code according to the schema.

Publish Stub

Click the Next Step button to generate the stub code.

generate stub

By default, skemakit supports java snd golang. You can review the code generated. The stub code can be used by both he client and server to serialize and deserialize the messages between server and clients.

golang and java stub

Generate Server Code

Next we can generate the server code boilerplate, which is a java or golang project that you will add your business logic into.

Then you can check your prototol list to download your server boilerplate code.

download server code

Let`s take java as an example.

Download the java server code and unzip to a folder. The code structure is like below.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
~/Downloads/ cd sample_package_grpc-java_draft 
 ~/Downloads/sample_package_grpc-java_draft/ ls
pom.xml               sample_package       sample_package-client
 ~/Downloads/sample_package_grpc-java_draft/ tree
.
├── pom.xml
├── sample_package
│   ├── pom.xml
│   ├── src
│   │   ├── main
│   │   │   ├── java
│   │   │   │   └── com
│   │   │   │       └── example
│   │   │   │           └── server
│   │   │   │               ├── SayHelloService.java
│   │   │   │               ├── SayHiService.java
│   │   │   │               └── ServiceApplication.java
│   │   │   └── resources
│   │   │       └── application.yaml
│   │   └── test
│   │       └── java
│   │           └── README.md
│   └── target
│       └── README.md
└── sample_package-client
  ├── pom.xml
  ├── src
  │   ├── main
  │   │   ├── java
  │   │   │   └── com
  │   │   │       └── example
  │   │   │           └── client
  │   │   │               ├── ClientApplication.java
  │   │   │               ├── controller
  │   │   │               │   └── ClientController.java
  │   │   │               └── service
  │   │   │                   ├── ClientService.java
  │   │   │                   └── impl
  │   │   │                       └── ClientServiceImpl.java
  │   │   └── resources
  │   │       └── application.yaml
  │   └── test
  │       └── java
  │           └── README.md
  └── target
      └── README.md
​
25 directories, 16 files
​
​

Let`s edit the SayHiService.java to respond a request. The service will echo the message I send through the request.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.example.server;import com.skemaloop.test.SayHiGrpc;
import com.skemaloop.test.SayHiOuterClass;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;
​
@GrpcService
public class SayHiService extends SayHiGrpc.SayHiImplBase {
   @Override
   // SayHello
   public void sayHello(SayHiOuterClass.HelloRequest request,
   StreamObserver<SayHiOuterClass.HelloReply> responseObserver) {
       // PbServiceOuterClass.HelloReply reply = PbServiceOuterClass.HelloReply.newBuilder().setMsg("Msg: Hello," + request.getMsg() + "\n").build();
       SayHiOuterClass.HelloReply reply =SayHiOuterClass.HelloReply.newBuilder().build();
       // add a business logic here
       responseObserver.onNext(reply);
       responseObserver.onCompleted();
  }}

Build your project by maven.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn package

Start your service.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar sample_package-0.0.1-SNAPSHOT.jar 
​
.   ____         _           __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot ::               (v2.4.0)2022-04-02 12:48:24.162 INFO 80519 --- [           main] com.example.server.ServiceApplication   : Starting ServiceApplication using Java 11.0.12 on JIMMYHZHAO-MB3 with PID 80519 (/Users/huizhao/Downloads/sample_package_grpc-java_v1.0.1/sample_package/target/sample_package-0.0.1-SNAPSHOT.jar started by huizhao in /Users/huizhao/Downloads/sample_package_grpc-java_v1.0.1/sample_package/target)
2022-04-02 12:48:24.164 INFO 80519 --- [           main] com.example.server.ServiceApplication   : No active profile set, falling back to default profiles: default
2022-04-02 12:48:24.702 INFO 80519 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-04-02 12:48:24.708 INFO 80519 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-04-02 12:48:24.708 INFO 80519 --- [           main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.39]
2022-04-02 12:48:24.739 INFO 80519 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-04-02 12:48:24.739 INFO 80519 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 538 ms
2022-04-02 12:48:24.831 INFO 80519 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2022-04-02 12:48:24.940 INFO 80519 --- [           main] g.s.a.GrpcServerFactoryAutoConfiguration : Detected grpc-netty-shaded: Creating ShadedNettyGrpcServerFactory
2022-04-02 12:48:25.018 INFO 80519 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-04-02 12:48:25.075 INFO 80519 --- [           main] n.d.b.g.s.s.AbstractGrpcServerFactory   : Registered gRPC service: sample_module.sample_package.SayHi, bean: sayHiService, class: com.example.server.SayHiService
2022-04-02 12:48:25.076 INFO 80519 --- [           main] n.d.b.g.s.s.AbstractGrpcServerFactory   : Registered gRPC service: grpc.health.v1.Health, bean: grpcHealthService, class: io.grpc.protobuf.services.HealthServiceImpl
2022-04-02 12:48:25.076 INFO 80519 --- [           main] n.d.b.g.s.s.AbstractGrpcServerFactory   : Registered gRPC service: grpc.reflection.v1alpha.ServerReflection, bean: protoReflectionService, class: io.grpc.protobuf.services.ProtoReflectionService
2022-04-02 12:48:25.159 INFO 80519 --- [           main] n.d.b.g.s.s.GrpcServerLifecycle         : gRPC Server started, listening on address: *, port: 9999
2022-04-02 12:48:25.166 INFO 80519 --- [           main] com.example.server.ServiceApplication   : Started ServiceApplication in 1.963 seconds (JVM running for 2.272)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
QTreeView使用总结13,自定义model示例,大大优化性能和内存[通俗易懂]
前面简单介绍过Qt的模型/视图框架,提到了Qt预定义的几个model类型: QStringListModel:存储简单的字符串列表 QStandardItemModel:可以用于树结构的存储,提供了层次数据 QFileSystemModel:本地系统的文件和目录信息 QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel:存取数据库数据
全栈程序员站长
2022/09/03
2.6K0
QTreeView使用总结13,自定义model示例,大大优化性能和内存[通俗易懂]
Qt树形控件QTreeView使用1——节点的添加删除操作[通俗易懂]
QtreeView是ui中最常用的控件,Qt中QTreeWidget比QTreeView更简单,但没有QTreeView那么灵活(QTreeWidget封装的和MFC的CTreeCtrl很类似,没有mvc的特点)。
全栈程序员站长
2022/09/06
6.9K0
【QT】QT模型/视图
MVC(Model-View-Controller)包括了3个组件:模型(model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;控制(Controller)定义了用户界面对用户输入的反应方式。
半生瓜的blog
2023/05/13
3.1K0
【QT】QT模型/视图
C++ Qt开发:StandardItemModel数据模型组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍StandardItemModel数据模型组件的常用方法及灵活运用。
王瑞MVP
2023/12/23
6320
C++ Qt开发:StandardItemModel数据模型组件
QTreeView使用总结7,右键菜单
void customContextMenuRequested(const QPoint &pos);
全栈程序员站长
2022/08/25
5.1K0
QTreeView使用总结7,右键菜单
25.QT-模型视图
在Qt中,不管模型以什么结构组织数据,都必须为每个数据提供不同的索引值,使得视图能通过索引值访问模型中的具体数据
诺谦
2018/07/31
1.6K0
25.QT-模型视图
Qt-自定义可编辑模型
不管是哪种编程语言,在这里看不到一些系列的教程,当然也是由于笔者掌握的知识不够深,这里只会发送一些相关语言的实例,供大家参考学习。有时候笔者会分享一些自己觉得好的书籍,教学视频,或者好的学习网站给你们,这就需要你们有自学的能力,学习从来都不是件轻松的事,只有好好的坚持下去,才能成为大神。如果对于Qt有兴趣的伙伴,不妨去学习一下豆子博主的系列教程,会对你有所帮助。
kdyonly
2023/03/03
4070
60.QT-QabstractTableModel模型、重写sort方法排序
在之前25.QT-模型视图章节中,没有具体描述如何重写model模型,所以本章以QabstractTableModel为例,来谈谈model如何实现.
诺谦
2020/12/18
3.6K0
60.QT-QabstractTableModel模型、重写sort方法排序
Qt Model View TreeView及对应Model
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多老铁~
用户5908113
2020/02/17
2.8K0
Qt Model View TreeView及对应Model
Qt-使用控件ListView
如何对ListView进行数据添加,只需要设置ListView的Model即可。 1.创建一个需要展示的数据的类
kdyonly
2023/03/03
9880
Qt ModelView教程——设置表头与可编辑Table
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多老铁~
用户5908113
2020/02/17
3.9K1
Qt ModelView教程——设置表头与可编辑Table
QTableView 一列添加两个按钮
在QTableView的一列里添加两个按钮,之前添加一个按钮的思路是一样的,只是计算了一下按钮的宽,放两个按钮而已。 本例源代码:QtTowButtons.rar 看一下列的效果 看一下添加两个按钮的
lpxxn
2018/01/31
3.8K0
QTableView 一列添加两个按钮
C/C++ Qt StandardItemModel 数据模型应用
QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,Model/View 是Qt中的一种数据编排结构,其中Model代表模型,View代表视图,视图是显示和编辑数据的界面组件,而模型则是视图与原始数据之间的接口,通常该类结构都是用在数据库中较多,例如模型结构负责读取或写入数据库,视图结构则负责展示数据,其条理清晰,编写代码便于维护。
王瑞MVP
2022/12/22
1.7K0
C/C++ Qt StandardItemModel 数据模型应用
【QML与C++混合编程】用QVariantList传递数组类型成员
更新:Record类要用指针,QObject 不能有拷贝函数。 我有一个C++中自定义的ReaderModel,继承自QAbstractListModel类,传递给了QML。 它的me成员是一个Reader指针,Reader有个成员是RecordModel。 通过reader获取的recordModel,在qml中类型是QVariant(RecordModel),我没法把它作为一个ListView的model。 要怎么让它绑定给view呢? 我尝试者把数据拷贝到一个直接传给qml的recordModel,但是当数据之后发生了变化时,视图就不会更新,除非再次拷贝,这样效率不可观。
饶文津
2020/06/02
4K0
Qt Model/View教程——只读Table
一直想学习Qt Model/View,最终还是看的官方教程,现在将官方教程重新在梳理下。
用户5908113
2020/02/12
2.1K0
QT 播放器之列表[通俗易懂]
重写自定义菜单函数,如果右键的时候没有选中任何索引,需要把播放,删除,打开目录设置为不可点击
全栈程序员站长
2022/07/01
2K0
QTreeview custom
大家好,又见面了,我是你们的朋友全栈君。设定字体 virtual QVariant MyModel::data( const QModelIndex &index, int role ) const { if ( index.isValid() && role == Qt::ForegroundRole ) { if ( index.column() == 2 ) { return QVariant( QColor( Qt::re
全栈程序员站长
2022/08/31
7790
Qt 学习之路 2(45):模型
http://www.devbean.net/2013/02/qt-study-road-2-model/
bear_fish
2018/09/20
9260
Qt 学习之路 2(45):模型
26.QT-模型视图之自定义委托
由于模型负责组织数据,而视图负责显示数据,所以当用户想修改显示的数据时,就要通过视图中的委托来完成
诺谦
2018/07/31
2.4K0
26.QT-模型视图之自定义委托
QTableView + QStandardItemModel模式显示表格冻结列(模板)
QTableView 是 Qt 框架中一个用于显示和编辑表格数据的控件。它提供了一个灵活的界面,允许用户通过行和列来浏览和修改数据。QTableView 支持多种数据模型,如 QAbstractItemModel,并且可以与模型一起使用,以提供数据视图。此外,QTableView 还提供了排序、筛选和分组等功能,以满足不同的需求。
Qt历险记
2024/07/29
5780
QTableView + QStandardItemModel模式显示表格冻结列(模板)
相关推荐
QTreeView使用总结13,自定义model示例,大大优化性能和内存[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验