1、为什么要做SpringCloud腾讯SpringBoot+SpringCloud仍然是Java生态中最主流的框架SpringBoot在2014年4月发布了1.0版本,经过8年的时间,SpringBoot已经成为Java开发框架的事实标准。在分布式微服务领域,SpringCloud在2016年1月发布了Angel.SR5版本。SpringCloud继承了SpringBoot核心组件化、低配置、快速集成的核心思想,定义了一套标准的微服务SPI。基于这套SPI,出现了SpringCloudNetfix等优秀的微服务解决方案实现套件。在远程服务调用框架方面,Feign和RestTemplate基于通用的HTTP协议,在易用性、可观察性、跨语言等方面具有天然优势。所以SpringCloud自2016年首次发布后便蓬勃发展。从业界的角度来看,SpringBoot+SpringCloud是目前Java应用最广泛的开发框架之一。2018年以Istio为代表的ServiceMesh开始在社区孵化,到2022年已经有很多ServiceMesh产品。ServiceMesh的核心思想是将服务调用相关的基础能力下沉到独立的sidecar进程中,通过流量代理进行流量管理。这两种方案都不是万能的,Sidecar模式也存在一些问题。例如:sidecar高度依赖底层PaaS能力来管理sidecar(注入、版本管理、升级等),sidecar需要额外占用一定的资源,增加一定的网络延迟,增加难度故障排除等。因此,国内真正能把ServiceMesh落地的公司并不多。综上所述,我们认为在未来很长一段时间内,SpringBoot+SpringCloud仍将是Java中主流的微服务解决方案,尽管它似乎没有Istio和Dapr先进。在满足企业业务发展需求的前提下,低成本、高效率、稳定的架构方案才是最佳方案。腾讯将于2021年开源的PolarisMesh,提供一站式微服务解决方案。Polaris是集注册中心、配置中心、服务管理中心于一体的一站式微服务解决方案。已经覆盖了腾讯内部90%的业务,注册实例节点数达到500万。开源21年后,社区也有外部公司生产。公司内部的架构师经常会做一些技术选型,比如注册中心的Zookeeper、Consul、Nacos,配置中心的Apollo、Nacos,限流和断路器的Sentinel。多组件也意味着需要维护多套服务,占用更多资源,难以实现用户体验的一致性。因此,一站式的微服务解决方案可以大大简化技术选型、运维和资源成本。当然,您也可以使用Polaris作为解决方案的一部分。比如只使用Polaris服务注册和发现,配置中心还是选择Apollo。毕竟,还是一样的道理。没有一刀切的解决方案,最好的解决方案是适合企业业务需求的解决方案。此外,北极星在某些能力的横向比较上也具有一定的优势。例如,完全无状态的注册中心更易于运维,强大的服务路由能力支持复杂的业务场景。具体的产品特点将在第二部分进行更详细的介绍。总结基于以上两个核心原因,使用Polaris作为SpringCloud开箱即用的实现套件顺理成章。它可以同时满足SpringCloud用户和PolarisJava用户。当然,SpringCloudTencent目前只支持Polaris的能力,未来会支持腾讯更多优秀的开源产品。2.SpringCloudTencent模块详细介绍目前SpringCloudTencent主要提供微服务领域常用的服务注册与发现、配置中心、服务路由、限流熔断和元数据链路透传能力。接下来,我们将详细介绍各部分的能力。(图:腾讯SpringCloud能力大图)2.1服务注册和发现(SpringCloudTencentPolarisDiscovery)服务注册和发现是SpringCloudTencent的核心功能之一。通过实现SpringCloud服务注册和发现的标准接口,提供微服务应用快速访问Polaris服务注册中心的能力。开发者只需引入SpringCloud腾讯服务注册与发现的依赖,即可使用Polaris的服务注册与发现功能。接入服务注册和发现后,您还可以按需使用Polaris提供的强大的服务治理能力,例如基于场景的服务路由能力、服务熔断能力。方便开发者针对微服务的实际生产场景进行个性化的服务治理配置。Polaris的服务模型包括名称空间、服务和服务实例。NamespaceNamespace提供了一种在同一注册表下对资源进行逻辑隔离的机制。同一命名空间下的服务名称必须唯一,但允许跨命名空间的同名服务。命名空间通常用于区分不同的环境或隔离多个业务之间的服务。服务服务也是一个逻辑概念,提供特定业务领域的服务能力。如订单服务、用户服务、转账服务等。服务实例服务实例是一个服务下的具体物理节点。(图:服务实例详情)SpringCloudTencent在基础服务注册发现上提供了一些扩展能力。首先,腾讯SpringCloud集成了Polaris的一些路由插件。通过在Polaris控制台页面更改服务实例的隔离状态或权重值,可以实现服务实例的动态上下线特性,如上图所示。SpringCloudTencent还提供了多服务注册和发现的高级特性。例如,公司内部的多个部门或组织使用不同的服务注册中心。当决策技术栈统一或迁移到北极星注册中心时,需要采用平滑的方式进行业务改造,而不是直接替换原有的SDK。访问北极星注册表。这时候可以借助SpringCloud腾讯的多服务注册和发现能力,帮助开发者的微服务应用渡过技术栈转换的尴尬期。SpringCloudTencent提供的这一系列服务注册和发现的周边功能,提升了微服务架构的治理和控制能力。2.2配置中心(SpringCloud腾讯PolarisConfig)今年上半年,Polaris开始支持配置中心能力。PolarisConfigurationCenter的核心配置三元组模型是:Namespace用于逻辑隔离集群的能力,比如常用于隔离环境。FileGroup配置文件组,配置文件的集合。在SpringCloudTencent中,我们推荐的最佳实践是将一个应用作为一个FileGroup。框架类的配置,使用框架名作为一个FileGroup,比如dubbo。文件配置文件,比如yml格式的properties和配置文件。配置文件是最小的管理单元,不是配置文件中的配置项。[Namespace,FileGroup,File]唯一定位一个配置文件。在设计模型时,我们参考了业界主流的配置中心产品。我们认为配置文件和配置文件组的概念是被开发者广泛认可且理解成本最低的配置域模型,例如本地磁盘上的文件夹和文件。的概念。配置中心的核心能力是配置管理能力和动态实时推送能力。在配置管理方面,一个应用往往会有很多的配置文件,如何清晰的管理配置文件是一个非常重要的能力。我们在设计控制台UI的时候,创造性的将文件名以/作为分隔符,以树的形式展示出来。如下图,可以通过应用模块来划分目录,通过目录的方式可以将一个应用下杂乱的配置文件管理的一清二楚。(图:配置文件管理页面)另外,在SpringCloud集成方面,众所周知,SpringBoot会自动加载应用资源中的application.yml、application.properties和application-${activeProfile}.yml文件具有更高优先级的目录。在集成SpringCloudTencentPolarisConfig时,我们完全遵循了这种原生的配置加载机制。即当SpringCloudTencentPolarisConfig启动时,会自动将应用文件组下的application.yml和application-${activeProfile}.yml文件加载到Spring容器中。迁移时,用户只需将resources目录下的所有配置文件原封不动上传到Polaris即可。2.3服务路由(SpringCloudTencentPolarisRouter)在微服务领域,由于服务的细粒度拆分部署,服务变得非常轻量和灵活。结合k8s云原生极速弹性能力后如虎添翼。但是底层的PaaS能力只提供基础的弹性能力,真正的能力取决于上层的流量分配能力。纵观SpringCloud生态,能够深度集成SpringCloud提供场景化服务路由能力的组件套件并不多。这里对场景进行说明,服务调用框架按照一定的规则实现服务路由的能力,我们称之为底层原子能力。原子能力是非常通用的能力,但很多时候并不能直接用于特定的业务场景。比如常见的测试环境分组、最近路由、蓝绿发布等,都称为场景。服务路由场景化后,才能真正为业务开箱即用。SpringCloudTencentPolarisRouter目前实现了两种基于场景的路由能力和一种非常灵活的规则路由能力。元数据Routing服务实例附有一组元数据,如环境信息、机房信息等。简单的说,元数据路由就是以元数据信息作为路由的依据。这个还是有点抽象,我们举个测试环境的例子来说明一下。(图:开发环境示意图)上图是一个非常经典的解决测试环境冲突的方案。在一次迭代中,SvcA需要与SvcD联合调试。当团队人数较少时,可以直接部署稳定环境作为开发分支代码,然后联合调试。但是,当多个开发任务并行时,就会出现环境争用。一种解决方案是为每个开发任务独立部署一个全链路环境。这种方法费时费力,效果也不是很好。业界最主流的做法如上图所示。每个开发任务子环境只需要部署联调应用,链路上不在子环境中的服务路由回stable稳定环境。使用SpringCloudTencent实现上述目标,只需要在每个服务部署时添加如下两个环境变量即可。SCT_METADATA_CONTENT_ENV=dev1SCT_METADATA_CONTENT_TRANSITIVE=ENVSpringCloudTencentPolarisRouter组件会自动读取上述环境变量,每次调用服务时优先调用与当前实例ENV值相同的目标实例。元数据路由的使用场景非常广泛,详情请参考GithubWiki。规则路由元数据路由本质上是基于服务实例的元数据进行过滤,是一种内置的服务路由能力,支持特定场景。无需发送任何路由规则,非常好用。但是实际的业务场景非常复杂,比如下面典型的业务场景:内部员工路由到生产灰度环境,外部普通用户路由到生产正式环境,VIP客户路由到高安全环境,而普通客户被路由到一个正常的Environment以上两种业务场景是无法通过元数据路由来实现的。因为涉及到业务请求参数,而不是系统维度的环境变量。规则路由是为满足复杂的业务场景而实现的一套基于规则的服务路由实现。一个典型的规则如下图所示:(图:路由规则配置页面)上图表达的意思是:当HTTPQueryParam的uid参数值为100时,调用ENV=gray的实例组。路由规则可以描述最复杂的业务场景。为了方便使用,SpringCloudTencent内置了一套表达式标签规则,可以自动解析来自HTTP请求的标签值。目前支持的表达式规则有:${http.query.xxx}${http.header.xxx}${http.cookie.xxx}${http.method}${http.uri}规则路由比较复杂,看GithubWiki了解更多详情。就近路由生产环境业务往往需要多机柜、多机房、多地域部署,以实现高可用和容灾能力。(图:部署模型图)如上图所示,范围从小到大为:Campus
