基于springboot的grpc服务端demo

news/2024/9/21 3:31:36/文章来源:https://www.cnblogs.com/krcc/p/18385123

1. Java


maven配置

点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>grpc-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>grpc-demo</name><description>grpc-demo</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><protobuf.version>3.23.4</protobuf.version><protobuf-plugin.version>0.6.1</protobuf-plugin.version><grpc.version>1.58.0</grpc.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>1.29.0</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>org.apache.tomcat</groupId><artifactId>annotations-api</artifactId><version>6.0.53</version><scope>provided</scope></dependency><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><version>3.1.0.RELEASE</version></dependency></dependencies><build>
<!--        os-maven-plugin:此插件可以检测当前系统信息-->
<!--        ${os.detected.classifier}:这个变量获取操作系统的版本,例如osx-x86_64--><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.7.0</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>${protobuf-plugin.version}</version><configuration><!-- 设置 protoc 的版本 --><protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact><!-- 设置插件的版本 --><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact><!-- proto文件目录 --><protoSourceRoot>${project.basedir}/src/main/resources</protoSourceRoot><!-- 设置输出目录 --><outputDirectory>${project.basedir}/src/main/java</outputDirectory><clearOutputDirectory>false</clearOutputDirectory></configuration><executions><execution><goals><!--编译消息对象--><goal>compile</goal><!--依赖消息对象,生成接口服务--><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build></project>

application.yml

grpc:server:port: 18081

proto文件

我的放在了resource目录下,是在maven配置中设置的

syntax = "proto3";option java_multiple_files = true;
option java_package = "com.example.grpcdemo.grpc.user.auto";
option java_outer_classname = "UserProto";service UserService {rpc saveUser (SaveUserRequest) returns (SaveUserReply);rpc queryUser (QueryUserRequest) returns (QueryUserReply);
}message SaveUserRequest {string name = 1;string age = 2;string sex = 3;
}message SaveUserReply {string status = 1;
}message QueryUserRequest{string name = 1;
}message QueryUserReply{string name = 1;string age = 2;string sex = 3;
}

打包之后auto文件夹下会自动生成编译后的文件



编辑你的服务类UserService

package com.example.grpcdemo.grpc.user;import com.example.grpcdemo.grpc.user.auto.QueryUserReply;
import com.example.grpcdemo.grpc.user.auto.QueryUserRequest;
import com.example.grpcdemo.grpc.user.auto.SaveUserReply;
import com.example.grpcdemo.grpc.user.auto.SaveUserRequest;
import com.example.grpcdemo.grpc.user.auto.UserServiceGrpc;
import io.grpc.stub.StreamObserver;
import net.devh.boot.grpc.server.service.GrpcService;@GrpcService
public class UserService extends UserServiceGrpc.UserServiceImplBase {@Overridepublic void saveUser(SaveUserRequest request, StreamObserver<SaveUserReply> responseObserver) {System.out.println(request.toBuilder().build());SaveUserReply success = SaveUserReply.newBuilder().setStatus("success").build();responseObserver.onNext(success);responseObserver.onCompleted();}@Overridepublic void queryUser(QueryUserRequest request, StreamObserver<QueryUserReply> responseObserver) {System.out.println(request.getName());QueryUserReply reply = QueryUserReply.newBuilder().setAge("12").setName("小王").build();responseObserver.onNext(reply);responseObserver.onCompleted();}}

使用apiPost调用接口


附带一些常用的格式

    @Overridepublic void query1(Query1Request request, StreamObserver<Query1Response> responseObserver) {Query1Response response = Query1Response.newBuilder().addUserArr(UserObj.newBuilder().setName("小王").setAge(20).build()).addUserArr(UserObj.newBuilder().setName("小李").setAge(21).build()).addUserArr(UserObj.newBuilder().setName("小赵").setAge(22)).addStringList("string1").addStringList("string2").putAMap("key1", "value1").putAMap("key2", "value2").build();responseObserver.onNext(response);responseObserver.onCompleted();}

接口返回:

2. 代理

浏览器目前不支持发送http2.0的请求,所以前端使用grpc-web封装请求,经过代理请求grpc服务端。nginx代理和envoy代理都可以。

     2.1 Nginx


    server {# TODO 1/2 配置监听的浏览器端口号listen       19090;http2 on;server_name  localhost;location / {# 重点!!需要将Content-Type更改为 application/grpc# grpc-web过来的是application/grpc-web+proto || application/grpc-web+text (取决于生成js代码时grpc-web_out 的mode选项,本文用grpcweb 则为application/grpc-web+proto)grpc_set_header Content-Type application/grpc;# grpc_set_header TE trailers;# TODO 2/2 配置要转到的grpc服务和端口号grpc_pass grpc://192.168.3.100:19094;# grpc_ssl_verify off; # 关闭对grpc服务器的ssl证书验证# 因浏览器有跨域限制,这里直接在nginx支持跨域if ($request_method = 'OPTIONS') {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Transfer-Encoding,Custom-Header-1,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent,X-Grpc-Web';add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain charset=UTF-8';add_header 'Content-Length' 0;return 204;}if ($request_method = 'POST') {add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Transfer-Encoding,Custom-Header-1,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent,X-Grpc-Web';add_header 'Access-Control-Expose-Headers' 'Content-Transfer-Encoding, grpc-message,grpc-status';add_header 'Content-Type' 'text/plain charset=UTF-8';}}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

     2.2 Envoy


envoy构建困难,好像目前只支持在docker部署
envoy中文网:https://icloudnative.io/envoy-handbook/docs/gettingstarted/setup/

envoy安装
# 获取镜像
docker pull envoyproxy/envoy# 启动 Envoy 容器时,可以用本地的 envoy.yaml 覆盖镜像中的 envoy.yaml
docker run -it -d \
--name envoy \
-p 19090:19090 \
-v /home/yk/envoyConfig/envoy.yaml:/etc/envoy/envoy.yaml\envoyproxy/envoy# 启动envoy
envoy -c envoy.yaml
envoy.yml
admin:access_log_path: /tmp/admin_access.logaddress:socket_address: { address: 0.0.0.0, port_value: 9901 }static_resources:listeners:- name: listener_0address:socket_address: { address: 0.0.0.0, port_value: 19090 }filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagercodec_type: autostat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match: { prefix: "/" }route:cluster: echo_servicetimeout: 0smax_stream_duration:grpc_timeout_header_max: 0scors:allow_origin_string_match:- prefix: "*"allow_methods: GET, PUT, DELETE, POST, OPTIONSallow_headers: keep-alive,user-agent,cache-control,content-type,content-transfer-encoding,custom-header-1,x-accept-content-transfer-encoding,x-accept-response-streaming,x-user-agent,x-grpc-web,grpc-timeoutmax_age: "1728000"expose_headers: custom-header-1,grpc-status,grpc-messagehttp_filters:- name: envoy.filters.http.grpc_webtyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb- name: envoy.filters.http.corstyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.cors.v3.Cors- name: envoy.filters.http.routertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Routerclusters:- name: echo_serviceconnect_timeout: 0.25stype: logical_dns# HTTP/2 supporttyped_extension_protocol_options:envoy.extensions.upstreams.http.v3.HttpProtocolOptions:"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptionsexplicit_http_config:http2_protocol_options: {}lb_policy: round_robinload_assignment:cluster_name: cluster_0endpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.3.100port_value: 19094

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博客园美化系列第一弹

博客园美化系列第一弹 首先要确保你已经申请开通博客「理由随便写,积极向上即可」,且已通过审核。 然后进入【设置】,申请 js 权限。 申请理由举例「从网上找的,当时直接复制上就通过了」: 尊敬的博客园管理员: 您好,我想通过 js 定制化我的博客,麻烦通过下我的申请。 …

高通ramdump

背景 高通平台下提供了一个工具,专门用来抓取内核死机以后的dump信息。如果只是非系统层面的crash(例如底层应用,安卓程序),则不能抓取dump信息。 在阅读一些文档的时候知道有这个功能,但是一直没时间尝试。 介绍 流程为: 1、进入dump模式:系统需要触发crash, 同时机器…

QL5010-16-ASEMI逆变焊机专用整流桥QL5010

QL5010-16-ASEMI逆变焊机专用整流桥QL5010编辑:ll QL5010-16-ASEMI逆变焊机专用整流桥QL5010 型号:QL5010 品牌:ASEMI 封装:KBPC-4 批号:2024+ 类型:整流模块 电流:50A 电压:1600V 安装方式:直插式封装 特性:大功率、整流桥 产品引线数量:4 产品内部芯片个数:4 产品…

解决方案 | IrfanView如何滑动滚轮图像缩放?

这是个bug,已经很多人反映了。目前没有比较好的解决方法,还是使用ctrl+滚轮最好。如果需要设置滚轮放大的话,按照下图即可,但是带来一个bug,你无法通过方向键或者菜单的箭头浏览 下一张图片。综上所述,你有3个选择,1 接受使用 ctrl+滚轮进行放大2 设置--关闭”显示所有支…

Python开发工具:VSCode+插件

本篇是 Python 系列教程第 3 篇,更多内容敬请访问我的 Python 合集Visual Studio Code的安装非常简单,就不放这里增加文章篇幅了。 相比PyCharm,VSCode更加轻量,启动速度快。并且搭配Python插件就能实现和Pycharm一样的代码提示、高亮效果。 1 安装插件 安装插件也非常简单…

jmeter之性能测试

性能测试 一、性能测试的介绍 1、定义:通过某些工具或手段来检测软件的某些指标是否达到要求,这就是性能测试。 功能测试:a,b 两个软件,a可以打开,b也可以打开 性能测试:a,b 两个软件,a可以打开8s,b也可以打开2s 说明:b的性能好 2、性能测试是在功能测试之后进行; 3、…

(十九)transformers解码策略

文本生成策略 文本生成对于许多 NLP 任务至关重要,例如开放式文本生成、摘要、翻译和 更多。它还在各种混合模态应用程序中发挥作用,这些应用程序将文本作为输出,例如语音到文本 以及 vision-to-text。一些可以生成文本的模型包括 GPT2、XLNet、OpenAI GPT、CTRL、Transform…

Python开发工具:PyCharm

本文是 Python 系列教程第 2 篇,更多内容敬请访问我的 Python 合集 1 安装 官网下载地址https://www.jetbrains.com.cn/pycharm/,文件比较大(约861MB)请耐心等待双击exe安装安装成功后会有一个30天的试用期,激活教程见先插个眼,有空更新激活教程 2 创建第一个项目图中这句…

thinkPHP6 反序列化

thinkPHP6 反序列化 thinkPHP v6.0.0-6.0.3 环境搭建 新版v6基于 PHP7.1+ 开发 php-7.3.4 ThinkPHP v6.0.3使用composer进行安装 composer create-project topthink/think=6.0.3 tp6.0然后利用 phpstudy 打开框架,简单配置如下子,再同样的道理配置 phpstorm 的调试。 但是万事…

由Flase引起的问题

特别抽象!起因是想用github来托管我的代码,后来发现出现了点错误 fatal: bad boolean config value flase for http.sslverify解决方案: 打开C盘 -> 搜索 .gitconfig -> 在里面修改内容即可再次回到 gitbash 上,再次输入git clone 的指令,非常好,一波未平一波又起 …

自我介绍软工5问

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228这个作业的目标 创建自己的博客和github账号,养成写博客的好习惯,了解程序员的工作的方式,熟悉markdown自我介…

js的10个使用技巧

js 技巧 01 如果仅在变量为true的情况下调用函数,你就可以使用与(&&)的短路形式作为替代方法。 02 如果期望值不正确,我们可以使用OR(丨丨)短路运算,为变量分配默认值。03 将多个变量赋值 我们可以通过数组解构来对一行中的多个变量赋值。 04 箭头函数 05 对于…