来简单看一下他们的功能对比:
功能列表 | Spring Cloud | Isito |
---|---|---|
服务注册与发现 | 支持,基于Eureka,consul等组件,提供server,和Client管理 | 支持,基于XDS接口获取服务信息,并依赖“虚拟服务路由表”实现服务发现 |
链路监控 | 支持,基于Zikpin或者Pinpoint或者Skywalking实现 | 支持,基于sideCar代理模型,记录网络请求信息实现 |
API网关 | 支持,基于zuul或者spring-cloud-gateway实现 | 支持,基于Ingress gateway以及egress实现 |
熔断器 | 支持,基于Hystrix实现 | 支持,基于声明配置文件,最终转化成路由规则实现 |
服务路由 | 支持,基于网关层实现路由转发 | 支持,基于iptables规则实现 |
安全策略 | 支持,基于spring-security组件实现,包括认证,鉴权等,支持通信加密 | 支持,基于RBAC的权限模型,依赖Kubernetes实现,同时支持通信加密 |
配置中心 | 支持,springcloud-config组件实现 | 不支持 |
性能监控 | 支持,基于Spring cloud提供的监控组件收集数据,对接第三方的监控数据存储 | 支持,基于SideCar代理,记录服务调用性能数据,并通过metrics adapter,导入第三方数据监控工具 |
日志收集 | 支持,提供client,对接第三方日志系统,例如ELK | 支持,基于SideCar代理,记录日志信息,并通过log adapter,导入第三方日志系统 |
工具客户端集成 | 支持,提供消息,总线,部署管道,数据处理等多种工具客户端SDK | 不支持 |
分布式事务 | 支持,支持不同的分布式事务模式:JTA,TCC,SAGA等,并且提供实现的SDK框架 | 不支持 |
其他 | …… | …… |
从上面表格中可以看到,如果从功能层面考虑,Spring Cloud与Service Mesh在服务治理场景下,有相当大量的重叠功能,从这个层面而言,为Spring Cloud向Service Mesh迁移提供了一种潜在的可能性。


从图中我们可以简要的分析出,一个基于Spring Cloud的微服务架构,主要包括四部分内容:服务网关,应用服务,外围支撑组件,服务管理控制台。
- 服务网关服务网关涵盖的功能包括路由,鉴权,限流,熔断,降级等对入站请求的统一拦截处理。具体可以进一步划分为外部网关(面向互联网)和内部网关(面向服务内部管理)。
- 应用服务应用服务是企业业务核心。应用服务内部由三部分内容构成:业务逻辑实现,外部组件交互SDK集成,服务内部运行监控集成。
- 外围支撑组件
外围支撑组件,涵盖了应用服务依赖的工具,包括注册中心,配置中心,消息中心,安全中心,日志中心等。 - 服务管理控制台
服务管理控制台面向服务运维或者运营人员,实现对应用服务运行状态的实时监控,以及根据情况需要能够动态玩成在线服务的管理和配置。
这里面哪些内容是我们可以拿掉或者说基于Service Mesh(以Istio为例)能力去做的?分析下来,可以替换的组件包括网关(gateway或者Zuul,由Ingress gateway或者egress替换),熔断器(hystrix,由SideCar替换),注册中心(Eureka及Eureka client,由Polit,SideCar替换),负责均衡(Ribbon,由SideCar替换),链路跟踪及其客户端(Pinpoint及Pinpoint client,由SideCar及Mixer替换)。这是我们在Spring Cloud解析中需要完成的目标:即确定需要删除或者替换的支撑模块。
- 删除组件,包括网关,熔断器,注册中心,负载均衡,链路跟踪组件,同时删除对应client的SDK;
- 替换组件,采用httpClient 的SDK支持http协议的远程调用(原来在Ribbon中),由原来基于注册中心的调用,转变成http直接调用;
- 配置信息变更,修改与删除组件管理的配置信息以及必要的组件交互代码(根据实际应用情况操作);
当然服务单元改造过程中,还会涉及到很多的细节问题,都需要根据应用特点进行处理,这里不做深入分析。
ROM openjdk:8-jre-alpine ENV TZ=Asia/Shanghai \ SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \ JAVA_OPTS="" \ JHIPSTER_SLEEP=0 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone CMD echo "The application will start in ${JHIPSTER_SLEEP}s..." && \ sleep ${JHIPSTER_SLEEP} && \ java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar # java ${JAVA_OPTS} -Djava.security.egd=environment:/dev/./urandom -jar /app.@project.packaging@ EXPOSE 8080 ADD microservice-demo.jar /app.jar
文件中定义了服务端口以及运行命令。
Maven-docker-plugin的插件配置如下所示:
<build> <finalName>microservice-demo</finalName> <plugins> ...... <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.0</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>${project.build.finalName}:${project.version}</image> <newName>${docker.registry.name}/${project.build.finalName}:${project.version}</newName> </configuration> </execution> <!--暂时不添加推送仓库的配置--> </executions> <configuration> <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory> <imageName>${project.build.finalName}:${project.version}</imageName> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.${project.packaging}</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
通过增加docker-maven-plugin,在执行mvn package的时候可以加载Dockerfile,自动构建服务的容器镜像(需要说明的前提是本地安装docker运行环境,或者通过环境变量在开发工具中配置Docker的远程连接环境),从而完成服务容器化改造。
集群部署方案主要考虑多集群,跨数据中心,存储选择,网络方案,集群内部主机标签划分,集群内部网络地址规划等多方面因素。
2. 集群规模
集群规模主要考虑etcd集群大小,集群内运行实例规模(用来配置ip范围段),集群高可用节点规模等因素。
基于以上两点来考虑容器化环境的部署方案,关键是合理规划,避免资源浪费。
Istio部署插件需要根据需要的场景,考虑采用的插件完整性,例如prometheus,kiali,是否开启TLS等,具体安装选项可以参考https://preliminary.istio.io/zh/docs/reference/config/installation-options/。
2. 跨集群部署
依据容器环境考虑是否需要支持Isito的跨集群部署方案.
其次,就目前Service Mesh的落地实现而言,对于一些特定需求的监测粒度有所欠缺,例如调用线程栈的监测(当然,从网络层考虑,或者不在Service Mesh的考虑范围之内),但是恰恰在很多服务治理场景的要求范围之中。我们也需要针对这种情况,考虑实现方案。
最后,大家一直诟病的性能和安全问题。目前已经有所加强,但是依然被吐槽。
整体而言,Spring Cloud是微服务实现服务治理平台的现状,而Service Mesh却是未来,当然也不能完全取而代之,毕竟设计思路和侧重点不同,是否迁移需要根据业务场景而定。
本文由博云研究院原创发表,转载请注明出处。