## **逃离单体地狱**
## 泥球模式
* 把这种软件比喻成“随意架构的,庞大的,草率的”布满了胶带和线路,如同意大利面条一般的代码丛林。软件交付的步伐已经放缓,更糟糕的是,应用程序是使用一些已经过时的框架编写的。
## 典型的分层模块化企业级java应用
* 他由业务逻辑组成,业务逻辑外面是实现用户界面的适配器和与外部系统的接口。
* 业务逻辑有包含了服务和领域对象的模块组成,一些典型的模块若干适配器来完成与外部系统的对接工作,包括RESTAPI和web页面适配器。
*单体软件架构风格: 一个系统应用被作为单一的单元打包和部署->部署运行在Tomcat上
## 单体架构的好处
* 应用的开发很简单,IDE和其他开发工具只需构建这一个单独的应用程序。
* 易于对应用程序进行大规模的更改(比如更改数据库模式)
* 测试相对简单直观,(只需要对RESTAPI进行单元测试)
* 部署简单明了,(以war的形式部署在Tomcat上)
* 横向扩展不费吹灰之力,(一般使用ngixn进行横向水平扩展)
## 为什么逃离单体炼狱
* 显示更多功能是时,会导致代码库膨胀
* 敏捷开发和部署已经不可能
* 更改的代码提交到单个源代码库,从代码提交到生产环境,漫长而艰巨,并且涉及到手工测试,应用程序庞大,复杂,不可靠,难以维护
* 过渡的复杂度会吓退开发者(难以理解它的全部,修复比实现新功能更困难且耗时,而且会形成恶性循环)
* 开发速度缓慢,(构建应用程序需要很长时间,从编辑到构建运行再到测试周期时间长)
* 从代码提交到实际部署的周期很长,而且容易出错。
* 难以扩展(横向扩展)服务器需要较大的内存
* 交付可靠的单体应用是一项挑战(错误的代码进入生产环境程序缺少故障隔离,所有的代码都在一个行程运行)
* 需要长期依赖某一个可能已经过时的技术栈
## **拯救之道 微服务架构**
* 软件架构对功能行需求影响不大,架构的重要行在于它影响了应用的非功能性需求,也称为质量属性或者其他的能力。
* 扩展了立方体和服务
* Y轴扩展又称为功能行分解,用过分解不同功能的方式来实现扩展
* X扩展 又称为水平复制通过克隆实例的方式扩展(负债均衡)
* Z扩展,又称为数据分区,通过类似客户ID的方式吧相似的数据分区进行扩展
## 微服务的定义
* 把应用程序功能性分解为一组服务的架构风格(模块化)
* 微服务架构作为模块化的一种形式
* 模块化是开发大型复杂的应用程序的基础,大型应用需要拆分为模块
* 微服务架构使用服务作为模块化的单元,服务的API为自身构筑了一个可逾越的边界
* 服务可以独立部署和扩展
* 每个服务都拥有自己的数据库
* 微服务架构特性是每一个服务之间都是松耦合的,仅通过调用API的方式进行通信,在运行时服务实现类相互之间的独立,服务不会因为其他服务锁了数据库而进入堵塞的状态
## 微服务架构的好处
* 使大型的复杂应用程序可以持续交付和持续部署
* 每个服务器都相对较小并容易维护
* 服务可以独立部署
* 微服务架构可以实现团队的自活
* 服务可以独立扩展
* 更容易试验和采纳新的技术
* 更好的容错性
## 微服务的弊端
* 服务的拆分和定义是一个有难度的事情(重点)
1. * 服务的拆分没有一个衡量标准,没有算法可以完成服务拆分工作,一个不小心就构建出一个分布式的单体应用,一个包含了一大堆互相紧耦合的服务,这样会把单体架构的和微服务架构两者合一,弊端基于一身。
2. * 分布式系统带来的各种复杂性,使开发,测试和部署变得困难
* 多个服务的功能需要协调更多开发人员
* 开发者需要思考应该在应用的什么阶段使用微服务架构
- JDK常用知识库
- JDK各个版本安装
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 归并排序
- 快速排序
- 堆排序
- 希尔排序
- 计数排序
- 桶排序
- 基数排序
- 总结
- 常用工具类
- 浮点型计算
- 时间格式处理
- 常用功能点思路整理
- 登录
- 高并发
- 线程安全的单例模式
- Tomcat优化
- Tomcat之APR模式
- Tomcat启动过慢问题
- 常用的数据库连接池
- Druid连接池
- 缓存
- Redis
- SpringBoot整合Redis
- 依赖和配置
- RedisTemplate工具类
- 工具类使用方法
- Redis知识库
- Redis安装
- Redis配置参数
- Redis常用Lua脚本
- MongoDB
- SpringBoot操作MongoDB
- 依赖和配置
- MongoDB工具类
- 工具类使用方法
- 消息中间件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定时任务
- 启动加载
- 事务
- JSP
- 静态类注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陆验证
- 权限验证
- 分布式应用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 删
- 改
- 查
- 程序员小笑话
- 我给你讲一个TCP的笑话吧
- 二进制笑话
- JavaScript的那点东西
- JavaScript内置对象及常见API详细介绍
- JavaScript实现Ajax 资源请求
- JavaScript干货
- 架构师成长之路
- JDK源码解析
- ArrayList源码解读
- 设计模式
- 微服务架构设计模式
- 逃离单体炼狱
- 服务的拆分策略
- 全面解析SpringMvc框架
- 架构设计的六大原则
- 并发集合
- JUC并发编程
- 搜索引擎
- Solr
- Solr的安装
- 分布式服务框架
- Dubbo
- 从零开始学HTMl
- 第一章-初识HTML
- 第二章-认识HTML标签