# 使用Spring Boot+gRPC构建微服务并部署到Istio
作为`Service Mesh`和云原生技术的忠实拥护者,我却一直没有开发过Service Mesh的应用。正好最近受够了Spring Cloud的“折磨”,对Kubernetes也可以熟练使用了,而且网上几乎没有Spring Boot微服务部署到Istio的案例,我就开始考虑用Spring Boot写个微服务的Demo并且部署到Istio。项目本身不复杂,就是发送一个字符串并且返回一个字符串的最简单的Demo。
> 题外话:我本来是想用Spring MVC写的——因为周围有的同学不相信Spring MVC也可以开发微服务,但是Spring MVC的各种配置和依赖问题把我整的想吐,为了少掉几根头发,还是用了方便好用的Spring Boot。
**本项目的所有代码都上传到了GitHub,地址:** https://github.com/WenDev/spring-boot-istio-demo **如果有帮助的话不要吝啬你的Star和Fork呀,非常感谢~**
## 为什么要用Istio?
目前,对于Java技术栈来说,构建微服务的最佳选择是`Spring Boot`而Spring Boot一般搭配目前落地案例很多的微服务框架`Spring Cloud`来使用。
Spring Cloud看似很完美,但是在实际上手开发后,很容易就会发现Spring Cloud存在以下比较严重的问题:
- 服务治理相关的逻辑存在于Spring Cloud Netflix等SDK中,与业务代码紧密耦合。
- SDK对业务代码侵入太大,SDK发生升级且无法向下兼容时,业务代码必须做出改变以适配SDK的升级——即使业务逻辑并没有发生任何变化。
- 各种组件令人眼花缭乱,质量也参差不齐,学习成本太高,且组件之间代码很难完全复用,仅仅为了实现治理逻辑而学习SDK也并不是很好的选择。
- 绑定于Java技术栈,虽然可以接入其他语言但要手动实现服务治理相关的逻辑,不符合微服务“可以用多种语言进行开发”的原则。
- Spring Cloud仅仅是一个开发框架,没有实现微服务所必须的服务调度、资源分配等功能,这些需求要借助Kubernetes等平台来完成。但Spring Cloud与Kubernetes功能上有重合,且部分功能也存在冲突,二者很难完美配合。
替代Spring Cloud的选择有没有呢?有!它就是`Istio`。
Istio彻底把治理逻辑从业务代码中剥离出来,成为了独立的进程(Sidecar)。部署时两者部署在一起,在一个Pod里共同运行,业务代码完全感知不到Sidecar的存在。这就实现了治理逻辑对业务代码的零侵入——实际上不仅是代码没有侵入,在运行时两者也没有任何的耦合。这使得不同的微服务完全可以使用不同语言、不同技术栈来开发,也不用担心服务治理问题,可以说这是一种很优雅的解决方案了。
所以,“为什么要使用Istio”这个问题也就迎刃而解了——因为Istio解决了传统微服务诸如业务逻辑与服务治理逻辑耦合、不能很好地实现跨语言等痛点,而且非常容易使用。只要会用Kubernetes,学习Istio的使用一点都不困难。
## 为什么要使用gRPC作为通信框架?
在微服务架构中,服务之间的通信是一个比较大的问题,一般采用RPC或者RESTful API来实现。
Spring Boot可以使用`RestTemplate`调用远程服务,但这种方式不直观,代码也比较复杂,进行跨语言通信也是个比较大的问题;而`gRPC`相比Dubbo等常见的Java RPC框架更加轻量,使用起来也很方便,代码可读性高,并且与Istio和Kubernetes可以很好地进行整合,在Protobuf和HTTP2的加持下性能也还不错,所以这次选择了gRPC来解决Spring Boot微服务间通信的问题。并且,虽然gRPC没有服务发现、负载均衡等能力,但是Istio在这方面就非常强大,两者形成了完美的互补关系。
由于考虑到各种`grpc-spring-boot-starter`可能会对Spring Boot与Istio的整合产生不可知的副作用,所以这一次我没有用任何的`grpc-spring-boot-starter`,而是直接手写了gRPC与Spring Boot的整合。不想借助第三方框架整合gRPC和Spring Boot的可以简单参考一下我的实现。
## 编写业务代码
首先使用`Spring Initializr`建立父级项目`spring-boot-istio`,并引入`gRPC`的依赖。pom文件如下:
```xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<modules>
<module>spring-boot-istio-api</module>
<module>spring-boot-istio-server</module>
<module>spring-boot-istio-client</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>site.wendev</groupId>
<artifactId>spring-boot-istio</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-istio</name>
<description>Demo project for Spring Boot With Istio.</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.28.1</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
```
然后建立公共依赖模块`spring-boot-istio-api`,pom文件如下,主要就是gRPC的一些依赖:
```xml
<?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">
<parent>
<artifactId>spring-boot-istio</artifactId>
<groupId>site.wendev</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot-istio-api</artifactId>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</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.11.3:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.28.1:exe:${os.detected.classifier}</pluginArtifact>
<protocExecutable>/Users/jiangwen/tools/protoc-3.11.3/bin/protoc</protocExecutable>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
```
建立src/main/p
没有合适的资源?快使用搜索试试~ 我知道了~
spring-boot-istio-master.zip
共151个文件
xml:124个
java:10个
yml:6个
需积分: 0 0 下载量 163 浏览量
2023-12-14
14:15:06
上传
评论
收藏 112KB ZIP 举报
温馨提示
spring-boot-istio-master.zip
资源推荐
资源详情
资源评论
收起资源包目录
spring-boot-istio-master.zip (151个子文件)
Dockerfile 398B
Dockerfile 275B
.gitignore 333B
.gitignore 243B
spring-boot-istio-server.iml 13KB
spring-boot-istio-client.iml 13KB
spring-boot-istio-api.iml 5KB
spring-boot-istio.iml 585B
HelloWorldService.java 47KB
HelloWorldGrpc.java 12KB
GrpcServerConfiguration.java 2KB
GrpcClientConfiguration.java 1KB
HelloController.java 1KB
HelloServiceImpl.java 1KB
GrpcClientCommandLineRunner.java 984B
GrpcCommandLineRunner.java 632B
HelloServerApplication.java 406B
HelloClientApplication.java 406B
README.md 23KB
.name 17B
hello.proto 332B
workspace.xml 5KB
pom.xml 3KB
pom.xml 3KB
pom.xml 2KB
pom.xml 2KB
compiler.xml 1KB
Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml 934B
Maven__org_springframework_boot_spring_boot_actuator_autoconfigure_2_2_6_RELEASE.xml 896B
jarRepositories.xml 880B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_2_6_RELEASE.xml 868B
Maven__org_springframework_boot_spring_boot_starter_validation_2_2_6_RELEASE.xml 868B
Maven__org_springframework_boot_spring_boot_starter_actuator_2_2_6_RELEASE.xml 854B
Maven__org_springframework_boot_spring_boot_starter_logging_2_2_6_RELEASE.xml 847B
Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_6_RELEASE.xml 840B
Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_3.xml 835B
Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_6_RELEASE.xml 833B
Maven__org_springframework_boot_spring_boot_starter_json_2_2_6_RELEASE.xml 826B
Maven__org_springframework_boot_spring_boot_starter_test_2_2_6_RELEASE.xml 826B
Maven__org_springframework_boot_spring_boot_starter_web_2_2_6_RELEASE.xml 819B
modules.xml 815B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 799B
Maven__org_springframework_boot_spring_boot_devtools_2_2_6_RELEASE.xml 798B
Maven__org_springframework_boot_spring_boot_actuator_2_2_6_RELEASE.xml 798B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_3.xml 794B
Maven__org_springframework_boot_spring_boot_starter_2_2_6_RELEASE.xml 791B
Maven__com_google_auth_google_auth_library_credentials_0_20_0.xml 790B
Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_3.xml 780B
Maven__org_hibernate_validator_hibernate_validator_6_0_18_Final.xml 780B
Maven__com_google_api_grpc_proto_google_common_protos_1_17_0.xml 771B
Maven__org_springframework_boot_spring_boot_test_2_2_6_RELEASE.xml 770B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_33.xml 759B
Maven__org_springframework_spring_expression_5_2_5_RELEASE.xml 757B
Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml 751B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_3.xml 750B
Maven__org_codehaus_mojo_animal_sniffer_annotations_1_18.xml 749B
Maven__org_springframework_spring_context_5_2_5_RELEASE.xml 736B
Maven__org_springframework_boot_spring_boot_2_2_6_RELEASE.xml 735B
Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml 732B
Maven__jakarta_activation_jakarta_activation_api_1_2_2.xml 732B
Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml 732B
Maven__org_junit_platform_junit_platform_commons_1_5_2.xml 732B
Maven__com_fasterxml_jackson_core_jackson_databind_2_10_3.xml 729B
Maven__org_springframework_spring_webmvc_5_2_5_RELEASE.xml 729B
Maven__org_junit_platform_junit_platform_engine_1_5_2.xml 725B
Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_33.xml 724B
Maven__org_springframework_spring_beans_5_2_5_RELEASE.xml 722B
Maven__io_netty_netty_handler_proxy_4_1_48_Final.xml 720B
Maven__org_checkerframework_checker_compat_qual_2_5_5.xml 719B
Maven__org_springframework_spring_test_5_2_5_RELEASE.xml 715B
Maven__org_springframework_spring_core_5_2_5_RELEASE.xml 715B
Maven__org_junit_jupiter_junit_jupiter_params_5_5_2.xml 714B
Maven__org_junit_jupiter_junit_jupiter_engine_5_5_2.xml 714B
Maven__jakarta_xml_bind_jakarta_xml_bind_api_2_3_3.xml 710B
Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_33.xml 710B
Maven__javax_annotation_javax_annotation_api_1_3_2.xml 710B
Maven__org_springframework_spring_web_5_2_5_RELEASE.xml 708B
Maven__org_springframework_spring_jcl_5_2_5_RELEASE.xml 708B
Maven__org_springframework_spring_aop_5_2_5_RELEASE.xml 708B
Maven__org_jboss_logging_jboss_logging_3_4_1_Final.xml 707B
Maven__org_apache_logging_log4j_log4j_to_slf4j_2_12_1.xml 707B
Maven__io_netty_netty_codec_http2_4_1_48_Final.xml 706B
Maven__io_netty_netty_codec_socks_4_1_48_Final.xml 706B
Maven__com_fasterxml_jackson_core_jackson_core_2_10_3.xml 701B
Maven__io_netty_netty_codec_http_4_1_48_Final.xml 699B
Maven__org_mockito_mockito_junit_jupiter_3_1_0.xml 697B
Maven__org_junit_jupiter_junit_jupiter_api_5_5_2.xml 693B
Maven__io_netty_netty_transport_4_1_48_Final.xml 692B
Maven__com_google_j2objc_j2objc_annotations_1_3.xml 686B
Maven__io_netty_netty_resolver_4_1_48_Final.xml 685B
Maven__com_google_protobuf_protobuf_java_3_11_0.xml 680B
Maven__io_netty_netty_handler_4_1_48_Final.xml 678B
Maven__net_bytebuddy_byte_buddy_agent_1_10_8.xml 677B
Maven__org_apache_logging_log4j_log4j_api_2_12_1.xml 672B
Maven__io_netty_netty_common_4_1_48_Final.xml 671B
Maven__org_apiguardian_apiguardian_api_1_1_0.xml 671B
Maven__io_netty_netty_buffer_4_1_48_Final.xml 671B
Maven__com_google_android_annotations_4_1_1_4.xml 669B
Maven__io_grpc_grpc_protobuf_lite_1_28_1.xml 667B
Maven__ch_qos_logback_logback_classic_1_2_3.xml 667B
共 151 条
- 1
- 2
资源评论
普通人zzz~
- 粉丝: 181
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功