目录
一、介绍
1.1 介绍
二、微服务基础介绍
2.1 微服务基础介绍
三、微服务的基本概念
3.1 什么是微服务
3.2 微服务的特点
3.3 微服务的优缺点
3.4 微服务的两大门派
通信协议对比
文档质量对比
如何选型比喻:
四、微服务的拆分、扩展和重要模块
4.1 微服务的拆分
4.2 服务扩展
自动按需扩展:
4.3 微服务重要模块
五、总结
微服务的基本概念、设计与拆分原则
微服务和Spring Cloud的关系
微服务常见的组件和功能
课程查询案例基本介绍、系统架构设计和接口设计
分模块构建Spring Cloud项目
完成课程列表、课程价格服务开发
课程服务整合,服务注册与发现
整合Feign实现服务间调用
网关的集成与开发,并接入服务
引入服务的熔断与降级,并进行实操演练
什么是微服务
微服务的特点
微服务优缺点
微服务的两大门派:springcloud、dubbo
微服务拆分
微服务扩展
微服务重要模块:服务注册与发现、微服务之间的通信、负载均衡、网关等等
微服务热度:
2016年以后微服务的百度搜索指数开始快速增加。
单体应用的痛点:
一大流派:LAMP Linux Apache Mysql PHP
另一流派:Spring Tomcat
部署效率低下:单体代码多、依赖越来越多、Pom有几十个依赖
团队协作开发成本高
系统可用性差:运行在一个进程中,部分代码出问题,会影响全部代码运行
什么是服务化:
把传统的单机应用中的本地方法调用,改造成通过RPC、HTTP产生的远程方法调用
把模块从单体应用中拆分出来,独立成一个服务部署
用户模块就可以独立开发、测试、上线和运维,可以交由专门的团队来做,与主模块不耦合
什么是微服务:
一种架构风格
开发单个应用作为一系列小型服务的套件,其中每个服务都运行在自己的进程中,并且通过轻量级的机制实现彼此间的通信,这通常是HTTP资源API
这些服务是围绕着业务功能构建的,并且可以通过完全自动化的部署机制进行独立部署
这些服务的集中式管理做到了最小化(例如docker相关技术),每一种服务都可以通过不同的编写语言进行编写,并且可以使用不同的数据存储技术
组件以服务形式来提供(需要明确组件之间的接口和通信协议)
产品不是项目
轻量级通信(RPC、HTTP、RabbitMQ)、独立进程
分散治理、去中心化治理(要有报警机制监控手段)
容错性设计
会带来团队组织架构的调整
服务简单、便于学习和上手,相对易于维护
独立部署、灵活扩展
技术栈丰富
运维成本过高
接口可能不匹配
代码可能重复
架构复杂度提高
Spring Cloud:
众多子项目,网关、配置中心、服务注册与发现、断路器、智能路由、全局锁等等。只要我们有需要,对Spring Cloud而言,都会有一个相对成熟的解决方案。Spring Cloud并没有重复的造轮子,它的这些组件都是选自各个公司开发成熟的,经过实际考验的服务框架。
Dubbo:
高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
dubbo提供的能力只是Spring Cloud的一部分子集。
Dubbo表格中的无,并不是无法实现。只是说Dubbo不提供,可以和其他框架和组件进行整合。分布式配置可以采用:百度的disconf、淘宝的diamond;服务跟踪可以采用:京东开源的Hydra;批量任务可以采用:当当开源的Elastic-Job;
RPC vs REST
服务提供方与调用方接口依赖方式太强
服务对平台(语言)敏感,难以简单复用
Dubbo的文档可以说在国内开源框架中算是一流的,提供了中文与英文两种版本
Spring Cloud文档体量大,更多的是偏向整合,更深入的使用方法还是需要查看其整合组件的详细文档
Dubbo:组装电脑,自由度高,但有兼容性风险和挑战。
Spring Cloud:品牌机,自由度低,但经过兼容性考验。
需要根据自身的研发水平和所处阶段选择
什么时候进行服务化拆分:
第一阶段的主要目标是快速开发和验证想法。并不是搭建庞大的高可用高并发的系统。我们需要证明这个产品的思路是否可行。第一阶段把所有功能都打包在一起,集中的进行开发 测试和运维,这是最高效,最节省成本的方式。
进一步增加更多的新特性来吸引更多的目标用户。
同时进行开发的人员超过10人,这个时候就该考虑进行服务化拆分了。
不适合拆分的情况:
小团队,技术基础较薄弱
流量不高,压力小,业务变化也不大
对延迟很敏感的低延迟高并发系统
服务化拆分的两种姿势:
纵向拆分:按业务维度拆分
横向拆分:公共模块
结合业务综合分析:
根据CPU负载程度、特定时间(比如周末)、消息中间件的队列长度、业务具体规则、预测等 来决定是否扩展
自动分配一个新的服务实例,提高可用性
提高了可伸缩性(双11之后,自动减少服务器)
具有最佳使用率,节约成本
建立在模块拆分、数据库分表基础之上做到的
以一次基本的正常服务调用为例,来看看有哪些模块是非常重要的:
服务描述(http服务还是其他服务?接口样子、返回内容)
注册中心
服务框架(采用什么协议,同异步传输,单链接多路复用,数据压缩格式,提高网络利用率,JSON序列化Java对象序列化)
负载均衡
熔断与降级
网关(进行 统一转换,权限校验,过滤器设置)