从软件架构说起
软件架构是指软件系统的整体结构设计。它定义了软件的主要组成模块、这些模块之间的交互关系和依赖关系,以及软件系统与外部环境的交互方式。一个好的软件架构能够实现软件系统的业务目标和质量属性要求。
软件架构通常包含以下几个方面:
1. 组件划分 - 将系统划分为不同的组件模块,每个组件通过接口与其他组件交互。常见的组件包括数据层、业务逻辑层、表示层等。
2. 组件间交互 - 定义组件之间的接口和交互协议,比如使用 RPC、RESTful API 等方式进行交互。
3. 数据流设计 - 设计系统中的数据流向,数据在组件之间的流动路径。
4. 描述非功能需求 - 如性能、安全性、可用性等非功能需求在架构中的实现方式。
5. 部署模型 - 设计系统的物理部署拓扑结构和部署方式。
6. 技术选择 - 为系统做出平台、框架、中间件等基础技术的选择。
一个好的软件架构需要根据要解决的问题,对目标系统的边界进行界定。考虑业务需求、系统性能、可维护性、可扩展性等多方面因素。设计软件架构是一个综合性的系统工程,需要架构师具备技术广度与深度,以及对业务的理解。根据沟通机制,使得软件各部分之间能够进行有机的联系,合并组装成为一个整体,完成目标系统的所有工作。
架构模式定义:“由许多结构性组织模式形成成的系统家族:其中许多组件以及链接方式的字汇,也有一些彼此组合上的限制。[Shaw, Mary; Garlan, David. Software architecture: perspectives on an emerging discipline. Prentice Hall. 1996. ISBN 978-0-13-182957-2.]
有许多知名的架构我相信你一定见过:
l 分层模式 (Layered pattern)
l 客户端/服务器模式 (Client-server pattern)
l 主/从模式 (Master-slave pattern)
l 管道/过滤器模式 (Pipe-filter pattern)
l 代理模式 (Broker pattern)
l 对等模式 (Peer-to-peer pattern)
l 事件总线模式 (Event-bus pattern)
l 模型/视图/控制器 (MVC) 模式 (Model-view-controller pattern)
l 黑板模式 (Blackboard pattern)
l 解析器模式 (Interpreter pattern)
再谈谈SpringCloud
图:单体架构
我想要重点介绍的是SpringCloud,它与今天的主角密切相关。随着互联网的快速发展,单体架构的软件系统已经不能够满足购物节和活动高峰产生的高并发,大流量的性能要求;系统架构逐步走上了分布式,但是分布式系统天生就复杂,不像单体应用那样把几个框架整合起来就可以了。因此各大互联网公司都投入技术力量研发自己的基础设施,比如比较有名的:阿里的开源项目dubbo和Netflix开发的一系列服务框架;在这种“百花齐放”、重复造轮子的市场状况下,共同维护一个统一的标准来简化分布式系统的开发逐渐成为了开发者们的共识,使用微服务架构的Spring Cloud就应运而生。
图:微服务架构
单体架构有复杂性高、技术债务重、部署频率低、扩展能力受限等缺点已经难以适应快速迭代的需求,而微服务有很多优点:
l 易于开发和维护: 一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量较少。 开发和维护单个微服务相对简单。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。
l 单个微服务启动较快: 单个微服务代码量较少, 所以启动会比较快。
l 局部修改容易部署: 单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。 一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
l 技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。
虽然微服务如此吸引人,但是它还是有一些缺点:
l 运维要求较高:更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务服务的正常运行与协作,这给运维带来了很大的挑战。
l 分布式固有的复杂性:使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。
l 接口调整成本高:微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
l 重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下就不一定行得通了。
快速上手Nacos
从上面的讲解我相信你已经知道架构和微服务了,那么简单的说Spring Cloud是一系列框架的有序集合如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等。SpringCloud是一套微服务开发的全家桶,它没有重复造轮子,只是基于Springboot将其他公司(Netflix)的服务框架组合起来。
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:注册中心和配置中心。Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。MSE-Nacos 作为注册中心,实现应用的服务注册与发现,以及消费者对提供者的调用,配合服务治理实现全链路灰度。
开源版的使用是很容易的,如下所示:Java引入仅需配置依赖和连接信息
<dependencies> <!--Spring Boot--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Netflix--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR9</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!—Nacos注册中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.1.RELEASE</version> </dependency> </dependencies> |
bootstrap.yml:
spring: cloud: nacos: config: server-addr: 127.0.0.1:8880 username: nacos password: nacos |
使用时直接在controller中使用springboot提供的@Value注解即可:
@Value("${env.name:default}") private String envName; |
Nacos作为注册中心先在启动类中添加注解@EnableDiscoveryClient,开启服务的注册发现然后在bootstrap.yml文件中配置如下内容即可:
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8880 username: nacos password: nacos |
MSE-Nacos 作为配置中心,实现将应用中的变量、参数等从代码中提取出来,并存入一个配置文件,在需要更改配置时,只需更改此配置文件即可。
注意事项:bootstrap.yml比 applicaton.yml 优先加载,应用于系统级别参数配置,一般不会变动;application.yml应用于SpringBoot项目的自动化配置。
每个工程需要提供配置集,参数如下,nacos服务地址,必须指定;namespace,如不指定默认public ;group如不指定默认 DEFAULT_GROUP;dataId,必须指定。
开源版横评总结:
1. Nacos:
性能: 中等性能,适用于中小规模的分布式系统。
功能: 提供服务注册、发现、配置管理等功能,支持多数据中心和多租户。
控制台体验: 提供直观易用的Web控制台,方便配置和监控。
上下游生态: 国内使用的公司很多,提供丰富的API,支持Spring Cloud Alibaba、Dubbo等主流框架。
社区体验: 有最活跃的中文社区,有详细的文档和社区支持,这一点无可替代。
2. Zookeeper:
性能: 高性能、低延迟,适用于大规模分布式系统。
功能: 提供分布式协调服务,适用于各种场景,但在配置管理方面较为简单。
控制台体验: 没有官方控制台,通常需要基于命令行或第三方工具。
上下游生态: 生态较为丰富,被广泛应用于Hadoop、Kafka等大数据生态系统。
社区体验: 社区庞大,有大量文档和案例可参考。
3. Consul:
性能: 中等性能,适用于中小规模的分布式系统。
功能: 提供服务发现、健康检查、KV存储等功能,支持多数据中心。
控制台体验: 提供直观易用的Web UI,方便配置和监控。
上下游生态: 提供丰富的HTTP API,易于与其他系统集成。
社区体验: 活跃的社区,有文档和社区支持。
4. Etcd:
性能: 高性能,适用于大规模的分布式系统,基于Raft算法。
功能: 提供分布式一致性KV存储,用于服务发现、配置共享等。
控制台体验: 提供基本的Web UI,但通常使用API进行配置。
上下游生态: 与Kubernetes深度集成,是Kubernetes的默认存储后端。
社区体验: 有一定规模的社区,有文档和社区支持。
在使用过程中仅在开始的时候遇到过nacos导入配置或者新建配置异常,后来发现是SQL初始化有问题,在Github上提了个Issues很快就有社区成员回复解决了具体的问题,重新初始化了一下SQL就解决好了。
阿里云注册配置中心 MSE-Nacos,是Nacos 的企业版,是开箱即用的 Nacos 云服务,实现了对 Nacos 内核进行企业级稳定性加固,故障自动检测及恢复、多可用区容灾、推空保护等特性。具有风险管理能力,全局持续分析并管理集群风险;企业级安全基于 RAM 鉴权体系,可构建细粒度的安全控制能力,集成阿里云 KMS 提供配置加密能力,帮企业更安全地使用 Nacos 服务;基于 Alibaba Dragonwell 进行深度调优,比 Nacos 开源版性能提升 50% 以上;企业级易用性,提供推送轨迹、丰富完善的监控报警能力和便利的控制台操作,总的来看,企业版相比开源在稳定、安全、性能和效率方面更具备优势。
除了最重要的性能提升之外,如果使用阿里云注册配置中心 MSE-Nacos出现了问题可以提工单向阿里云的专家们寻求快速的解决方案,很大程度上降低了业务可用性风险并提升了时效性。而且阿里云注册配置中心 MSE-Nacos一个人就能完成部署,极大节省人员运维成本。最喜欢的是监控告警功能,以往我们需要再搭建一个告警监测平台,现在在云服务控制台就可对集群状态、服务数、配置数、TPS、请求耗时等指标进行监控,提供自定义告警规则及钉钉、电话、短信等告警渠道,便于排查异常集群。在信息安全保护的框架下可以完成RAM权限管理、KMS配置加密等安全措施,快速满足合规要求。
阿里云注册配置中心MSE-Nacos的产品文档能够完整、准确地描述产品的所有功能和操作步骤。确保文档对于初学者和高级用户都易于理解,现在已经尝到了云化服务的甜头。产品文档中包含详细的示例和使用场景,帮助用户更好地了解产品的实际应用,示例对于任何人都是很重要的参考。
安全和可用性不再是运维部门天天提心吊胆的事情,在节假日高峰期以往是有运维组烧香拜佛报平安的,现在连香火钱都省了,用户访问量剧增时。MSE-Nacos多AZ部署有足够的性能、资源和算法来有效地处理这些请求。整个链路的效率也得到了显著的提升。
对我们这样的中小企业来说,性能和稳定性需求需要平衡成本。以往我们对新技术胆战心惊是因为通常不具备大规模IT基础设施和人力资源来处理故障危机,因此阿里云注册配置中心 MSE-Nacos就是一个既能够满足需求又不会造成巨大负担的解决方案,我们将阿里云注册配置中心 MSE-Nacos与ACK、SAE等产品集成,使产品的部署、配置和维护尽可能简单以最大化平衡效益。后期我们会考虑跟进可观测技术,打造更省心易用的产品架构。