springcloud集成grpc(一)
码云地址:https://gitee.com/lpxs/lp-springcloud.git
有问题可以多沟通:136358344@qq.com。
GRPC简介
是谷歌开源的一个高性能的、通用的RPC框架。和其他RPC一样,客户端应用程序可以直接调用远程服务的方法,就好像调用本地方法一样。它隐藏了底层的实现细节,包括序列化(XML、JSON、二进制)、数据传输(TCP、HTTP、UDP)、反序列化等,开发人员只需要关自业务本身,而不需要关注RPC的技术细节。
与其他RPC框架一样,gRPC也遵循定义服务(类似于定义接口的思想)。gRPC客户端通过定义方法名、方法参数和返回类型来声明一个可以被远程调用的接口方法。由服务端实现客户端定义的接口方法,并运行一个gRPC服务来处理gPRC
客户端调用。注意,gRPC客户端和服务端共用一个接口方法。
springcloud与grpc
springcloud使用restful api进行内部通信,使用的是http1,而grpc使用http2来作为通信协议
至于http2的优势就不说了,对于很多电商服务内部调用链很复杂,使用grpc能有效的缩短通信时长。
springboot2集成net.devh.grpc
这里序列化框架使用protobuf
grpc-server
1、增加依赖
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>${grpc.version}</version>
</dependency>
<!-- Spring Boot 配置处理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
</dependency>
2、增加protobuf配置文件
在src/main/proto下增加配置文件hello.proto
syntax = "proto3";
package com.demo;
option java_package = "com.demo";
message HelloRequest {
string name = 1;
}
message HelloResponse {
string name = 1;
string status = 1;
}
// rpc 服务
service HelloService {
rpc hello(HelloRequest) returns(HelloResponse) {}
}
3、通过proto自动生成java代码并增加grpcservice
@GrpcService
public class HelloGrpcService extends HelloServiceGrpc.HelloServiceImplBase {
private static Logger logger = LoggerFactory.getLogger(UserProfileGrpcService.class);
@Override
public void hello(Hello.HelloRequest request, StreamObserver<Hello.HelloResponse> responseObserver) {
logger.info("hello start");
final Hello.HelloResponse.Builder replyBuilder = Hello.HelloResponse.newBuilder().setName(request.getName()).setStatus("success");
responseObserver.onNext(replyBuilder.build());
responseObserver.onCompleted();
}
}
4、增加启动类
@EnableDiscoveryClient
public class GrpcServerApplication {
public static void main(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}
5、增加yml配置
server:
port: 8011
grpc:
server:
port: 6000
spring:
application:
name: hello-grpc-server
grpc-client
1、依赖包
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>${grpc.version}</version>
</dependency>
<!-- Spring Boot 配置处理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
2、增加调用service
@Service
public class GrpcClientService {
@GrpcClient("hello-grpc-server")
private Channel serverChannel;
public String hello(String name) {
HelloServiceGrpc.HelloServiceBlockingStub stub = HelloServiceGrpc.newBlockingStub(serverChannel);
Hello.HelloRequest.Builder builder= Hello.HelloRequest.newBuilder().
setName("xiaoli");
Hello.HelloResponse response = stub.hello(builder.build());
return "{'responseStatus':'"+response.getStatus()+"','result':[]}";
}
}
其中这里已经增加了负载均衡,grpc官网推荐的负载均衡方案就是在应用层管理http2长连接池。
增加controller
@RestController
@RequestMapping("/test")
public class HelloController {
private static Logger logger = LoggerFactory.getLogger(HelloController.class);
@Autowired
private GrpcClientService grpcClientService;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
try {
String result = grpcClientService.hello(“aa”);
logger.debug(" respString : {}",result);
return result;
} catch (Throwable e) {
logger.error("hello error", e);
}
return null;
}
增加yml配置
info:
version: 1.0
name: hello-grpc-client
server:
port: 8012
grpc:
client:
hello-grpc-server:
enableKeepAlive: true
keepAliveWithoutCalls: true
negotiationType: plaintext
启动服务可以访问http://localhost:8012/test/hello?进行测试
总结
这种方式集成每次都需要编写proto接口文件并自动生成代码,客户端和服务端都需要另外组装参数。
不过优势是,有详细的接口规范(protobuf),并且可以支持异构语言调用。
后面会介绍只有java语言调用,但是不用每次都编写proto文件的集成方式。
springcloud集成grpc(一)的更多相关文章
- springcloud集成zookeeper,并使用configserver作为服务的配置中心
1.springcloud集成zookeeper: 做法: 出现问题: 版本不一致导致出现keepError: 解决:服务器的zookeeper要与客户端的zookeeper一致,才可以. 2.使用c ...
- Spring Boot 集成 GRPC
代码地址如下:http://www.demodashi.com/demo/14110.html 一.背景 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring ...
- springcloud 集成kafka问题记录,发消息报错:ERROR o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='{-1,
在springcloud集成kafka,发送消息时报错: 2018-08-15 16:01:34.159 [http-nio-8081-exec-1] INFO org.apache.kafka.c ...
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...
- spring-cloud集成mybatis-plus
mybatis-plus插件是对mybatis做出系列增强插件,后面简称MP,MP可免去开发者重复编写xml.mapper.service.entity等代码,通过MP提供的实体注解来完成单表的CRU ...
- springcloud集成kafka
项目名称:布控预警 水平拆分出来的项目,作为一个单独的可以对外提供服务的项目 项目设计:springcloud,可以集成各个不同平台的一个作为对外提供的微服务项目 项目功能:实现各个平台和本平台之间的 ...
- springcloud学习之路: (五) springcloud集成SpringCloudConfig分布式配置中心
SpringCloud全家桶中的分布式配置中心SpringCloudConfig, 它使用git来管理配置文件, 在修改配置文件后只需要调用一个接口就可以让新配置生效, 非常方便. SpringClo ...
- springboot集成grpc
gRPC 简介 gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行.它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡.跟踪.健康检查和认证.它也适用于分布式计算,将 ...
- 使用nestjs集成grpc具体操作
两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写 1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端 ...
- springboot+springcloud集成jar
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
随机推荐
- pytest-parallel 多线程执行用例,访问pymysql数据库,遇到的问题
遇到的问题 1.pymysql.err.ProgrammingError: execute() first 2.File "D:\xxx\python3.8\lib\site-package ...
- Ubuntu下nvidia驱动卸载
Ubuntu下nvidia驱动卸载的一种方法 卸掉已经安装的驱动: sudo apt-getremove --purge '^nvidia-.*' sudo apt-getremove --purge ...
- LED虚拟拍摄-跟踪算法
LED虚拟拍摄-跟踪算法 图引用拍摄黑科技,LED虚拟影棚揭秘 标定流程 上面是一台Track设备,现精度比较高的主要是Redspy,Mosys,一般影视用这二种,其底层技术参考SMAL单目+惯性传感 ...
- 【资料分享】全志科技T507工业核心板硬件说明书(上)
目 录 前言 1硬件资源 1.1CPU 1.2ROM 1.3RAM 1.4时钟系统 1.5电源 1.6LED 1.7外设资源 2引脚说明 2.1引脚排列 2.2引脚定义 2.3内部引脚使用说明 ...
- vba--数组
Sub shishi() Range("e2") = Split(Range("e1"), "-")(0) '用短横线分隔后取第1个值 En ...
- javaApi,mapreduce,awk,scala四种方式实现词频统计
awk方式实现词频统计: 方式一: vi wordcount.awk { for (i = 1; i <=NF;i++) //NF 表示的是浏览记录的域的个数 freq[$i]++ } END{ ...
- VulnHub-Narak靶机渗透流程
VulnHub-Narak Description Narak is the Hindu equivalent of Hell. You are in the pit with the Lord of ...
- SQLServer 的Distinct
distinct去除重复的数据(distinct是对整个结果集进行数据重复处理,不是针对某一列) -> 检查返回不重复的数据(对于整条记录不重复才会去除,如ID不一样) 用法:select di ...
- oeasy教您玩转vim - 48 - # ed由来
范围控制 回忆上节课内容 我们这次研究了mark的定义和使用 mb定义 'b跳转 可以对marks,查询删除 三种marks 小写 本文件内 大写 跨文件 数字 配置文件中 甚至可以在行编辑中,使 ...
- Django template层之json报文遍历总结
Django template层之json报文遍历总结 by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 实例 Views.py def home(request): ...