GoLang与Java各自生成grpc代码流程介绍

作者:Json_Marz 时间:2021-06-20 09:28:50 

1.背景

由于公司的日志系统使用的是plumelog,最近生产环境老是报 jedis连接池不够,导致丢失日志,而且服务老是重启,怀疑跟日志系统有关,于是自己改造plumelog,使用go grpc生成server端,使用java grpc生成客户端,将日志以grpc服务形式传递到server端。

2.go生成grpc代码

2.1 安装

protc:https://github.com/protocolbuffers/protobuf/releases

选择自己所需版本,解压后将protoc.exe拷贝至go环境的bin目录下

2.2 安装对应插件

go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2

将生成的插件拷贝至go环境的bin目录下

编写.proto文件:

syntax = "proto3";
// 指定等会文件生成出来的package
package server;
option go_package = "plumelog/rpc;server";
// 定义request model
message PlumelogRequest{
 string message = 1; // 1代表顺序
}
// 定义response model
message PlumelogResponse{
 string message = 1; // 1代表顺序
}
// 定义服务主体
service PlumelogService{
 // 定义方法
 rpc GetPlumelog(PlumelogRequest) returns(PlumelogResponse);
}

项目结构图:

GoLang与Java各自生成grpc代码流程介绍

在终端cd到proto目录下,执行如下命令生成grpc代码:

 protoc --go_out=plugins=grpc:. server.proto

server端:

main.go:

import (
   "google.golang.org/grpc"
   "log"
   "net"
   "plumelog/rpc"
   "plumelog/server"
)
func main() {
   // 1. new一个grpc的server
   rpcServer := grpc.NewServer()
   // 2. 将刚刚我们新建的ProdService注册进去
   rpc.RegisterPlumelogServiceServer(rpcServer, new(server.RpcServer))
   // 3. 新建一个listener,以tcp方式监听8899端口
   listener, err := net.Listen("tcp", ":8899")
   if err != nil {
       log.Fatal("服务监听端口失败", err)
   }
   // 4. 运行rpcServer,传入listener
   _ = rpcServer.Serve(listener)
}

server.go

package server
import (
   "context"
   "plumelog/rpc"
)
type RpcServer struct {
}
var pushProducer *plumelog.Producer
func (*RpcServer) GetProductStock(ctx context.Context, req *rpc.PlumelogRequest) (*rpc.PlumelogResponse, error) {
   fmt.Println(req.Message)
   return &rpc.PlumelogResponse{Message: req.Message}, nil
}

3.java生成grpc代码

3.1 idea安装protobuf插件

GoLang与Java各自生成grpc代码流程介绍

3.2 创建maven项目

pom.xml:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
       <groupId>com.plumelog</groupId>
       <artifactId>plumelog</artifactId>
       <version>3.5</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <artifactId>plumelog-logback</artifactId>
   <name>plumelog-logback</name>
   <packaging>jar</packaging>
   <dependencies>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-core</artifactId>
           <version>1.2.3</version>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.2.3</version>
       </dependency>
       <dependency>
           <groupId>com.plumelog</groupId>
           <artifactId>plumelog-core</artifactId>
           <version>${project.parent.version}</version>
       </dependency>
       <dependency>
           <groupId>com.google.protobuf</groupId>
           <artifactId>protobuf-java</artifactId>
           <version>3.5.1</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util -->
       <dependency>
           <groupId>com.google.protobuf</groupId>
           <artifactId>protobuf-java-util</artifactId>
           <version>3.5.1</version>
       </dependency>
       <!-- https://mvnrepository.com/artifact/io.grpc/grpc-all -->
       <dependency>
           <groupId>io.grpc</groupId>
           <artifactId>grpc-all</artifactId>
           <version>1.12.0</version>
       </dependency>
       <dependency>
           <groupId>javax.annotation</groupId>
           <artifactId>javax.annotation-api</artifactId>
           <version>1.3.2</version>
           <scope>compile</scope>
       </dependency>
       <dependency>
           <groupId>javax.annotation</groupId>
           <artifactId>javax.annotation-api</artifactId>
           <version>1.3.2</version>
           <scope>compile</scope>
       </dependency>
       <dependency>
           <groupId>javax.annotation</groupId>
           <artifactId>javax.annotation-api</artifactId>
           <version>1.3.2</version>
           <scope>compile</scope>
       </dependency>
   </dependencies>
   <build>
       <plugins>
           <!-- 依赖包插件 -->
           <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-dependency-plugin</artifactId>
               <executions>
                   <execution>
                       <id>copy-dependencies</id>
                       <phase>package</phase>
                       <goals>
                           <goal>copy-dependencies</goal>
                       </goals>
                       <configuration>
                           <outputDirectory>${project.build.directory}/lib</outputDirectory>
                           <!-- 是否不包含间接依赖 -->
                           <excludeTransitive>false</excludeTransitive>
                           <!-- 忽略版本 -->
                           <stripVersion>false</stripVersion>
                       </configuration>
                   </execution>
               </executions>
           </plugin>
           <plugin>
               <groupId>org.xolstice.maven.plugins</groupId>
               <artifactId>protobuf-maven-plugin</artifactId>
               <version>0.5.0</version>
               <configuration>
                   <protocArtifact>
                       com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
                   </protocArtifact>
                   <pluginId>grpc-java</pluginId>
                   <pluginArtifact>
                       io.grpc:protoc-gen-grpc-java:1.11.0:exe:${os.detected.classifier}
                   </pluginArtifact>
               </configuration>
               <!--                <executions>-->
               <!--                    <execution>-->
               <!--                        <goals>-->
               <!--                            <goal>compile</goal>-->
               <!--                            <goal>compile-custom</goal>-->
               <!--                        </goals>-->
               <!--                    </execution>-->
               <!--                </executions>-->
           </plugin>
       </plugins>
       <extensions>
           <extension>
               <groupId>kr.motd.maven</groupId>
               <artifactId>os-maven-plugin</artifactId>
               <version>1.6.2</version>
           </extension>
       </extensions>
   </build>
</project>

maven插件:

GoLang与Java各自生成grpc代码流程介绍

3.3 生成grpc代码

// 这个就是protobuf的中间文件
// 指定的当前proto语法的版本,有2和3
syntax = "proto3";
// 指定等会文件生成出来的package
package server;
option java_package = "com.plumelog.logback.rpc";
option java_multiple_files = false;
option java_outer_classname = "RpcClient";
// 定义request model
message PlumelogRequest{
 string message = 1; // 1代表顺序
}
// 定义response model
message PlumelogResponse{
 string message = 1; // 1代表顺序
}
// 定义服务主体
service PlumelogService{
 // 定义方法
 rpc GetPlumelog(PlumelogRequest) returns(PlumelogResponse);
}

ps:指定的package要与go 那边的proto指定的package一致,否则启动报找不到rpc服务

双击maven插件的protobuf:complie生成rpc代码,双击maven插件的protobuf:custom生成grpc代码

调用:

private String rpcHost = "127.0.0.1";
   private int rpcPort = 8899;
   ManagedChannel channel = ManagedChannelBuilder.forAddress(rpcHost, rpcPort).usePlaintext().build();
   @Override
   protected void append(ILoggingEvent event) {
       if (event != null) {
           send(event);
       }
   }
   protected void send(ILoggingEvent event) {
       final BaseLogMessage logMessage = LogMessageUtil.getLogMessage(appName, env, event);
       if (logMessage instanceof RunLogMessage) {
           final String message = LogMessageUtil.getLogMessage(logMessage, event);
           PlumelogRpcClient.callRpcServer(channel, message);
       }
   }
package com.plumelog.logback.util;
import com.plumelog.logback.rpc.PlumelogServiceGrpc;
import com.plumelog.logback.rpc.RpcClient;
import io.grpc.ManagedChannel;
public class PlumelogRpcClient {
   public static void callRpcServer(ManagedChannel channel, String message) {
       RpcClient.PlumelogRequest request = RpcClient.PlumelogRequest.newBuilder().setMessage(message).build();
       try {
           PlumelogServiceGrpc.newBlockingStub(channel).getProductStock(request);
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

服务引入log在本地 maven仓库的坐标,启动即可,前提是go 服务先启动。

来源:https://blog.csdn.net/Json_Marz/article/details/129508053

标签:Go,Java,grpc
0
投稿

猜你喜欢

  • Java垃圾回收器的方法和原理总结

    2022-06-27 07:11:46
  • Java设计模式之工厂模式案例详解

    2023-11-27 20:08:03
  • Java分布式服务框架Dubbo介绍

    2022-09-16 01:27:53
  • SpringBoot集成Spring security JWT实现接口权限认证

    2023-02-02 07:31:08
  • Java Socket编程(五) 简单的WEB服务器

    2023-05-23 01:00:04
  • 详解SpringBoot使用RedisTemplate操作Redis的5种数据类型

    2022-12-03 07:35:29
  • Android 图片缩放与旋转的实现详解

    2023-03-10 10:57:41
  • 深入理解Java设计模式之桥接模式

    2022-04-11 07:34:53
  • WPF中使用CallerMemberName简化InotifyPropertyChanged的实现

    2023-05-08 16:27:07
  • Java 1.8使用数组实现循环队列

    2022-02-11 04:00:10
  • DevExpress之ChartControl实现柱状图演示实例

    2023-05-27 08:45:15
  • 解决Android Studio xml 格式化不自动换行的问题

    2021-09-10 06:15:42
  • android实现九宫格程序

    2023-02-16 16:30:53
  • MyBatis-Plus中最简单的查询操作教程(Lambda)

    2022-03-16 13:43:28
  • SpringMvc+Mybatis+Pagehelper分页详解

    2021-08-13 14:15:11
  • 一文搞懂C++中的运算符重载

    2021-08-02 02:47:53
  • Java中静态类型检查是如何进行的实例思路详解

    2022-01-01 16:08:30
  • java文件下载代码实例(单文件下载和多文件打包下载)

    2023-02-16 00:38:37
  • 详解用maven将dubbo工程打成jar包运行

    2023-10-20 04:34:42
  • Android Dialog对话框用法实例详解

    2022-11-04 02:38:47
  • asp之家 软件编程 m.aspxhome.com