热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloud与Docker微服务架构实战读书笔记(一)

微服务架构概述单体应用架构存在的问题单体应用:一个归档包(例如war格式)包含所有功能的应用程序优点:比较容易部署、测试缺点:复杂性高:一个应用百万行级别,修改代码容易牵一发而动全

微服务架构概述

单体应用架构存在的问题

单体应用:一个归档包(例如war格式)包含所有功能的应用程序

优点:比较容易部署、测试

缺点:

  • 复杂性高:一个应用百万行级别,修改代码容易牵一发而动全身
  • 技术债务:已使用的系统设计或代码难以被修改
  • 部署频率低:构建和部署的时间长→部署频率低→两次发布之间有大量功能变更与缺陷修复,出错概率比较高
  • 可靠性差:某个应用bug,可能会导致整个应用的崩溃
  • 扩展能力受限:单体应用智能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩
  • 阻碍技术创新:引入新框架或新技术平台的成本非常高

如何解决单体应用架构存在的问题

微服务就是这样的一种架构模式。

什么是微服务

微服务架构应具备以下特性:

  • 每个微服务可独立运行在自己的进程里
  • 一系列独立运行的微服务共同构建起整个系统
  • 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等
  • 微服务之间通过一些轻量的通信机制进行通信,例如通过RESTful API进行调用
  • 可以使用不同的语言与数据存储技术
  • 全自动的部署机制

微服务架构的优点与挑战

微服务架构的优点

  • 易于开发和维护:一个微服务只会关注一个特定的业务功能,所以它业务清晰、代码量比较少。开发和维护单个微服务相对简单。而整个应用是由若干个微服务构建而成的,所以整个应用也会被维持在一个可控状态。
  • 单个微服务启动较快:单个微服务代码量较少,所以启动会比较快。
  • 局部修改容易部署:单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。
  • 技术栈不受限:在微服务架构中,可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,可以使用Neo4j;甚至可根据需要,部分微服务使用Java开发,部分微服务使用Node.js开发。
  • 按需伸缩:可根据需求,实现细粒度的扩展。例如,系统中的某个微服务遇到了瓶颈,可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点。

微服务架构面临的挑战

  • 运维要求较高:更多的服务意味着更多的运维投入。
  • 分布式固有的复杂性:使用微服务构建的是分布式系统。对于系统分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战
  • 接口调整成本高:微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
  • 重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这个功能,从而导致代码重复。尽管可以使用共享库来解决这个问题(例如可以将这个功能封装成公共组件,需要该功能的微服务引用该组件),但共享库在多语言环境下不一定行得通了。

微服务设计原则

  • 单一职责原则:一个单元(类、方法或者服务等)只应关注整个系统功能中单独、有界限的一部分。单一职责原则可以帮助我萌更优雅地开发、更敏捷地交付。单一职责原则是SOLID原则之一。

  • 服务自治原则:每个微服务应具备独立的业务能力、依赖于运行环境。在微服务架构中,服务是独立的业务单元,应该与其他服务高度解耦。每个微服务从开发、测试、构建、部署,都应当可以独立运行,而不应该依赖其他的服务。

  • 轻量级通信机制:微服务之间应该通过轻量级的通信机制进行交互。轻量级的通信机制应具备两点:首先是它的体量较轻;其次是它应该是跨语言、跨平台的。例如我们所熟悉的REST协议,就是一个典型的“轻量级通信机制”。

    微服务架构中,常用的协议有REST、AMQP、STOMP、MQTT等。

  • 微服务粒度:微服务的粒度是难点,也常常是争论的焦点。应当使用合理的粒度划分微服务,而不是一味地把服务做小。代码量的多少不能作为微服务划分的依据,因为不同的微服务本身的业务复杂性不同,代码量也不同。

    在微服务的设计阶段,就应该确定其边界。微服务之间应该相对独立并保持松耦合。

    领域驱动设计(Domain Driven Design,简称DDD)中的“界限上下文”可作为划分微服务边界、确定微服务粒度的重要依据。同时,在划分微服务的过程中,还应综合考虑团队的现状。

    每个架构师都应该研究下康威定律

    《领域驱动设计》

如何实现微服务架构

技术选型

相对单体应用的交付,微服务应用的交付要复杂很多,不仅需要开发框架的支持,还需要一些自动化的部署工具,以及IaaS、PaaS或CaaS的支持。

下面从开发和运行平台两个维度考虑挑选技术选型。

  • 开发框架的选择

    可使用Spring Cloud作为微服务开发框架。

    首先,Spring Cloud具备开箱即用的生产特性,可大大提升开发效率;再者,SpringCloud的文档丰富、社区活跃,遇到问题比较容易获得支持;更为可贵的是,SpringCloud为微服务架构提供了完整的解决方案。

    当然,也可使用其他的开发框架或者解决方案来实现微服务,例如Dubbo、Dropwizard、Armada等。

  • 运行平台

    微服务并不绑定运行平台,将微服务部署在PC Server,或者阿里云、AWS等云计算平台都是可以的。

架构图及常用组件

SpringCloud与Docker微服务架构实战读书笔记(一)

微服务开发框架-Spring Cloud

SpringCloud简介

尽管SpringCloud带有Cloud字样,但它并不是云计算解决方案,而是在SpringBoot基础上构建的,用于快速构建分布式系统的通用模式的工具集。

《十二要素应用宣言》、云原生应用

SpringCloud特点

  • 约定优于配置
  • 适用于各种环境。开发、部署在PC Server或各种云环境(例如阿里云、AWS等)均可。
  • 隐藏了组件的复杂性,并提供声明式、无xml的配置方式。
  • 开箱即用,快速启动。
  • 轻量级的组件。SpringCloud整合的组件大多比较轻量。例如Eureka,Zuul,等等,都是各自领域轻量级的实现。
  • 组件丰富,功能齐全。SpringCloud为微服务架构提供了非常完整的支持。例如,配置管理、服务发现、断路器、微服务网关等。
  • 选型中立、丰富。例如,SpringCloud支持使用Eureka、ZooKeeper或Consul实现服务发现。
  • 灵活。SpringCloud的组成部分是解耦的,开发人员可按需灵活挑选技术选型。

推荐阅读
  • 我的读书清单(持续更新)201705311.《一千零一夜》2006(四五年级)2.《中华上下五千年》2008(初一)3.《鲁滨孙漂流记》2008(初二)4.《钢铁是怎样炼成的》20 ... [详细]
  • 本项目使用Java语言开发了一个基于B/S架构的指纹识别系统,该系统能够实现指纹的高效采集与精准识别,适用于多种安全认证场景。 ... [详细]
  • 酷家乐 Serverless FaaS 产品实践探索
    本文探讨了酷家乐在 Serverless FaaS 领域的实践与经验,重点介绍了 FaaS 平台的构建、业务收益及未来发展方向。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
  • 本文探讨了在使用Apache Flink向Kafka发送数据过程中遇到的事务频繁失败问题,并提供了详细的解决方案,包括必要的配置调整和最佳实践。 ... [详细]
  • 深入探讨Web服务器与动态语言的交互机制:CGI、FastCGI与PHP-FPM
    本文详细解析了Web服务器(如Apache、Nginx等)与动态语言(如PHP)之间通过CGI、FastCGI及PHP-FPM进行交互的具体过程,旨在帮助开发者更好地理解这些技术背后的原理。 ... [详细]
  • Golang与微服务架构:构建高效微服务
    本文探讨了Golang在微服务架构中的应用,包括Golang的基本概念、微服务开发的优势、常用开发工具以及具体实践案例。 ... [详细]
  • 本文探讨了六项Java特性,它们虽然强大,但在不当使用时可能会给应用程序带来严重问题。文章基于作者Nikita Salnikov Tarnovski多年的应用性能调优经验,提供了对这些特性的深入分析。 ... [详细]
  • 帝国cms各数据表有什么用
    CMS教程|帝国CMS帝国cmsCMS教程-帝国CMS精易编程助手源码,ubuntu桥接设置,500错误是tomcat吗,爬虫c原理,php会话包括什么,营销seo关键词优化一般多 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 择要:Fundebug的JavaScript毛病监控插件同步支撑Vue.js异步毛病监控。Vue.js从降生至今已5年,尤大在本年2月份宣布了严重更新,即Vue2.6。更新包含新增 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 本文详细介绍了Spring AOP注解的基本概念及其实现方式,并通过实例演示了如何在项目中使用这些注解进行面向切面的编程。旨在帮助开发者更好地理解和运用Spring AOP功能。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
author-avatar
手机用户2502894247
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有