代码地址如下:
http://www.demodashi.com/demo/14110.html

一.背景

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

Grpc 由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

​ 项目定位是电商平台和WMS系统中间的插件服务,wms采用.net语言开发,电商平台采用java开发,所以出现了多语言间的数据交换,开始考虑使用json协议,方便快捷,但是考虑到效率和系统发展的问题,考虑使用RPC框架,斟酌之后敲定为GRPC。

​ 但是,我们拓展服务使用的SpringBoot,Grpc和SpringBoot集成的文章不是很多,大部分都是采用github上***-springboot.grpc.starter的项目,看了一下,并不是很感兴趣,所以自己根据官网的demo,尝试与SpringBoot集成,所以在这和大家分享下

二. 准备工作

开发环境

Spring Boot 2.0.5.RELEASE

Grpc 1.15.0

Inteliji Idea 2018.3

项目截图

三.实现过程

1. 配置SpringBoot项目
  • Pom文件增加
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
  • 编写启动类
public static void main(String[] args) {
// 启动SpringBoot web
SpringApplication.run(Launcher.class, args);
}
2. 增加GRPC支持和GRPC代码生成工具,集成GrpcServer端
  • 增加POM文件
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.15.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.15.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.15.0</version>
</dependency>
  • 增加maven工具
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
  • 编写Server端实现类

public class HelloWorldService extends HelloWorldServiceGrpc.HelloWorldServiceImplBase { @Override
public void welcome(HelloWorld.NameRequest request, StreamObserver<HelloWorld.EchoResponse> responseObserver) {
HelloWorld.EchoResponseOrBuilder echoResponseOrBuilder = HelloWorld.EchoResponse.newBuilder();
((HelloWorld.EchoResponse.Builder) echoResponseOrBuilder).setMergename("welcome " + request.getName());
responseObserver.onNext(((HelloWorld.EchoResponse.Builder) echoResponseOrBuilder).build());
responseObserver.onCompleted();
}
}
  • 增加Grpc启动器
@Component("grpcLauncher")
public class GrpcLauncher { private Logger logger = LoggerFactory.getLogger(Launcher.class); /**
* 定义Grpc Server
*/
private Server server; @Value("${grpc.server.port}")
private Integer grpcServerPort;
/**
* GRPC 服务启动方法
* @param grpcServiceBeanMap
*/
public void grpcStart(Map<String, Object> grpcServiceBeanMap) {
try{
ServerBuilder serverBuilder = ServerBuilder.forPort(grpcServerPort);
for (Object bean : grpcServiceBeanMap.values()){
serverBuilder.addService((BindableService) bean);
logger.info(bean.getClass().getSimpleName() + " is regist in Spring Boot");
}
server = serverBuilder.build().start();
logger.info("grpc server is started at " + grpcServerPort);
server.awaitTermination();
Runtime.getRuntime().addShutdownHook(new Thread(()->{grpcStop();}));
} catch (IOException e){
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} /**
* GRPC 服务Stop方法
*/
private void grpcStop(){
if (server != null){
server.shutdownNow();
}
}
}
  • 添加自定义注解用于扫描Grpc服务
/**
* 自定义注解,用于获取Spring扫描到的类
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface GrpcService {
}
  • 在SpringBoot中增加Grpc启动器,并将Spring管理的类,添加到Grpc服务中
/**
* Spring Boot 启动器
*/
@SpringBootApplication
public class Launcher { public static void main(String[] args) {
// 启动SpringBoot web
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(Launcher.class, args);
Map<String, Object> grpcServiceBeanMap = configurableApplicationContext.getBeansWithAnnotation(GrpcService.class);
GrpcLauncher grpcLauncher = configurableApplicationContext.getBean("grpcLauncher",GrpcLauncher.class);
grpcLauncher.grpcStart(grpcServiceBeanMap);
}
}

至此Server端,集成完毕

3. 增加Client端
  • 获取Chanel

@Component
public class GrpcClientMananer {
@Value("${grpc.client.host}")
private String host;
@Value("${grpc.client.port}")
private Integer port; public ManagedChannel getChannel(){
ManagedChannel channel = ManagedChannelBuilder.forAddress(host,port)
.disableRetry()
.idleTimeout(2, TimeUnit.SECONDS)
.build();
return channel;
}
}
  • 调用方式
@Component
public class HelloWorldClient { @Autowired
private GrpcClientMananer grpcClientMananer; public void call(){
ManagedChannel channel = grpcClientMananer.getChannel();
HelloWorld.NameRequestOrBuilder nameRequestOrBuilder = HelloWorld.NameRequest.newBuilder();
((HelloWorld.NameRequest.Builder) nameRequestOrBuilder).setName("Geek");
HelloWorldServiceGrpc.HelloWorldServiceBlockingStub stub = HelloWorldServiceGrpc.newBlockingStub(channel);
HelloWorld.EchoResponse echoResponse = stub.welcome(((HelloWorld.NameRequest.Builder) nameRequestOrBuilder).build());
System.out.println(echoResponse.getMergename());
} }

四.其他补充

暂没

Spring Boot 集成 GRPC

代码地址如下:
http://www.demodashi.com/demo/14110.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

Spring Boot 集成 GRPC的更多相关文章

  1. Spring Boot集成Jasypt安全框架

    Jasypt安全框架提供了Spring的集成,主要是实现 PlaceholderConfigurerSupport类或者其子类. 在Sring 3.1之后,则推荐使用PropertySourcesPl ...

  2. Spring boot集成swagger2

    一.Swagger2是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格 ...

  3. Spring Boot 集成 Swagger,生成接口文档就这么简单!

    之前的文章介绍了<推荐一款接口 API 设计神器!>,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单. 你所需具备的基础 告诉你,Spring Bo ...

  4. spring boot 集成 zookeeper 搭建微服务架构

    PRC原理 RPC 远程过程调用(Remote Procedure Call) 一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远程系统资源,R ...

  5. Spring Boot 集成Swagger

    Spring Boot 集成Swagger - 小单的博客专栏 - CSDN博客https://blog.csdn.net/catoop/article/details/50668896 Spring ...

  6. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  7. Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件

    上一篇文章,写了如何搭建一个简单的Spring boot项目,本篇是接着上一篇文章写得:Spring boot入门:快速搭建Spring boot项目(一),主要是spring boot集成mybat ...

  8. (转)Spring Boot(十八):使用 Spring Boot 集成 FastDFS

    http://www.ityouknow.com/springboot/2018/01/16/spring-boot-fastdfs.html 上篇文章介绍了如何使用 Spring Boot 上传文件 ...

  9. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

随机推荐

  1. UITextView 详解

    UITextView 边框的设置   设置光标的位置   导入QuartzCote框架: #import <QuartzCore/QuartzCore.h> textView.layer. ...

  2. .NET:CLR via C# Primitive Thread Synchronization Constructs

    User-Mode Constructs The CLR guarantees that reads and writes to variables of the following data typ ...

  3. c++11改进我们的程序之垃圾回收(一)

    c#和java中有自己主动垃圾回收机制,.net执行时和java虚拟机能够管理分配的堆内存,在对象失去引用时自己主动回收,因此在c#和jva中,  内存管理不是大问题.c++语言没有垃圾回收机制,必须 ...

  4. myeclipse 修改freemarker ftl 不重启tomcat

    最 近的项目是SSH,View层采用Freemarker,但是遇到了一个很大问题,每次修改完ftl文件,都要重新启动tomcat才可以看到所修改的内 容,不但麻烦,而且浪费时间,特别怀念jsp,后来在 ...

  5. Ubuntu安装Oracle时出现乱码,及其他安装错误

    只要在运行./runInstaller之前先运行下以下命令就ok了: export LANG=en_US #设置运行语言 编译错误 ln -s /usr/lib/i386-linux-gnu/libp ...

  6. MATLAB 人脸定位

    faceimg = x222;faceDetector = vision.CascadeObjectDetector();bbox = step(faceDetector, faceimg);face ...

  7. std::vector利用swap()函数进行内存的释放【转】

    首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...

  8. [leetcode]Valid Number @ Python

    原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...

  9. 浅议 android下的context

    android学习中,最开始学习的一个类是activities,你是否知道他与context之间 的关系,我们经常用startactivities来唤起一个activities他的定义有在哪里了,他是 ...

  10. GG配置ggmgr进程

    Oracle配置mgr进程 edit params mgr port 7809 syslog none dynamicportlist 7810-7820 自己主动会生成./dirprm/mgr.pr ...