Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - spring-projects/spring-grpc · GitHub
Skip to content

Spring gRPC

Build Status

Welcome to the Spring gRPC project!

The Spring gRPC project provides a Spring-friendly API and abstractions for developing gRPC applications. There is a core library that makes it easy to work with gRPC and dependency injection, and a Spring Boot starter that makes it easy to get started with gRPC in a Spring Boot application (with autoconfiguration and configuration properties, for instance).

For further information go to our Spring gRPC reference documentation.

Getting Started

📌 NOTE
Spring gRPC 1.0.x supports Spring Boot 4.1.x

This section offers jumping off points for how to get started using Spring gRPC. There is a simple sample project in the samples directory (e.g. grpc-server). You can run it with mvn spring-boot:run or gradle bootRun. You will see the following code in that sample.

Want to get started? Let’s speedrun a working service.

Go to the Spring Initializr and select the gRPC dependency.

Generate the project and unzip the downloaded result.

Open it in your IDE in the usual way. E.g. if you’re using IntelliJ IDEA: idea pom.xml; or for VSCode code ..

Define a .proto service definition file src/main/proto/hello.proto with the following contents:

❗ IMPORTANT
Be sure to change the java_package to the one you chose in Spring Initializr

syntax="proto3";
optionjava_multiple_files=true;
optionjava_package="<your-package-name-goes-here>.proto";
optionjava_outer_classname="HelloWorldProto";
// The greeting service definition.serviceSimple {
// Sends a greetingrpcSayHello(HelloRequest) returns (HelloReply) {}
rpcStreamHello(HelloRequest) returns (streamHelloReply) {}
}
// The request message containing the user's name.messageHelloRequest {
stringname=1;
}
// The response message containing the greetingsmessageHelloReply {
stringmessage=1;
}

We’ll want to define the stubs for a Java service based on this definition:

./mvnw clean package

or

./gradlew build

Two new folders will be generated containing the source code for the stubs.

For Maven: target/generated-sources/protobuf/grpc-java and target/generated-sources/protobuf/java

For Gradle: build/generated/source/proto/main/grpc and build/generated/source/proto/main/java

You may need to instruct your IDE to mark them as source roots. In IntelliJ IDEA, right-click the folder, choose Mark Directory As -> Generated Source Root. Eclipse or VSCode will add them automatically for you.

Now you can implement a service based on the generated stubs:

@ServiceclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
privatestaticLoglog = LogFactory.getLog(GrpcServerService.class);
@OverridepublicvoidsayHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
if (req.getName().startsWith("error")) {
thrownewIllegalArgumentException("Bad name: " + req.getName());
}
if (req.getName().startsWith("internal")) {
thrownewRuntimeException();
}
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello ==> " + req.getName()).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
@OverridepublicvoidstreamHello(HelloRequestreq, StreamObserver<HelloReply> responseObserver) {
log.info("Hello " + req.getName());
intcount = 0;
while (count < 10) {
HelloReplyreply = HelloReply.newBuilder().setMessage("Hello(" + count + ") ==> " + req.getName()).build();
responseObserver.onNext(reply);
count++;
try {
Thread.sleep(1000L);
} catch (InterruptedExceptione) {
Thread.currentThread().interrupt();
responseObserver.onError(e);
return;
}
}
responseObserver.onCompleted();
}
}

Run the program in the usual way:

./mvnw spring-boot:run

or

./gradlew bootRun

You can try it out using a gRPC client like grpcurl:

grpcurl -d '{"name":"Hi"}' -plaintext localhost:9090 Simple.SayHello

You should get a response like this:

{
"message": "Hello ==\u003e Hi"
}

More details on what is going on in the next section.

Details

You should follow the steps in each of the following section according to your needs.

Add Milestone and Snapshot Repositories

If you prefer to add the dependency snippets by hand, follow the directions in the following sections.

To use the Milestone and Snapshot version, you need to add references to the Spring Milestone and/or Snapshot repositories in your build file.

For Maven, add the following repository definitions as needed (if you are using snapshots or milestones):

 <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>

For Gradle, add the following repository definitions as needed:

repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
maven { url 'https://repo.spring.io/snapshot' }
}

Dependency Management

The spring-grpc-dependencies artifact declares the recommended versions of the dependencies used by a given release of Spring gRPC, excluding dependencies already managed by Spring Boot dependency management.

The spring-grpc-build-dependencies artifact declares the recommended versions of all the dependencies used by a given release of Spring gRPC, including dependencies already managed by Spring Boot dependency management.

If you are running Spring gRPC in a Spring Boot application then use spring-grpc-dependencies, otherwise use spring-grpc-build-dependencies.

Using one of these dependency modules avoids the need for you to specify and maintain the dependency versions yourself. Instead, the version of the dependency module you are using determines the utilized dependency versions. It also ensures that you’re using supported and tested versions of the dependencies by default, unless you choose to override them.

📌 NOTE
The examples below assume you are running inside a Spring Boot application and therefore use spring-boot-dependencies either explicitly or implicitly by using the Spring Boot starter parent or Gradle plugin.

You need a Protobuf file that defines your service and messages, and you will need to configure your build tools to compile it into Java sources. This is a standard part of gRPC development (i.e. nothing to do with Spring). We now come to the Spring gRPC features.

gPRC Server

Create a @Bean of type BindableService. For example:

@ServicepublicclassGrpcServerServiceextendsSimpleGrpc.SimpleImplBase {
...
}

(BindableService is the interface that gRPC uses to bind services to the server and SimpleImplBase was created for you from your Protobuf file.)

Then, you can just run your application and the gRPC server will be started on the default port (9090). Here’s a simple example (standard Spring Boot application):

@SpringBootApplicationpublicclassGrpcServerApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(GrpcServerApplication.class, args);
}
}

Run it from your IDE, or on the command line with ./mvnw spring-boot:run or ./gradlew bootRun.

gRPC Client

To create a simple gRPC client, you can use the Spring Boot client starter (see above - it’s the same as for the server but with the client-specific dependencies). Then you can inject a bean of type GrpcChannelFactory and use it to create a gRPC channel. The most common usage of a channel is to create a client that binds to a service, such as the one above. The Protobuf-generated sources in your project will contain the stub classes, and they just need to be bound to a channel. For example, to bind to the SimpleGrpc service on a local server:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("0.0.0.0:9090"));
}

Then you can inject the stub and use it in your application.

The default GrpcChannelFactory implementation can also create a "named" channel, which you can then use to extract the configuration to connect to the server. For example:

@BeanSimpleGrpc.SimpleBlockingStubstub(GrpcChannelFactorychannels) {
returnSimpleGrpc.newBlockingStub(channels.createChannel("local"));
}

then in application.properties:

spring.grpc.client.channels.local.address=0.0.0.0:9090

There is a default named channel that you can configure in the same way via spring.grpc.client.default-channel.*. It will be used by default if there is no channel with the name specified in the channel creation.

Native Images

Native images are supported for gRPC servers and clients. You can build in the normal Spring Boot way for your build tool (Maven or Gradle).

About

No description, website, or topics provided.

Resources

Code of conduct

Contributing

Security policy

Stars

411 stars

Watchers

12 watching

Forks

Releases

Packages

Used by

Contributors

Languages