gRPC 简介

gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行。它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡、跟踪、健康检查和认证。它也适用于分布式计算,将不同设备、移动应用程序和浏览器连接到后端服务。

主要使用场景:

  • 在微服务架构中有效地连接多个服务(链路跟踪)
  • 将移动设备、浏览器客户端连接到后端服务
  • 生成高效的客户端库

可以从图中看出他是可以跨语言使用的,基于HTTP/2协议传输

分两个端:服务提供方和调用方

依赖:

  1. <dependency>
  2. <groupId>com.anoyi</groupId>
  3. <artifactId>spring-boot-starter-grpc</artifactId>
  4. <version>1.1.2.RELEASE</version>
  5. </dependency>

共用接口:

  1. @GrpcService(server = "user")
  2. public interface UserService {
  3.  
  4. void insert(UserEntity userEntity);
  5.  
  6. void deleteById(Long id);
  7.  
  8. void update(UserEntity userEntity);
  9.  
  10. UserEntity findById(Long id);
  11.  
  12. List<UserEntity> findAll();

server参数必须填:对应了服务调用方配置文件中的spring.grpc.remote-servers.server值

1、服务提供方

application.yml配置文件:

  1. spring:
  2. grpc:
  3. enable: true
  4. port: 6565

服务提供方实现接口提供服务:(接口实现类的命名的前缀必须与接口名相同)

  1. @Service
  2. public class UserServiceImpl implements UserService {
  3.  
  4. /**
  5. * 模拟数据库存储用户信息
  6. */
  7. private Map<Long, UserEntity> userMap = new ConcurrentHashMap<>();
  8.  
  9. @Override
  10. public void insert(UserEntity userEntity) {
  11. if (userEntity == null){
  12. log.warn("insert user fail, userEntity is null!");
  13. return ;
  14. }
  15. userMap.putIfAbsent(userEntity.getId(), userEntity);
  16. }
  17.  
  18. // 其他省略
  19.  
  20. }

2、服务调用方

application.yml配置文件:

  1. spring:
  2. grpc:
  3. remote-servers:
  4. - server: user #这个就是上面注解里配置的接口
  5. host: 127.0.0.1
  6. port: 6565
  7. - server: pay
  8. host: 192.168.0.3
  9. port: 6565

主类中添加grpc的服务自动扫描(需要添加扫描位置,由于使用了共用的接口工程,spring boot 无法直接扫描当前工程外部的信息,所以需要手动指定 @GrpcService 的包扫描路径,如果 @GrpcService 定义在当前工程内部,则无需配置 @GrpcService):

  1. @SpringBootApplication
  2. @GrpcServiceScan(basePackages = {"com.anoyi.grpc.facade"})
  3. public class Application {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(Application.class, args);
  7. }
  8.  
  9. }

在服务调用方的任何component中使用@Autowaire注入即可

  1. @RestController
  2. @RequestMapping("/user")
  3. public class UserController {
  4.  
  5. @Autowired
  6. private UserService userService;
  7.  
  8. @PostMapping("/add")
  9. public UserEntity insertUser(@RequestBody UserEntity userEntity){
  10. userService.insert(userEntity);
  11. return userEntity;
  12. }
  13.  
  14. // 省略其他
  15.  
  16. }

5、基于容器的微服务架构下的应用

spring-boot-starter-grpc 无服务注册中心,在 kubernetes 集群或 docker swarm 集群下轻松使用,只需更改 client 端的配置中的 host 即可,基于容器平台的 DNS 服务,host 配置为 server 端的服务名,就能正常调用。

springboot集成grpc的更多相关文章

  1. Spring Boot 集成 GRPC

    代码地址如下:http://www.demodashi.com/demo/14110.html 一.背景 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring ...

  2. SpringBoot集成Zipkin实现分布式全链路监控

    目录 Zipkin 简介 Springboot 集成 Zipkin 安装启动 zipkin 版本说明 项目结构 工程端口分配 引入 Maven 依赖 配置文件.收集器的设置 编写 Controller ...

  3. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  4. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  5. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  6. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  7. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  8. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  9. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

随机推荐

  1. Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机

    题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...

  2. C#中动态读取配置

    有些时候,文件修改需要及时的响应,这个时候就需要实时读取文件,预先想的是写一个计时器,每隔多久运行一次,但是不能实时响应,所以采用监听文件的方式实现读取数据 C#监听文件变化 /// <summ ...

  3. centos7安装python3.7和ipython

    一.centos7为刚安装的 1)配置yum源和epel源 采用国内源 查看yum的配置文件 (里面的镜像网址)是否ping的通 全部更改成 国内的 yum .epel源 在图中位置 下载相应的 re ...

  4. POJ 3114 Tarjan+Dijkstra

    题意: 间谍在战争期间想要传递一份谍报回国,谍报可以在邮局之间传递,但这种传递是单向的,并且会少耗一些时间.但是如果两个邮局在同一个国家的话,那么谍报在这两个邮局之间传递是不消耗时间的.如果几个邮局发 ...

  5. C - Lucky Numbers (easy)

    Problem description Petya loves lucky numbers. Everybody knows that positive integers are lucky if t ...

  6. 【sqli-labs】 less12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

    加个双引号 通过报错信息猜测SQL语句 , 将括号闭合掉,通过注释后面的条件登录

  7. HDU_5724_状态压缩的sg函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5724 题目大意:n行20列的棋盘,对于每行,如果当前棋子右边没棋子,那可以直接放到右边,如果有就跳过放 ...

  8. Python 集合 day3

    集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,集合用{},里面是一个一个元素,不同于key-value形式的字典: 注意:创建一个空集合必须用 s ...

  9. bzoj4320 homework 题解

    题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4320 令M=sqrt(mx),把询问的Y按M 分成两种不同的处理方式. 1.对于> ...

  10. Python基础练级攻略:day01

    如果你有足够长时间做某事,一定会更擅长. 知识点: 计算机基础 变量 运算符 if语句 for-in循环 函数 列表.元组.字典.字符串.集合 ascii.unicode.utf-8.gbk 区别 A ...