SpringCloud系列之一

SpringCloud整体认知与系统微服务化架构思考

1. SpringCloud和微服务架构的关系

SpringCloud是由Spring Framework直接挂牌的顶级项目,不是由开源社区生态打造,他是吸纳了很多优秀的框架整合出来,比如Netflix和Alibaba

可以说SpringCloud是一系列开源技术(组件)的集合,它是基于SpringBoot之上,将微服务领域的基础设施简化为一个个易于部署且配置简单的组件。

SpringCloud将各个组件通过抽象和改造,共同构建了一套生态体系

  • 服务治理:Eureka、Nacos、Consul
  • 负载均衡:Ribbon
  • 服务调用:Feign
  • 服务容错:Hystrix、Sentinel
  • 配置中心:Config+Bus、Nacos
  • 服务网关:Gateway、Zuul
  • 调用链追踪:Sleuth(Sleuth+Zipkin+ELK)
  • 消息驱动:Stream

2. SpringCloud组件来源介绍

  • Netflix

    SpringCloud Netflix组件库依旧是SpringCloud中最受欢迎的项目

  • Alibaba

    Nacos、Sentinel

  • Spring Open Source

    这个应该是算是Spring自己的组织了

应用领域名称Netflix组件Alibaba组件Spring或其他开源厂商
服务治理EurekaNacos、Dubbo(RPC)Consul
负载均衡RibbonSpring-Cloud-Loadbalancer
服务调用Feign(后划归openfeign)
服务容错Hystrix+Turbine+DashboardSentinel
限流SentinelGateway支持网关限流
服务网关ZuulGateway
配置管理ArchaiusNacosConfig
消息总线Bus
调用链追踪Sleuth
消息驱动RocketMQStream(对接RabbitMQ和Kafka)
任务调度Alibaba Cloud ScheduleXspring-cloud-task
其他Slidecar(跨语言)Seata(分布式事务)
SMS(短信服务)

3. SpringCloud的版本演进

  • Angel 2015.3
  • Brixton 2016.5
  • Camden 2016.9
  • Dalston 2017.4
  • Edgware 2017.11
  • Finchley 2018.6
  • Greenwich 2019.1
  • Hoxton 2019.11

SpringCloud版本升级的需要

  • 业务需要
    • 对当前业务是否有影响
    • 上下游的兼容性
    • 替换成本:开发资源,运维资源
  • 技术需要
    • 技术栈可扩展性
    • Bug Fix及时性
    • 新组件新功能能够支持新的业务场景有哪些要进行调研

Springcloud在项目技术栈的设计方式建议

  • 半年/年度升级一次
  • 只采用SR发布版,绝不冒进
  • 对于新版本的新功能要持续关注,一旦有一些新功能对于你的系统有较大提升空间就可以尝试更新
  • 更新后要进行全链路回归测试

4. 系统微服务的改造分析

拆?

  • 拆分POM依赖项:每个POM只引入自己用到的依赖
  • 公共组件的剥离:公共Utils类
  • 平台中间件剥离:注册中心,配置中心
  • 微服务模块拆分:根据业务粒度进行处理

核心的拆分工作就集中在微服务模块,通过领域模型来进行划分

进行领域模型划分前先弄明白两个概念:贫血模型、领域模型

  • 贫血模型

    实际开发工作中,80%都是贫血模型

    所谓的贫血模型,是指Model中,仅包含属性,不包好行为(方法),采用这种设计是,需要分离出DB层(dao),专门用于数据库操作(数据库作为状态对象保存)

    典型的结构:

    po/bo/pojo:存放实体对象或持久化对象,仅包含属性和对应的Get/Set方法,没有行为方法

    dao/mapper:存放数据库访问的方法

    service:存放业务行为实现

    controller:提供对UI层访问的入口或后端API入口

    优点:

    • 被许多程序员掌握,许多教材也是采用这种模型,适合入门
    • 非常简单,易于理解,不需要对业务领域充分了解就可以开始开发
    • 事务的边界相当清楚,一般来说可以将一个service看作是一个事务

    缺点:

    • 所有的业务都在service中处理,当业务越来越复杂时,service会变得越来越庞大,最终难以理解和维护
    • 将所有业务放在无状态的service中实际是一个过程化的设计,他在组织复杂的业务时存在天然的劣势,随着业务的复杂度提升,业务会在service中多个方法间重复
    • 当添加一个新的UI时,所有业务逻辑都得重写,导致重复的业务逻辑比较多,如何保持业务逻辑的一致是很大的挑战
  • 领域模型

在这里插入图片描述

一般包括如下包结构

infrastructure:代表基础设施层,一般负责对象的持久化,基础服务,第三方工具,缓存,API网关服务,事件总线等

application:代表应用层,主要提供对UI层的统一访问接口,并作为事务界限。

domain:代表领域层,domain包含两个子包,分别是model和service,model中包含模型对象,Repository(DAO)接口,负责关键业务的逻辑。service包为一系列的领域服务,之所以需要servcie,按照DDD的观点,是因为领域中的某些概念本质是一些行为,并且不便于放入某个模型对象中的。

领域模型各层的逻辑如下:

在这里插入图片描述

领域模型的优点:

  • 领域模型采用OO设计,通过职责分配到相依的模型对象或service,可以很好的组织业务逻辑,当业务变得复杂时,领域模型显出巨大的优势
  • 当需要多个UI接口时,领域模型可以重用,并且各个业务逻辑只在领域中出现,这使得很容易对多个UI接口保持业务逻辑的一致

领域模型的缺点:

  • 对程序员要求比较高,初学者对这种将职责分配到多个协作对象中的方式感到极不适应
  • 领域驱动建模要求对领域模型完全而透彻的了解,只给出一个用例实现步骤是无法得到领域模型的,这需要和领域专家充分讨论,错误的领域模型对项目的危害非常大,所以实现一个好的领域模型非常困难
  • 对于简单的软件,使用领域模型,优点大才小用了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值