grpc实现跨语言(go与java)服务通信

news2024/11/18 22:40:43
Golang微服务实战:使用gRPC实现跨语言通信!

随着微服务架构的发展,越来越多的企业开始采用微服务架构来构建分布式系统。在微服务架构中,服务之间的通信是非常重要的。而gRPC作为一种高效、跨平台、跨语言的RPC框架,成为越来越多企业的首选。

本篇文章将介绍如何使用gRPC实现跨语言通信。我们将实现一个用Golang编写的服务,与用Python编写的客户端通信,并探讨gRPC框架的一些核心技术点。

简介

多个服务在进行拆分后,我们往往要通过服务之间互相调用来实现某个业务功能,我们知道在java领域,有springCloud,Dubbo这些封装的很好的通信组件,但是如果服务之间是跨语言的,那么这些就不能解决了,今天有个需求,我想实现go服务和java服务之间的通信,于是就借鉴了一下google的一个轻量且高效的通讯框架-grpc来实现

什么是grpc

grpc官方文档

项目需求

实现一个简单的,用Go服务远程调用Java服务一个整数相加的接口

服务端设计步骤

  • 服务端是maven工程,新建一个工程后,导入maven坐标
  • 在main目录下,java同级目录下建立proto文件夹,用来存放基于http2和protobuf的通信协议,新建justtest.proto
syntax = "proto3"; //协议版本号

option java_multiple_files = true;
option java_package = "io.grpc.add";
option java_outer_classname = "remote_add_service";

package Test; // 包名

//定义服务
service Greeter {
  //注意:这里是returns 不是return
  rpc RemoteAdd (AddRequest) returns (AddResponse) {}
}
//定义消息类型
message AddRequest {
  int32 num1 = 1;
  int32 num2 = 2;
}
message AddResponse {
  int32 answer = 1;
}
  • 新建proto文件,写入文件协议规定的字段
  • 使用maven install生成由protoc反向解析出的一系列文件
  • 启动服务端

客户端设计

  • 客户端的工程是golang工程,我们要事先安装好protobuf的包,网上有很多教程,大家可以去自行下载
  • 值得注意的是,go服务需要一些grpc的包,这些包…有些还真在github上找不到,所以大家可以去下载我的go所需要的库的仓库,我全部都打在了项目的govendor目录下,里头的包都是完整的,拿来就可以用
  • 将maven工程中的protoc文件拷贝到golang工程里面的proto包里,然后进入这个文件夹目录,使用下面的指令去生成一系列反向解析出来的go文件
 protoc --go-grpc_out=. 你的proto文件名.proto
 protoc --go_out=. 你的proto文件名.proto
  • 新建客户端服务,去监听一个端口,同时去调用这个远程接口服务

演示实例

服务端启动java服务

在这里插入图片描述

客户端启动golang服务
client.go文件

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	pb "go_grpc/pb"
	"google.golang.org/grpc"
	"log"
	"net/http"
)

func main() {
	// Set up a connection to the server.
	conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	client := pb.NewGreeterClient(conn)

	r := gin.Default()
	r.GET("/", func(c *gin.Context) {
		//todo 远程调用整数相加
		req := &pb.AddRequest{Num1: 10,Num2: 10}
		res, err := client.RemoteAdd(c, req)
		if err != nil {
			c.JSON(http.StatusInternalServerError, gin.H{
				"error": err.Error(),
			})
			return
		}
		c.JSON(http.StatusOK, gin.H{
			"result": fmt.Sprint(res.Answer),
		})
	})
	// Run http server
	if err := r.Run(":8052"); err != nil {
		log.Fatalf("could not run server: %v", err)
	}
}

在这里插入图片描述

文件代码地址

文件代码在我的git上,测试可以通过,大家可以fetch下来使用,里头的不同分支是不同的服务
https://github.com/zxhjames/grpc_demo

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

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

相关文章

小目标检测闲谈

学术界在小目标检测领域的研究进展似乎已经相对缓慢,这一趋势在年度顶级学术会议的相关论文中也有所体现。这部分停滞可能与深度学习领域整体的发展趋势有关。然而,小目标检测仍然是一个具有重要应用潜力的领域,尤其在实际部署中,…

ChatGPT(1):ChatGPT初识

1 ChatGPT原理 ChatGPT 是基于 GPT-3.5 架构的一个大型语言模型,它的工作原理涵盖了深度学习和自然语言处理技术。以下是 ChatGPT 的工作原理的一些关键要点: 神经网络架构:ChatGPT 的核心是一个深度神经网络,采用了变种的 Tran…

1 tcp协议20问

1什么是TCP网络分层 1.1分层描述 网络访问层: 2 TCP的三次握⼿中为什么是三次?为什么不是两次、四次? 两次握手的话,服务端会单方面认为建立已经成功,但是对于客户端而言,可能只是开个玩笑的&#xff0c…

形式化验证笔记

参考视频: 形式化验证的原理与新应用【DatenLord达坦科技】形式化验证入门(我强推!!!!!) 形式化验证:在状态机表征的空间里面进行搜索,验证某个模型是否按规范执行且测试覆盖率达到1…

058:mapboxGL监听键盘事件,通过panBy控制前后左右移动

第058个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中监听键盘事件,控制前后左右移动。 本例通过panBy方法来移动一定距离的地图,通过.addEventListener的方法来监听键盘的按键动作。注意这里面style中一定要设置好pitch,不能为0,不然就撞墙,不能移动了。 直接复…

OpenCV 笔记(2):图像的属性以及像素相关的操作

Part11. 图像的属性 11.1 Mat 的主要属性 在前文中,我们大致了解了 Mat 的基本结构以及它的创建与赋值。接下来我们通过一个例子,来看看 Mat 所包含的常用属性。 先创建一个 3*4 的四通道的矩阵,并打印出其相关的属性,稍后会详细…

数据库索引种类

文章目录 索引的优缺点优点缺点 聚簇索引特点优点缺点 非聚簇索引特点优点缺点使用场景: 在MyISAM与InnoDB中的使用 索引的优缺点 索引概述 MySQL官方将索引定义为帮助MySQL高效获取数据的数据结构。索引的本质是一种排好序的快速查找数据结构,用于满足…

YOLOv5/v7/v8改进实验(五)之使用timm更换YOLOv5模型主干网络Backbone篇

🚀🚀 前言 🚀🚀 timm 库实现了最新的几乎所有的具有影响力的视觉模型,它不仅提供了模型的权重,还提供了一个很棒的分布式训练和评估的代码框架,方便后人开发。更难能可贵的是它还在不断地更新迭…

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容

效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…

Kubernetes 进阶

Kubernetes 进阶  Service 控制器  Ingress 对象(对外暴露应用)  管理应用程序配置  K8s 数据卷与持久数据卷  再谈有状态应用部署:StatefulSet控制器  K8s 安全访问控制  K8s 部署利器Helm初探 Service 控制器 • Service存在的意义 • Pod与…

更改Kali Linux系统语言以及安装zenmap

目录 更改Kali Linux系统语言 安装 Zenmap 更改Kali Linux系统语言以及安装zenmap 在使用kali的过程中&#xff0c;会遇到许多问题&#xff0c;其中一个就是看不懂英语&#xff0c;下面是如何更换语言的步骤。 更改Kali Linux系统语言 首先&#xff0c;打开kali&#xff0…

学信息系统项目管理师第4版系列32_信息技术发展

1. 大型信息系统 1.1. 大型信息系统是指以信息技术和通信技术为支撑&#xff0c;规模庞大&#xff0c;分布广阔&#xff0c;采用多级 网络结构&#xff0c;跨越多个安全域&#xff1b;处理海量的&#xff0c;复杂且形式多样的数据&#xff0c;提供多种类型应用 的大系统 1.1.…

python安装、输入输出、注释、中文编码、编码规范等基础语法

一、概述 1、简介 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;Guido开始写Python语言的编译器。Python这个名字&#xff0c;来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的…

30 Python的matplotlib模块

概述 在上一节&#xff0c;我们介绍了Python的pandas模块&#xff0c;包括&#xff1a;Series、DataFrame、数据读取和写入等内容。在这一节&#xff0c;我们将介绍Python的matplotlib模块。matplotlib模块是一个Python的2D绘图库&#xff0c;可以实现各种类型的图形绘制&#…

【试题021】C语言算术运算符例题

1.题目&#xff1a;表达式4.8-1/25%3的值是 &#xff1f; 2.代码解析&#xff1a; //表达式4.8-1/25%3的值是?printf("%d\n", (4 - 1 / 2 5 % 3));//分析&#xff1a;多个运算符看优先级高低次序//根据口诀可知&#xff1a; /和%都排第三&#xff0c;和-排第四//所…

AutoSAR入门:应用背景及简介

1、应用背景 在我们现在的汽车行业里面&#xff0c;汽车电子的发展过程中&#xff0c;我们发现有一些新的趋势汽车电子系统的复杂性不断增长。 我们现在可以看到车辆有越来越多的功能&#xff0c;那么这些功能呢&#xff0c;也在往这个控制器上进行集中&#xff0c;比如说我们现…

修炼k8s+flink+hdfs+dlink(六:学习k8s)

一&#xff1a;增&#xff08;创建&#xff09;。 直接进行创建。 kubectl run nginx --imagenginx使用yaml清单方式进行创建。 二&#xff1a;删除。 kubectl delete pods/nginx 三&#xff1a;修改。 kubectl exec -it my-nginx – /bin/bash 四&#xff1a;查看。 …

【Leetcode每日一题 1726】「组合|哈希表」同积元组

2023.10.19 本题重点&#xff1a; 1.题目的理解&#xff0c;如何转化成一种组合问题 2.哈希表的使用 题目介绍&#xff1a; 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元…

11. 机器学习 - 评价指标2

文章目录 混淆矩阵F-scoreAUC-ROC 更多内容&#xff1a; 茶桁的AI秘籍 Hi, 你好。我是茶桁。 上一节课&#xff0c;咱们讲到了评测指标&#xff0c;并且在文章的最后提到了一个矩阵&#xff0c;我们就从这里开始。 混淆矩阵 在我们实际的工作中&#xff0c;会有一个矩阵&am…

【计算机网络笔记】OSI参考模型基本概念

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…