springboot項(xiàng)目同時(shí)啟動(dòng)web服務(wù)和grpc服務(wù)的方法
前言
這是我在這個(gè)網(wǎng)站整理的筆記,有錯(cuò)誤的地方請指出
一. 創(chuàng)建項(xiàng)目
我們創(chuàng)建一個(gè)maven項(xiàng)目

如下,maven項(xiàng)目創(chuàng)建成功了

二. 引入依賴
引入spring-boot-starter-web依賴和grpc-client-spring-boot-starter依賴
<dependencies>
<!-- BEGIN 如果想使用 Tomcat 注釋掉以下代碼 -->
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
<version>2.5.4</version>
</dependency>
<!-- web 容器使用 undertow 性能更強(qiáng) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
<version>2.13.1.RELEASE</version>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-server-spring-boot-starter</artifactId>
<version>2.13.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.16.1:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后我們創(chuàng)建一個(gè)application.yml文件,指定兩個(gè)服務(wù)的啟動(dòng)端口,不要設(shè)置為一樣的端口,因?yàn)镠TTP和gRPC是兩個(gè)不同的協(xié)議,它們的實(shí)現(xiàn)方式和通信方式都不同。在同一個(gè)端口上同時(shí)使用HTTP和gRPC會導(dǎo)致端口沖突,無法正常工作。
# 開發(fā)環(huán)境配置
server:
# 服務(wù)器的HTTP端口,默認(rèn)為8089
port: 8089
grpc:
server:
port:
9091
三. 測試
做完以上操作后,我們就可以編寫http服務(wù)和grpc服務(wù)了,以下是一個(gè)簡單的測試代碼
啟動(dòng)類
/**
* @author: 那就叫小智吧
* @date: 2023/9/18 14:50
* @Version 1.0
* @Description:
*/
@SpringBootApplication
public class ChenApplication {
public static void main(String[] args)
{ SpringApplication.run(ChenApplication.class, args);
System.out.println("啟動(dòng)成功");
}
}
3.1 http服務(wù)
創(chuàng)建一個(gè)HelloWordWebController接口
/**
* @author: 那就叫小智吧
* @date: 2023/9/18 13:43
* @Version 1.0
* @Description:
*/
@RestController
public class HelloWordWebController {
@GetMapping(value = "/hello")
public String hello() {
return "神的孩子都在歌唱";
}
}
測試結(jié)果

3.2 grpc服務(wù)
proto文件
syntax = "proto3";
option java_multiple_files = true;
package helloWordGrpc;
message Person {
string first_name = 1;
string last_name = 2;
}
message Greeting {
string message = 1;
}
service HelloWorldService {
rpc sayHello (Person) returns (Greeting);
}
這里需要mvn clean 和mvn install 一下 ,確保target文件里面有這幾個(gè)對象

創(chuàng)建一個(gè)HelloWorldGrpcController接口
@GrpcService
public class HelloWorldGrpcController extends HelloWorldServiceGrpc.HelloWorldServiceImplBase {
@Override
public void sayHello(Person request,
StreamObserver<Greeting> responseObserver) {
String message = "Hello " + request.getFirstName() + " "
+ request.getLastName() + "!";
Greeting greeting =
Greeting.newBuilder().setMessage(message).build();
responseObserver.onNext(greeting);
responseObserver.onCompleted();
}
}
測試結(jié)果

四. 整體代碼結(jié)構(gòu)

到此這篇關(guān)于springboot項(xiàng)目同時(shí)啟動(dòng)web服務(wù)和grpc服務(wù)的方法的文章就介紹到這了,更多相關(guān)springboot啟動(dòng)web和grpc服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解JAVA 設(shè)計(jì)模式之狀態(tài)模式
這篇文章主要介紹了JAVA 狀態(tài)模式的的相關(guān)資料,文中講解的非常細(xì)致,幫助大家更好的學(xué)習(xí)理解JAVA 設(shè)計(jì)模式,感興趣的朋友可以了解下2020-06-06
SpringBoot手動(dòng)開啟事務(wù):DataSourceTransactionManager問題
這篇文章主要介紹了SpringBoot手動(dòng)開啟事務(wù):DataSourceTransactionManager問題,具有很好的價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java設(shè)計(jì)模式之裝飾模式(Decorator模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾模式(Decorator模式)介紹,本文講解了為什么使用Decorator、如何使用裝飾模式、Jive中的Decorator實(shí)現(xiàn)等內(nèi)容,需要的朋友可以參考下2015-03-03
MyBatis-plus與數(shù)據(jù)庫字段的映射方式
MyBatis-plus默認(rèn)開啟駝峰命名規(guī)則映射,即駝峰轉(zhuǎn)為下劃線,如果數(shù)據(jù)庫字段也是駝峰命名,會導(dǎo)致映射錯(cuò)誤,解決方法有兩種:使用@TableField注解指定數(shù)據(jù)庫字段名或關(guān)閉駝峰命名規(guī)則映射,數(shù)據(jù)庫設(shè)計(jì)規(guī)范應(yīng)優(yōu)先使用蛇形命名法,即全部小寫字母并用下劃線連接2025-11-11
使用Spring的ApplicationEvent實(shí)現(xiàn)本地事件驅(qū)動(dòng)的實(shí)現(xiàn)方法
本文介紹了如何使用Spring的ApplicationEvent實(shí)現(xiàn)本地事件驅(qū)動(dòng),通過自定義事件和監(jiān)聽器,實(shí)現(xiàn)模塊之間的松耦合,提升代碼的可維護(hù)性和擴(kuò)展性。同時(shí)還介紹了異步事件和事件傳遞的相關(guān)知識2023-04-04
在java poi導(dǎo)入Excel通用工具類示例詳解
這篇文章主要給大家介紹了關(guān)于在java poi導(dǎo)入Excel通用工具類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09
Java代理模式與動(dòng)態(tài)代理之間的關(guān)系以及概念
代理模式是開發(fā)中常見的一種設(shè)計(jì)模式,使用代理模式可以很好的對程序進(jìn)行橫向擴(kuò)展。動(dòng)態(tài)代理:代理類在程序運(yùn)行時(shí)被創(chuàng)建的代理方式。關(guān)鍵在于動(dòng)態(tài),程序具有了動(dòng)態(tài)特性,可以在運(yùn)行期間根據(jù)不同的目標(biāo)對象生成動(dòng)態(tài)代理對象2023-02-02

