grpc-java springboot 同步异步调用 demo

Java中的异步RPC调用与性能优化 在分布式系统中,远程过程调用(RPC)是一种常见的通信机制,允许一个程序调用另一个地址空间(通常是另一个网络节点)的过程。异步RPC则通过非阻塞方式发起调用,并通过回调或Future获取结果,提升系统的并发性能和响应速度。合理利用异步机制和RPC框架,能够有效提升应用程序的性能和响应速度,满足复杂应用场景下的需求。Java中有多个成熟的RPC框架,如Dubbo、Spring Cloud、gRPC等,它们提供了异步调用的支持,能够有效管理网络通信和线程池资源。合理配置线程池大小,避免资源浪费和线程阻塞。 阅读详情

近期学习 grpc-java,从 demo 入手,进行学习

grpc 的基础知识暂不整理,后续有时间再整理一波,这一篇主要是记录一个简单的 grpc 使用 springboot 创建的 demo。

我整个 demo 分成三个 Project :

  • grpc-springboot-demo-api:用于存放 proto 文件,生成Java 代码
  • grpc-springboot-demo-server:服务端代码
  • grpc-springboot-demo-consumer:客户端代码

demo-api(proto)

创建一个最简单的 proto 文件,请求跟相应都只包含一个 String 的对象。

syntax = "proto3";

option java_package = "grpc.springboot.demo.api";
option java_outer_classname = "HelloWorldService";

package helloworld;

// 定义服务
service HelloWorld {
    rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

// 定义请求体
message HelloRequest {
    string message = 1;
}

// 定义相应内容
message HelloResponse {
    string message = 1;
}

文件创建好之后,需要进行编译,pom文件中需要引入相关插件:

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.parallelline1996</groupId>
    <artifactId>grpc-springboot-demo-api</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>1.12.0</version>
        </dependency>
    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>1.4.1.Final</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier}</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier}</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>6</source>
                    <target>6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

完成后,直接通过 maven 工具的 install 指令,推到本地仓库即可,构建时,便会自动生成我们需要的类。

在这里插入图片描述

demo-server

服务端项目的目录结构:

  • Starter:springboot 的启动类
  • GrpcServerConfiguration:grpc 服务端的启动类
  • HelloServerImpl:提供服务的实现类

在这里插入图片描述
首先 pom 文件,主要是导入 springboot 的启动的依赖,以及 grpc 的依赖,以及我们上面的 api 项目。

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.parallelline1996</groupId>
    <artifactId>grpc-springboot-demo-server</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.parallelline1996</groupId>
            <artifactId>grpc-springboot-demo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!-- spring boot -->
        <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>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>1.28.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0-jre</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.21.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Starter 启动类:

@SpringBootApplication
public class Starter implements CommandLineRunner {

    private GrpcServerConfiguration configuration;

    public Starter(GrpcServerConfiguration configuration) {
        this.configuration = configuration;
    }

	// 启动 grpc 服务端
    @Override
    public void run(String... args) throws Exception {
        configuration.start();
    }

	// 启动 springboot 容器
    public static void main(String[] args) {
        SpringApplication.run(Starter.class, args);
    }
}

GrpcServerConfiguration grpc 服务端启动类:
这里注意:如果不在创建 Server 指定线程池,则会使用 grpc-java 中提供的默认线程池响应从客户端发送的请求(后续关于 Server 的创建,会再写博客说明)。也可以直接指定线程池,只需调用 ServerBuilder.executor(executor)
即可。

@Component
public class GrpcServerConfiguration {

    private static final Logger logger = LoggerFactory.getLogger(GrpcServerConfiguration.class);

    // Grpc 服务端提供的服务
    @Autowired
    private HelloServiceImpl service;

    // Grpc 服务端的地址
    @Value("${grpc.server.port}")
    private int port;
    private Server server;
    private ThreadPoolExecutor executor;

    @PostConstruct
    public void init() {
        executor = new ThreadPoolExecutor(10, 10, 60,
                TimeUnit.MILLISECONDS, new SynchronousQueue<>());
    }

    public void start() throws IOException {
        // 构建服务端
        logger.info("Starting gRPC on port {}.", port);

        // 使用默认线程池
        server = ServerBuilder.forPort(port).addService(service).build().start();

        // 使用自定义线程池用于处理请求
//        server = ServerBuilder.forPort(port).addService(service).executor(executor).build().start();

        logger.info("gRPC server started, listening on {}.", port);

        // 添加服务端关闭的逻辑
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                logger.info("Shutting down gRPC server.");
                GrpcServerConfiguration.this.stop();
                logger.info("gRPC server shut down successfully.");
            }
        }));
    }

    private void stop() {
        if (server != null) {
            // 关闭服务端
            server.shutdown();
        }
    }

HelloServiceImpl:业务逻辑的实现类,继承 demo-api 中申明的 HelloWorldGrpc.HelloWorldImplBase,重写 sayHello 方法即可。

@Component
public class HelloServiceImpl extends HelloWorldGrpc.HelloWorldImplBase {
    
    private static final Logger logger = LoggerFactory.getLogger(HelloServiceImpl.class);
    
    @Override
    public void sayHello(HelloWorldService.HelloRequest request,
                         StreamObserver<HelloWorldService.HelloResponse> responseObserver) {
        String message = request.getMessage();
        logger.info("Client Received message:{}", message);

        // 创建结果,返回响应内容
        String rsp = String.format("Hello, %s. This message have send to server", message);
        HelloWorldService.HelloResponse response = HelloWorldService.HelloResponse
                .newBuilder()
                .setMessage(rsp)
                .build();
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }

demo-consumer

客服端项目的目录结构:

  • Starter:springboot 的启动类
  • GrpcClient:客户端的启动类
  • HelloController:对外提供服务

在这里插入图片描述

pom 文件,主要是导入 springboot 的启动的依赖,以及 grpc 的依赖,同样也需要引入 api 项目的依赖。

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.parallelline1996</groupId>
    <artifactId>grpc-springboot-demo-consumer</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.parallelline1996</groupId>
            <artifactId>grpc-springboot-demo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!-- spring boot -->
        <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>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-all</artifactId>
            <version>1.28.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0-jre</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.5.21.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

Starter,启动类,与服务端服务启动类无差异。

@SpringBootApplication
public class Starter implements CommandLineRunner {

    private GrpcClient configuration;

    public Starter(GrpcClient configuration) {
        this.configuration = configuration;
    }

	// 启动 grpc 客户端
    @Override
    public void run(String... args) {
        configuration.start();
    }

	// 启动 springboot 容器
    public static void main(String[] args) {
        SpringApplication.run(Starter.class, args);
    }
}

GrpcClient,gRPC 客户端,主要作用是监听 gRPC 服务端,开启通道。

@Component
public class GrpcClient {

    private static final Logger logger = LoggerFactory.getLogger(GrpcClient.class);

    // Grpc 服务端的地址
    @Value("${grpc.server.host}")
    private String host;

    // Grpc 服务端暴露的接口
    @Value("${grpc.server.port}")
    private int port;

    private HelloWorldGrpc.HelloWorldBlockingStub stub;
    private HelloWorldGrpc.HelloWorldFutureStub futureStub;

    public void start() {
        // 开启channel
        ManagedChannel channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();

        // 通过 channel 获取服务端 blocking-stub
        stub = HelloWorldGrpc.newBlockingStub(channel);
        // 通过 channel 获取服务端 future-stub
        futureStub = HelloWorldGrpc.newFutureStub(channel);

        logger.info("gRPC client start, server address: host:{}, port:{}", host, port);
    }

    public HelloWorldGrpc.HelloWorldBlockingStub getStub() {
        return this.stub;
    }

    public HelloWorldGrpc.HelloWorldFutureStub getFutureStub() {
        return this.futureStub;
    }
}

gRPC 的客户端支持三种调用方式:

  • 同步调用
  • 基于 Future 的异步调用
  • 基于回调的异步调用

下面的代码分别对应三种调用方式:

@RestController
public class HelloController {

    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);

    @Autowired
    GrpcClient configuration;

    /**
     * 同步调用,阻塞
     */
    @GetMapping("/hello")
    public String hello(@RequestParam(name = "name", defaultValue = "test", required = false) String name) {
        logger.info("Server received request.name={}", name);
        // 构建一个请求
        HelloWorldService.HelloRequest request = HelloWorldService.HelloRequest
                .newBuilder()
                .setMessage(name)
                .build();

        // 使用stub发送请求至服务端
        try {
			// 这里获取了一个 blocking-stub
            HelloWorldGrpc.HelloWorldBlockingStub stub = configuration.getStub();
            // 同步发送,将阻塞等待请求结果
            HelloWorldService.HelloResponse response = stub.sayHello(request);
            logger.info("Server response received: [{}]", response.toString());
            return response.getMessage();
        } catch (StatusRuntimeException e) {
            logger.info(" Error Received - Error code : {}", e.getStatus().getCode());
        }
        return "error";
    }

    /**
     * 基于 Future 的异步调用
     */
    @GetMapping("/hello-async-future")
    public String helloAsyncFuture(@RequestParam(name = "name", defaultValue = "test", required = false) String name) {
        logger.info("Server received request.name={}", name);
        // 构建一个请求
        HelloWorldService.HelloRequest request = HelloWorldService.HelloRequest
                .newBuilder()
                .setMessage(name)
                .build();

        // 使用stub发送请求至服务端
        try {
            // 获取 future-stub 对象,调用请求后,将获取 future
            ListenableFuture<HelloWorldService.HelloResponse> listenableFuture = configuration.getFutureStub().sayHello(request);
            // 通过 future 对象的 get 请求获取结果
            // 由于在同一线程中调用,并没有实现真正的异步,仍为同步阻塞
            HelloWorldService.HelloResponse response = listenableFuture.get();
            logger.info("Server response received: [{}]", response.toString());
            return response.getMessage();
        } catch (StatusRuntimeException e) {
            logger.info(" Error Received - Error code : {}", e.getStatus().getCode());
        } catch (Exception e) {
            logger.error("error ", e);
        }
        return "error";
    }

    /**
     * 基于回调的异步调用
     */
    @GetMapping("/hello-async-callback")
    public String helloAsyncCallback(@RequestParam(name = "name", defaultValue = "test", required = false) String name) {
        logger.info("Server received request.name={}", name);
        // 构建一个请求
        HelloWorldService.HelloRequest request = HelloWorldService.HelloRequest
                .newBuilder()
                .setMessage(name)
                .build();

        // 使用stub发送请求至服务端
        try {
            HelloWorldGrpc.HelloWorldFutureStub futureStub = configuration.getFutureStub();
            ListenableFuture<HelloWorldService.HelloResponse> listenableFuture = futureStub.sayHello(request);

			// 通过设备监听器,同时指定回调线程池的方式进行
            listenableFuture.addListener(() -> {
                try {
                    HelloWorldService.HelloResponse response = listenableFuture.get();
                    logger.info("Server response received: [{}]", response.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, new ThreadPoolExecutor(1, 1, 60,
                    TimeUnit.MILLISECONDS, new SynchronousQueue<>()));

            return "async";
        } catch (StatusRuntimeException e) {
            logger.info(" Error Received - Error code : {}", e.getStatus().getCode());
        } catch (Exception e) {
            logger.error("error ", e);
        }
        return "error";
    }
}

完整的代码连接:https://github.com/Parallelline1996/Daily-Learning/tree/master/gRPC/code-repository/grpc-springboot-demo

springboot 使用 GRPC 说明GRPC是什么?首先我们知道RPC是远程过程调用。而GRPC是RPC的一种实现。那么为什么要用GRPC呢?因为它支持跨语言的开发,换句话说,大家都用过FeignRPC,尤其在springcloud中。然而它只支持java语言,而作为微服务,可能有很多其他的服务不是java开发的。因此需要满足这个需求,就需要一个跨语言的RPC,所以就会考虑使用GRPC好了,下面进入正题直接上代码。我们做一个Service和一个Client进行交互。... 阅读详情

相关推荐

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7212

Grpc项目集成到java方式调用实践

gRPC 被设计为可跨多种环境(包括客户端、服务器和各种语言)使用,支持多种编程语言,如 C、C++、Java、Go、Python、Ruby、Node.js 等。总的来说,gRPC 是一个强大的远程过程调用框架,适用于构建分布式系统中的各种服务,并且在性能、跨语言支持和安全性方面具有很多优势。安装指定插件,网上说还要Protobuf buffer 安装,但是我用的idea2018的版本搜索不到,这个不是必须的,可以不用。

2245

COMSOL报错调试总结(不定期更新)

COMSOL报错调试总结1. 可定位错误1.1 除零错误1.2 未定义变量值1.3 边界条件/材料属性等缺失2. 难定位错误2.1. 装配期间内存不足 官方给的案例总是非常完美,运行流畅,结果完美。但是自己做模型时候就总是报错,而且不像自己coding的程序那样可以明确定位哪里出了bug。这里把我碰到的一些报错问题以及调试方法记录下来~ 部分来源于以下参考来源: http://wap.sciencenet.cn/blog-1467490-1118453.html?mobile=1 1. 可定位错误 以下错误

jessica0307的博客 8万+

GRPC远程调用

RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。

jianfeng123123的博客 2737

网络安全隔离技术解析:单向网闸与双向网闸的核心差异与应用场景

本文深入解析网络安全隔离技术中的单向网闸与双向网闸,详细比较两者的核心差异与应用场景。单向网闸通过物理隔离确保数据单向流动,适用于金融交易等高风险场景;双向网闸则支持严格安检的双向数据交互,常见于医疗、政务等领域。文章还提供了选型建议和技术发展趋势,帮助读者根据安全需求和业务场景选择最适合的网闸解决方案。

weixin_29323365的博客 527

Haystack框架实战:从零构建企业级智能问答系统

自然语言处理(NLP)技术通过让计算机理解和生成人类语言,正在深刻改变信息检索与交互方式。其核心原理在于将文本转化为机器可处理的向量表示,并通过语义相似度计算实现精准匹配。这一技术价值在于能够从海量非结构化数据中快速提取精准信息,大幅提升知识获取效率。在工程实践中,检索增强生成(RAG)架构结合了密集向量检索与大语言模型生成能力,成为构建智能问答、知识库助手等应用的主流方案。该架构通过将用户查询与文档库进行语义匹配,并为大语言模型提供精准上下文,有效提升了回答的准确性与可追溯性。本文以Haystack这一生

weixin_42521032的博客 577

grpc框架_gRPC框架:同步、异步调用与流式编程

一、概览gRPC一开始由 google 开发,是一款语言中立、高性能、平台中立、开源的远程过程调用系统.通过IDL文件来定义一个服务,包含:方法、参数和返回类型。gRPC 基于HTTP/2标准设计,带来诸如双向流、流控、头部压缩。protobuf使用基础二、同步和异步回调,流式编程gRPC编程接口同时支持同步和异步的特点流式编程三、插件protoc-gen-grpc-java编译安装插件用于生成g...

weixin_39929721的博客 2270

金融学习之十三——数据去极值和标准化处理

拿到数据后,数据中可能会存在一些超大或极小的值,这些值与其他的值离得较远,显得格格不入,我们称其为离群点,有时也称为异常点。对于这些值,它的存在会导致影响最终的分析结果,带偏我们的分析。举个简单的例子,10个人的收入分别为2000,2500,2300,2425,2512,2375,2700,2265,2345,10000000,只算前9个,平均值就是2380,但加上最后一个,平均值就是1002144.2,就可能严重带偏最后分析的结果。因此,对于这样的数据,我们需要将其去除或修改。 (一)数据去极值 数据去极

ryo007gnnu的博客 7166

Spring Boot使用@Async实现异步调用

关注公众号获取最新文章一起进步JavaStorm.png==异步调用对应的是同步调用,同步调用可以理解为按照定义的顺序依次执行,有序性;异步调用在执行的时候不需要等待上一个指令调用结束就可以继续执行。==我们将在创建一个 Spring Boot 工程来说明。具体工程可以参考github代码 github.com/UniqueDong/… async模块pom 依赖如下:<dependency...

weixin_34376562的博客 178

ADES1831和ADBMS6830

1、上电默认进入STANDBY模式,SPI发送0xFF也可以进入STANDBY模式2、看门狗定时器超时后,进入SLEEP状态3、配置寄存器中的REFON位使用WRCFGA命令将组A设置为1进入REFUP状态,此状态比待机状态更快地启动ADC转换。i<TOTAL_IC;i++)注意:读AFE数据时会随着AFE片数增加而增加,原因是唤醒时间和AFE片数密切相关,如果需要缩短时间,那么减少唤醒频次。

m0_61973119的博客 263

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本文介绍哨兵1号用的FDBAQ算法,它实现非整数可变bit压缩,大部分数据仅需 3bit输出,少数高反射率数据需4bit输出,使得平均输出比特率刚超过3bit,比熵约束分块自适应量化 (ECBAQ)压缩算法所需的3.7bit更低。也就是说FDBAQ压缩完,除了要记录分块尺寸和各块的均值码(对应哨兵1号数据包里的THIDX)外,还需要记录霍夫曼码字的长度(对应哨兵1号数据包里的BRC)。唯一不同的就是量化后的编码规则使用了霍夫曼编码,相当于在传统的BAQ压缩流程的后面又加了一个步骤。

2301

springboot——grpc实现demo

grpc实现demo一、前言1、应用场景:Java做为服务端给go 提供接口2、 grpc: 数据的序列化以及进城数据通信的交互方式二、springboot 构建grpc 的demo1、版本对应:2、项目构建2.1 项目结构2.2 根pom文件2.3 grpc-lib 模块2.3.1 文件结构2.3.2 pom文件2.4 grpc-server 模块2.4.1 对应的pom 文件2.4.2 对应的...

JHC23的专栏 2859

Redhawk:toggle rate从哪来?

redhwak中toggle rate的相关设置

m0_61544122的博客 8109

grpc Java demo与Springboot改造支持grpc通信

最近调研grpc的情况,发现grpc实际上还是HTTP2协议,实际上就是http2+proto传输。那么是否可以在现有的server支持呢,试了下,还真可以,但是笔者在返回数据时有个问题一直没有思路。

fenglllle的博客 2082

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringBoot集成Dubbo启用gRPC协议

Dubbo 在 2.7.5 版本开始支持原生 gRPC 协议,对于计划使用 HTTP/2 通信或者期望 gRPC 协议支持服务治理能力的,都可以考虑接入 Dubbo 体系启用 gRPC 协议。由于官网给的 代码示例 是基于 spring,现在基本上都是基于SpringBoot开发,所以本文提供一下 SpringBoot 的代码示例。此外还会简单说明 Dubbo 支持的原生 gRPC 协议与原生 gRPC 协议在代码开发时的区别。如果对gRPC协议不了解的,后续文章会有更新,请持续关注。

二蛋的博客 3386

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

grpc-java 常用.proto类型Java代码 demo

grpc-java 常用的.proto类型 demo 整理 博主近期在调研 istio,其中涉及需要将自己部门的 rpc 框架切换到 grpc-java 上,因此对 grpc-java 进行了相关调研,这里就对常用的.proto类型进行整理。 .proto文件中消息结构里用于定义字段的标准数据类型如下表所示,后面几列是.proto文件中定义的标准类型编译转换后在编程语言中的类型对照。 下面将对上面提到的 .proto 类型在 Java 代码中的使用给出代码示例 (下面的项目将在上一个示例:grpc-j.

卤小蛋学编程 1896

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java版GRPC服务的搭建(基于SpringBoot)

Java版GRPC服务的搭建(基于SpringBoot+Maven) 基本概念 简介 [RPC][https://www.jianshu.com/p/9c947d98e192](remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。 [gRPC][https://www.oschina.net/p/grpc-framework

qq_43185617的博客 2342

gRPC与SpringBoot集成

本文主要讲解了gRPC如何与SpringBoot集成。

罗小爬的技术宝书 7829

结合 springboot实现 grpc 的简单demo

最近有需要要用java 去实现grpc调用,就查了些资料,总算是跑通了,就做个简单的总结(ps:可能有不对的地方,欢迎指出) 概览grpc-lib部分pom.xml文件Greeter.proto 文件编译proto整个工程结构grpc-server部分目录结构(proto目录可忽略)pom.xmlGrpcServerService.java 文件,具体方法的实现Application.java,application.yml配置服务端口grpc-client部分目录结构GrpcClient.javaApp

Rowlingz 1395

springboot-grpc

grpc简介: 官网地址:https://grpc.io/ gRPC是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务,并且为客户端和服务端自动生成可靠的功能库。 在gRPC客户端可以直接调用不同服务器上的远程程序,使用姿势看起来...

superlchao的博客 956

springboot 集成GRPC

springboot 集成GRPC

sunrj_niu的博客 2289

一文看懂gRPC远程调用框架

gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 2015年主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf 序列化协议开发,且支持众多开发语言。由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由 gRPC 框架实现的底层通信的关注。

霁晨晨晨的博客 4万+

SpringBoot集成grpc实现微服务

传统的SpringCloud实现微服务的方案中,我们通常都是使用SpringCloud OpenFeign组件以RESTFUL API的调用方式来完成微服务之间的RPC调用;使用RESTFUL API的方式在SpringCloud实施的微服务在实际的项目中还是非常常见的;在实现上比较的简单,而且关于RPC调用中的服务熔断等处理的组件也支持的较多;一般的SpringCloud都是采用OpenFeign通过HTTP的方式;今天我们这个文章给大家介绍一种在云原生中应用的更为广泛的RPC调用的方式gRPC;

2343

springboot grpc eureka demo实战项目

简介 grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。 eureka 是Netflix开源的一个RESTful服务,主要用于服务的注册发现。 Git地址 https://gitee.com/wqrzsy/lp-demo/tree/master/lp-eureka-grpc 更多demo请关注 springboot demo实战项目 java 脑...

766

Springboot-grpc-Demo

为了展示gRPC的工作原理,我们来构建一个客户端和相应的服务器,以公开一个简单的Hello World gRPC服务。 pom文件 <?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.apa

qq_47848696的博客 550
上一篇: grpc-java 源码阅读环境搭建
下一篇: 【GitHub Desktop】提交提交时 出现 Authentication failed 错误
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值