• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

Spring Cloud微服务改造实战-基于Springboot微信点餐项目

极客笔记 Geekerstar 3个月前 (01-31) 382次浏览 已收录 0个评论 扫描二维码
文章目录[隐藏]

完整带图笔记及代码请访问:https://github.com/geekerstar/dive-in-springcloud 欢迎Star!

微服务

微服务是一种架构风格

  • 一系列微小的服务共同组成
  • 跑在自己的进程里
  • 每个服务为独立的业务开发
  • 独立部署
  • 分布式的管理

点餐系统

设计的架构形态
– 单体架构
– 基于Ajax的前后端分离
– 分布式(水平扩展 & 服务拆分)

单体架构

单体架构优点

  • 容易测试
  • 容易部署

单体架构缺点

  • 开发效率低
  • 代码维护难
  • 部署不灵活
  • 稳定性不高
  • 扩展性不够

基于Ajax的前后端分离

点餐服务的前后端分离

分布式定义

旨在支持应用程序和服务的开发,可以利用物理架构由多个自治的处理元素,不共享主内存,但通过网络发送消息合作

简单的微服务架构

微服务架构的基础框架/组件

  • 服务注册发现
  • 服务网关(Service Gateway)
  • 后端通用服务(也称中间层服务Middle Tier Service)
  • 前端服务(也称边缘服务Edge Service)

SpringCloud Eureka

基于Netflix Eureka做了二次封装

两个组件

  • Eureka Server 注册中心
  • Eureka Client 服务注册

Eureka Server 高可用

Eureka总结

  • @EnableEurekaServer
  • @EnableEurekaClient
  • 心跳检测、健康检查、负载均衡等功能
  • Eureka高可用,生产上建议至少两台以上
  • 分布式系统中,服务注册中心是最重要的基础部分

分布式系统中为什么需要服务发现?

服务发现的两种方式

  • 客户端发现(Eureka)
  • 服务端发现(Nginx、Zookeeper、Kubernetes)

微服务的特点:异构

  • 不同语言
  • 不同类型的数据库

Springcloud的服务调用方式

  • REST
  • Node.js的eureka-js-client

服务拆分 – 起点和终点?

起点:

  • 既有架构的形态

终点:

  • 好的架构不是设计出来的,而是进化而来的
  • 一直在演进

适合上微服务吗?

业务形态不适合的
– 系统中包含很多强事务场景的
– 业务相对稳定,迭代周期长
– 访问压力不大,可用性要求不高

康威定律

任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通结构保持一致

微服务和团队结构

微服务的特点
– 一系列微小的服务共同组成
– 单独部署,跑在自己的进程里
– 每个服务为独立的业务开发
– 分布式的管理

服务拆分的方法论

扩展立方模型(Scale Cube)
– X轴 水平复制
– Z轴 数据区分
– Y轴 功能解耦

如何拆”功能”?
– 单一职责,松耦合,高内聚
– 关注分离点(按职责、通用性、粒度级别)

服务和数据的关系:
– 先考虑业务功能,再考虑数据
– 无状态服务

如何拆”数据”?
– 每个微服务都有单独的数据存储
– 依据服务特点选择不同结构的数据库类型
– 难点在确定边界(针对边界设计API、依据边界权衡数据冗余)

点餐业务服务拆分分析

应用间通信

Springcloud中服务间两种RESTFul调用方式

  • RestTemplate

  • Feign

RestTemplate

订单服务 -> 商品服务

客户端负载均衡 – Ribbon

  • RestTemplate

  • Feign

  • Zuul

特点

  • 服务发现

  • 服务选择规则

  • 服务监听

主要组件

  • ServerList

  • IRule

  • ServerListFilter

Feign

  • 声明式REST客户端(伪RPC)

  • 采用了基于接口的注解

多模块划分

  • product-server:所有业务逻辑

  • product-client:对外暴露的接口

  • product-common:公用的对象

依赖关系

同步 or 异步

微服务和容器 – 天生一对

  • 从系统环境开始,自底至上打包应用
  • 轻量级,对资源的有效隔离和管理
  • 可复用,版本化

统一配置中心

为什么需要统一配置中心?

  • 不方便维护
  • 配置内容安全与权限
  • 更新配置项目需要重启

异步

客户端请求不会阻塞进程,服务端的响应可以是非即时的

异步的常见形态

  • 通知
  • 请求/异步响应
  • 消息

MQ使用场景

  • 异步处理
  • 流量削峰
  • 日志处理
  • 应用解耦

Spring cloud Stream

原始流程

  • 1、查询商品信息(调用商品服务)
  • 2、计算总价(生成订单详情)
  • 3、商品服务扣库存(调用商品服务)
  • 4、订单入库(生成订单)

异步扣库存分析


  • 可靠的消息投递
  • 用户体验的变化

具体操作

  • 1、库存在Redis中保存
  • 2、收到请求Redis判断是否库存充足,减掉Redis中库存
  • 3、订单服务创建订单写入数据库,并发送消息

异步和消息处理

服务网关

为什么需要服务网关

服务网关的要素

  • 稳定性和高可用
  • 性能和并发性
  • 安全性
  • 扩展性

常用的网关方案

Zuul的特点

  • 路由+过滤器=Zuul
  • 核心是一系列的过滤器

Zuul的四种过滤器API

  • 前置(Pre):限流、鉴权、参数校验调整
  • 后置(Post):统计、日志
  • 路由(Route)
  • 错误(Error)

请求生命周期

Zuul的高可用

  • 多个Zuul节点注册到Eureka Server
  • Nginx和Zuul”混搭”

Zuul综合使用

Zuul限流

  • 时机:请求被转发之前调用

令牌桶算法

Zuul权限校验

  • /order/create 只能买家访问
  • /order/finish 只能卖家访问
  • /product/list 都可以访问

解决方案

  • 在前置过滤器中实现相关逻辑
  • 分布式Session 或 OAuth2

Zuul跨域问题

  • 在被调用的类或方法上加上@CrossOrigin注解
  • 在Zuul里增加CorsFilter过滤器

Springcloud Hystrix

  • 防雪崩利器
  • 基于Netflix对应的Hystrix

功能

服务降级

  • 优先核心服务,非核心服务不可用或弱可用
  • 通过HystrixCommand注解指定
  • fallbackMethod(回退函数)中具体实现降级逻辑

依赖隔离

  • 线程池隔离
  • Hystrix自动实现了依赖隔离

服务熔断

circuitBreaker.requestVolumeThreshold
circuitBreaker.sleepWindowInMilliseconds
circuitBreaker.errorThresholdPercentage

  • Circuit Breaker:断路器

监控(Hystrix Dashboard)

链路监控

  • SpringCloud Sleuth

集成步骤

  • 引入依赖
  • 启动 ZipKin Server
  • 配置参数

分布式追踪系统

核心步骤
– 数据采集
– 数据存储
– 查询展示

OpenTracing

  • 优势:来自大名鼎鼎的CNCF
  • ZIPKIN、TRACER、JAEGER、GRPC

Annotation

事件类型:
– cs(Client Send):客户端发起请求的时间
– cr(client Received):客户端收到处理完请求的时间
– ss(Server Send):服务端处理完逻辑的时间
– sr(Server Received):服务端收到调用端请求的时间

客户端调用时间=cr-cs

服务端处理时间=sr-ss

ZipKin

几个关键概念
– traceId
– spanId
– parentId


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:Spring Cloud微服务改造实战-基于Springboot微信点餐项目
喜欢 (0)
[247507792@qq.com]
分享 (0)
Geekerstar
关于作者:
本站技术支持

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00