微服务架构之Java技术栈
Java技术栈
综述
微服务架构是当前主流的分布式应用系统架构体系,而 Spring Cloud 当属其中翘楚。
SpringCloud 是一套微服务架构的规范,抽象了一套通用的开发模式,它的目的是通过抽象出这套通用的模式,让开发者更快更好地开发业务。
Spring Cloud Netflix 是由 Netflix 公司提供的一套相对完整成熟的 Spring Cloud 微服务实现方案,包括 Ribbon、Feign、Eureka、Hystrix 等一整套组件。
Spring Cloud Alibaba 是由 Alibaba 公司 提供的新晋的 Spring Cloud 微服务实现方案,包括 Nacos、Sentinel、Dubbo、Seata 等开源套件。
微服务核心:服务注册与发现、配置中心、客户端代理、负载均衡、熔断降级限流、网关、链路追踪。
一、Spring Cloud
1、简介
Spring Cloud 是一个基于 SpringBoot 实现的微服务架构开发工具。
它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作
提供了一种简单的开发方式。
2、发展历程
2014年10月7日 privotal 发布了第一个Spring Cloud的版本:1.0.0.M1。
2016 年 1 月发布第一个 Angel.SR5 版本,
2017 年初,Spring Cloud迭代到E版本,对应SpringBoot 4.x,达到最稳定的状态,各个环节的变化变慢,趋于稳定。
到 2020 年 3 月发布 Hoxton.SR3 版本。
Spring Cloud 在 2019 年 12 月对外宣布后续 RoadMap:
下一个版本 Ilford 版本是一个大版本。这个版本基于 Spring Framework 5.3 & Spring Boot 2.4,会在 2020 Q4 左右发布;
3、组件
- Spring Cloud Netflix:核心组件,对多个Netflix OSS 开源套件进行整合。
- Spring Cloud Alibaba:Alibaba提供的微服务开发的一站式解决方案。
- Spring Cloud Config:配置管理工具。支持使用GIT、SVN、文件存储配置内容,可以使用它实现应用配置的外部化存储,并支持客户端配置信息刷新、加密/解密配置内容等。
- Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以触发后续的处理,比如用来动态刷新配置。
- Spring Cloud Cluster:针对ZooKeeper、Redis、Hazelcast、Consul的选举算法和通用状态模式的实现。
- Spring Cloud Cloudfoundry:与PivotalCloudfoundry的整合支持。
- Spring Cloud Consul:服务发现与配置管理工具。
- Spring Cloud Stream:通过Redis、Rabbit、或者Kafka实现的消费微服务,可以通过简单的声明式模型来发送和接受消息。
- Spring Cloud AWS:用于简化整合AmazonWebService的组件。
- Spring Cloud Security:安全工具包,提供在Zuul代理中对OAuth2 客户端请求的中继器。
- Spring Cloud Sleuth:Spring Cloud应用的分布式跟踪实现,可以完美整合Zipkin。
- Spring Cloud ZooKeeper:基于Zookeeper的服务发现与配置管理组件。
- Spring Cloud Starters:Spring Cloud 的基础组件,它是基于SpringBoot风格项目的基础依赖模块。
- Spring Cloud CLI: 用于在Groovy中快速创建SpringCloud应用的SpringBoot CLI 插件。
二、Spring Cloud Netflix
1、简介
Spring Cloud Netflix 是 Netflix推出的一套基于 Spring Cloud 微服务规范的微服务架构套件的具体实现。是目前比较成熟的 Spring Cloud 微服务实现方案。主要提供的功能包括:服务发现、断路器和监控、智能路由、客户端负载均衡等。
2、主要组件
- Eureka:服务治理组件,包含服务注册中心,服务注册与发现机制的实现。
- Ribbon:客户端负载均衡的服务调用组件。
- Feign:基于Ribbon和Hystrix的声明式服务调用组件。停止维护,代替方案:OpenFeign
- Zuul:网关组件,提供智能路由、访问过滤等功能。
- Hystrix:容错管理组件,实现断路器模式,帮助服务依赖中出现的延迟和为故障提供强大的容错能力。
- Hystrix Dashboard:监控面板,他提供了一个界面,可以监控各个服务上的服务调用所消耗的时间等。
- Turbine:监控聚合,使用Hystrix监控,我们需要打开每一个服务实例的监控信息来查看。而Turbine可以帮助我们把所有的服务实例的监控信息聚合到一个地方统一查看。这样就不需要挨个打开一个个的页面一个个查看。
- Archaius:外部化配置组件。
三、Spring Cloud Alibaba
1、简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。
此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,
通过阿里中间件来迅速搭建分布式应用系统。
2、发展历程
- 2018年7月27日 在 Spring Cloud 孵化器仓库提交第一次代码;
- 2018年10月31日,Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器并发布了第一个预览版本
- 2019年8月1日 在 Alibaba 仓库发布第一个毕业版本。
3、主要功能
- 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
- 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
- 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
- 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
- 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
4、主要组件
- [开源]Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
- [开源]Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- [开源]RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
- [开源]Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
- [开源]Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
- [商用]Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
- [商用]Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- [商用]Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
- [商用]Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
四、微服务每个组成部分的多种实现方式对比
服务注册与发现:Eureka、Nacos、Consul、Zookeeper、Etcd 等等
配置中心:Spring Cloud Config、Nacos 对比
spring cloud config:
性能够用
config: 单独服务,是从git仓库拉取配置信息,然后服务端从config服务里面拉取配置信息缓存到本地仓库,
这里配置的变更比较麻烦,他需要结合bus组件,同时约束了只能用rabbitmq和kafka来进行通知服务端进行配置变更。
但是保证了数据的一致性,因为他的配置信息在git仓库上,git仓库只有一个,就会数据一致
nacos :
性能最好
他同时支持AP和CP模式,他根据服务注册选择临时和永久来决定走AP模式还是CP模式,
他这里支持CP模式对于我的理解来说,应该是为了配置中心集群,因为nacos可以同时作为注册中心和配置中心,
因为他的配置中心信息是保存在nacos里面的,假如因为nacos其中一台挂掉后,还没有同步配置信息,就可能发生配置不一致的情况.,
配置中心的配置变更是服务端有监听器,配置中心发生配置变化,然后服务端会监听到配置发生变化,从而做出改变
熔断、降级:Hystrix、Sentinel 对比
比较项 | Sentinel | Hystrix | 说明 |
---|---|---|---|
隔离策略 | 信号量隔离(并发线程数限流)(模拟信号量) | 线程池隔离/信号量隔离 |
Sentinel不创建线程依赖tomcat或jetty容器的线程池, 存在的问题就是运行容器的线程数量限制了sentinel设置值的上限可能设置不准。 比如tomcat线程池为10,sentinel设置100是没有意义的,同时隔离性不好 hystrix使用自己创建的线程池,隔离性会更好 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 | 快速失败的本质功能 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) | |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | |
扩展性 | 多个扩展点 | 插件的形式 | |
注解 | 支持 | 支持 | |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持(并发线程数或信号量大小) | 快速失败的本质功能 |
流量整形 | 支持预热模式、匀速器模式、预热排队模式 | 不支持(排队) | |
系统自适应保护 | 支持(仅对linux/unix生效) | 不支持 | 设置一个服务器最大允许处理量的阈值 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看接近实时数据 | 控制台是非常有竞争力的功能,因为能集中配置限制数据更方便,但是展示数据和实时性没有hystrix直观。 |
配置持久化 | ZooKeeper, Apollo, Nacos、本地文件 | Git/svn/本地文件 | Sentinel客户端采用直接链接持久化存储,应用客户端引用了更多的依赖,同样的存储链接可能有多个配置 |
动态配置 | 支持 | 支持 | |
黑白名单 | 支持 | 不支持 | |
springcloud集成 | 高 | 非常高 | Spring boot使用hystrix集成度更高 |
整体优势 | 集中配置设置及监控+更细的控制规则 | 漂亮的界面+接近实时的统计结果 | docker容器化部署之后sentinel可能更会发挥作用 |
网关:Zuul、Spring Cloud Gateway
Spring Cloud Gateway基于Spring 5、Project Reactor、Spring Boot 2,使用非阻塞式的API,内置限流过滤器,支持长连接(比如 websockets),
在高并发和后端服务响应慢的场景下比Zuul1的表现要好。
Zuul基于Servlet2.x构建,使用阻塞的API,没有内置限流过滤器,不支持长连接。
Spring Cloud Gateway,使用起来比 Zuul 更简单,配置更方便
两者都能与Sentinel(是阿里开源的一款高性能的限流框架)集成。
五、整体方案的优势对比
1、Spring Cloud Netflix
成熟度:推出较早,相对成熟
更新持续性:更新缓慢,部分停更
社区活跃度:社区活跃
发展趋势:趋缓
文档便捷性:英文为主
难易程度:一般
性能:基于http协议,性能一般
配套:无配置中心,使用 Spring Cloud Config;
商业优势:
2、Spring Cloud Alibaba
成熟度:2019年8月1日 在 Alibaba 仓库发布第一个毕业版本,相对较新。
更新持续性:持续更新中
社区活跃度:社区活跃
发展趋势:发展迅猛
文档便捷性:官方中文文档
难易程度:一般
性能:底层基于dubbo rpc 通信,性能较高
配套:无配套网关,使用 Spring Cloud Gateway;配套分布式服务框架setea;
商业优势:可更好的支持 阿里云 相关商业产品,容易继承。
六、其他基础设施
容器管理:k8s,swarm
对比项 | k8s | swarm |
出品公司 | docker官方 | |
生态 | 社区活跃,支持着众多、行业事实标准 | 逊色于k8s |
完善程度及功能 | 功能完善、复杂 | 功能略少、简单 |
学习成本 | 高 | 低 |
服务器成本 | 高 | 低 |
数据库:mysql
缓存:redis
消息队列:kafka、RocketMQ
个人建议:kafka
原因:
1、kafka几乎是消息队列的行业标准
2、集成日志体系elk,也需要用到kafka
日志:elk
反向代理:nignx
监控:Prometheus、Grafana
一个完整的商城开源例子
一个基于Spring Cloud、Nacos、Seata、Mysql、Redis、RocketMQ、canal、ElasticSearch、minio的微服务框架的B2B2C电商商城系统。
开源地址:https://gitee.com/gz-yami/mall4cloud
其技术栈如下: