# imooc-springcloud-alibaba **Repository Path**: gcloudrabbit/imooc-springcloud-alibaba ## Basic Information - **Project Name**: imooc-springcloud-alibaba - **Description**: imooc-springcloud-alibaba - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2023-08-15 - **Last Updated**: 2023-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README * ### 课程地址 * https://coding.imooc.com/class/package/358.html * ### 课程讲师个人博客地址 * http://www.itmuch.com/ * ### 微服务脚手架 * https://gitee.com/zuihou111/lamp-cloud > 目录 [TOC] # 第1章 课程介绍 * 微服替换的一些组件 ![作图时间2021-05-21](img/SpringCloudAlibaba.png) # 第2章 Spring Boot基础 ## 问题一 @Resource @Autoired 注解的区别 * `@Resource @Autoired` `@Component @Repository @Service @Controller` [注解的区别](https://blog.csdn.net/qq_42920045/article/details/116646304) ## 问题二 Spring父子容器-还需找到官方文档 * # 第3章 微服务的拆分与编写 ## 微服务最初提出的定义 [原文](https://www.martinfowler.com/articles/microservices.html) * 简单描述 * 每个微服务可以独立运行在自己的进程里 * 一系列独立运行的微服务共同构建起整个系统 * 每个服务为独立的业务开发, 一个微服务只关注某个特定的功能, 例如订单管理, 用户管理等 * 可以使用不同的语言与数据存储技术 ( 契合项目情况和团队实力 ) * 微服务之间通关轻量级的通信机制进行通信, 例如通过 REST API 进行调用 * 全自动的部署机制 # 第4章 Spring Cloud Alibaba介绍 ## SpringCloud 版本命名 ```xml org.springframework.boot spring-boot-starter-parent 2.1.5.RELEASE org.springframework.cloud spring-cloud-dependencies Greenwich.SR6 pom import ``` ## SpringCloud 生命周期 * [版本发布规划](https://github.com/spring-cloud/spring-cloud-release/milestones) * [版本发布记录](https://github.com/spring-cloud/spring-cloud-release/releases) * [版本终止声明, cloud 对应的 SpringBoot 版本](https://spring.io/projects/spring-cloud#overview) ![](img/ReleaseTrain-BootVersion.png) ## **生产环境选择版本** * 坚决不用非稳定版本(例如: M<`number`>,SHAPSHOT) / end-of-life (已经停止维护, 如上图说明的: Dalston,Ealston,Edgware,Finchley, and Greenwich) 版本 * 尽量使用新一代版本 * xxx.RELEASE 版本缓一缓 * SR2之后**一般**可以大规模使用 * [SpringCloud 和 SpringCloudAlibaba 的一些组件兼容性](https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E) # 第6章 实现负载均衡-Ribbon * 自定义Ribbon负载规则 * 实现 `IRule` 接口 : `implements com.netflix.loadbalancer.IRule` * 继承 `AbstractLoadBalancerRule` 抽象类 : `extends com.netflix.loadbalancer.AbstractLoadBalancerRule` * `content-center` 项目中有实现 [同集群优先调用, 基于权重的负载均衡] 的案例 # 第7章 声明式HTTP客户端-Feign * Feign 懒加载的开启与关闭 * Feign 传参封装成对象需要加一个 `@SpringQueryMap` * Feign 性能优化 * Feign 默认情况下使用 `HttpURLConnection` 来发起的请求 源码地址: `feign.Client.Default` 可配置 `feign-httpclient`来优化性能 * Feign 的使用 [慕课手记](http://www.imooc.com/article/289005) # 第8章 服务容错-Sentinel * [Sentinel 下载](https://github.com/alibaba/Sentinel/releases) * `RestTemplate` 中的 Sentinel 实现 * com.alibaba.cloud.sentinel.custom.SentinelProtectInterceptor * 微服务雪崩效应(级联失效,级联故障,cascading failure) * 在微服务高并发的场景下, 在某一个时间点微服务 A 所有实例挂掉了, 这是一个高并发的业务 B 服务还在疯狂的调用 A 服务的 API , 那么 B 发往 A 服务的请求就会强制等待直到请求超时, 额在java项目中一次请求往往都对应了一个线程,如果请求被强制等待了那么线程就会被强制阻塞一直到请求超时的时候这个线程才会被释放,在高并发的情况下阻塞的线程只会越来越多,额线程对应的又是服务器资源(内存,cpu)如果 B 服务无法再创建线程了,于是 B 服务也挂了,B 服务就被 A 服务给拖死了 * 简述:在高并发的情况下,服务调用链中的某一个点挂掉了会导致整条链路挂掉 ## 微服务雪崩效应 - 的常见容错方案 * 超时 (只要释放够快就不那么容易挂掉了) * 限流 (我有一碗饭的饭量,你给我三碗,我只吃一碗) * [仓壁模式](https://en.wikipedia.org/wiki/Bulkhead_(partition)) (不吧鸡蛋放在一个篮子里) ![](img/bulkhead-partition.png) * [断路器模式](https://martinfowler.com/bliki/CircuitBreaker.html) (监控加开关) ![](img/circuit-breaker.png) ## Sentinel 生产上使用 * 自己搭建 * Alibaba Sentinel 规则持久化-拉模式 [慕课手记](http://www.imooc.com/article/289402) * Alibaba Sentinel 规则持久化-推模式 [慕课手记](http://www.imooc.com/article/289464) * 推拉模式持久化规则 - 推模式更佳 * 使用 Aliyun 提供的服务 * [开通地址](https://ahas.console.aliyun.com/) * [开通说明](https://help.aliyun.com/document_detail/90323.html) # 第9章 消息驱动的微服务-Spring Cloud Alibaba RocketMQ ![](img/RocketMQ-tx-msg.png) [Spring Cloud Stream知识点盘点](https://www.imooc.com/article/290489) [Spring Cloud Stream实现消息过滤消费](https://www.imooc.com/article/290424) # 第10章 API网关-Spring Cloud Gateway ## Spring Cloud Gateway 是什么? * 是 Spring Cloud 的网关 (第二代) , 未来会取代 Zuul (第一代) * 基于Netty, Reactor 以及 WebFlux 构建 * 依赖Netty与 Webflux , 不是 Servlet 编程模型 * 不能在 Servlet 容器下工作,也不能构建成 WAR 包 * 不支持Spring Boot `1.X` ## 核心概念 * Route ( 路由 ) - 转发规则 * Gateway 的基础元素, 可简单理解成一条转发的规则包含: ID, 目标URL, Predicate 集合以及Filter集合。 * Predicate ( 谓词 ) - 控制这个请求是不是走这个转发规则 * 即 `java.util.function.Predicate` , Gateway 使用 Predicate 实现路由的匹配条件 * Filter ( 过滤器 ) - 可以为这个请求添加自己的逻辑, 修改请求与响应 * 修改请求以及响应 官方架构图 [原文地址](https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-how-it-works) ![](img/spring_cloud_gateway_diagram.png) 相关源码 * Gateway Handler Mapping: * org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping * Gateway Web Handler: * org.springframework.cloud.gateway.handler.FilteringWebHandler ## Gateway 内置的路由谓词工厂详解 ( Route Predicate Factories ) ![](img/route-predicate-factory.png) 内置的路由谓词工厂用法 [慕课手记](http://www.imooc.com/article/290804) 自定义路由谓词工厂 * 继承抽象类 * `extends AbstractRoutePredicateFactory` * 可参照 `BetweenRoutePredicateFactory ` 源码来实现课程中的需求 * `org.springframework.cloud.gateway.handler.predicate.BetweenRoutePredicateFactory` * 在配置文件中注入日期类型时的源码: * `org.springframework.format.datetime.standard.DateTimeFormatterRegistrar#getFallbackFormatter` * **注意** 自定义路由谓词工厂, 类名一定要以 `RoutePredicateFactory` 结尾 ## 自定义过滤器 * 方式一 * 继承 : AbstractGatewayFilterFactory * 参考示例 : org.springframework.cloud.gateway.filter.factory.RequestSizeGatewayFilterFactory * 方式二 * 继承: AbstractNameValueGatewayFilterFactory * 参考示例 : org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory * 方式二继承自方式一是方式一的简化 * 自定义全局过滤器 [慕课手记](http://www.imooc.com/article/290821) * Gateway 排查问题时可以用到 [慕课手记](http://www.imooc.com/article/290822) ## 再谈过滤器执行顺序 * 结论一: Order越小越靠前执行 * 结论二: 局部过滤起工厂的Order按配置顺序从1开始递增 * 结论三: 如果配置了默认过滤器, 则先执行相同的Order的默认过滤器 ![](img/gateway-filter-run-order.png) > 默认过滤器的 1 > 局部过滤器的 1 > 默认过滤器的 2 > 局部过滤器的 2 > 局部过滤器的 3 * 结论四: 如需自行控制配置中的`Order` , 可返回 `OrderedGatewayFilter` 过滤器的核心代码 * 为过滤器设置了Order数值 , 从1开始 * org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#loadGatewayFilters * 加载默认过滤器 & 路由过滤器 , 并对过滤器做了排序 * org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator#getFilters * 构建过滤器链并执行 * org.springframework.cloud.gateway.handler.FilteringWebHandler#handle * **SpringCloudGateway 限流** [慕课手记](http://www.imooc.com/article/290828) # 第11章 微服务的用户认证与授权 * 本章主要内容是:如何实现用户认证与授权?实现的三种方案,全部是通过画图的方式讲解.以及三种方案的对比.最后根据方案改造Gateway和扩展Feign * `RestTemplate` 拦截器实现 `org.springframework.http.client.ClientHttpRequestInterceptor` 接口 * `Feign` 拦截器实现 `feign.RequestInterceptor` ## 有状态 VS 无状态 > 有状态 ![](img/Stateful.png) > 无状态 ![](img/Stateless.png) | | 有状态 | 无状态 | | ---- | ------------------------------------------------------------ | ------------------------------------ | | 优点 | 服务器端控制力强, 数据安全 | 去中心化, 无存储, 简单任意扩展, 缩容 | | 缺点 | 存在中心点, 鸡蛋放在一个篮子里; 签移麻烦; 服务器存储数据, 加大了服务器端压力 | 服务器端控制力相对弱 | ## 微服务认证 方案一 处处安全方案 * OAuth 2.0 [系列文章](http://ifeve.com/oauth2-tutorial-all/) * 代表实现 * Spring Cloud [Security](https://cloud.spring.io/spring-cloud-security/reference/html/) [示例代码](https://github.com/chengjiansheng/cjs-oauth2-sso-demo) * Jboss [Keycloak](https://www.keycloak.org/) 没有办法和Gateway配合使用因为他是基于Servlet模型的 [示例代码](https://github.com/eacdy/spring-cloud-yes) ## 微服务认证 方案二 外部无状态, 内部有状态方案 ![](img/stateful-stateless.png) ## 微服务认证 方案三 网关认证授权, 内部裸奔方案 ![](img/Streaking.png) ## 微服务认证 方案四 网关认证授权, 内部裸奔改进方案 ![](img/Streaking-plus.png) ## 方案对比与选择 - (实际项目中不局限于这四种方案) | 方案 | 复杂度 | 安全性 | 性能 | 测试难度 | | ---------------------- | ------ | ------ | ---- | ------------------------------- | | 处处安全 | 高 | 高 | 中 | 难 (一般做集成测试) | | 外部无状态, 内部有状态 | 低 | 中 | 高 | 难 (一般做集成测试) | | 内部裸奔 | 低 | 一般 | 高 | 简单 (造Header即可实现接口测试) | | 内部裸奔改进版 | 低 | 高 | 高 | 中 (造Token即可实现接口测试) | # 第12章 配置管理-Nacos * 本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 * 搭建一个生产可用的 Nacos [慕课手记](http://www.imooc.com/article/288153) ## 动态刷新流程 ![](img/nacos-Long-polling.png) # 第13章 调用链监控-Sleuth * 本章主要内容是:大白话剖析调用链监控原理,然后学习Sleuth,Zipkin,然后将Sleuth整合Zipkin,最后学习Zipkin数据持久化(Elasticsearch)以及Zipkin依赖关系图 ## 调用链监控原理 ![](img/client-link.png) * 分析记录的日志 * T2 - T1 就可以获取到请求时候的网络延迟 * T3 - T2 就可以获得 用户中心 执行这个API时的耗时 * T4 - T3 就是 用户中心 响应时候的网络延迟 * T4 - T1 就是整个调用链的总耗时 ## 业界流行的调用链监控工具 * Spring Cloud Sleuth + Zipkin * Skywalking , Pinpoint ## 什么是 Sleuth * Sleuth 是一个 Spring Cloud 的分布式跟踪解决方案 ## Sleuth 的术语 * Span ( 跨度 ) : * Sleuth 的基本工作单元, 它用一个 64 位的 id 唯一标识。 * 除 ID 外, Span 还包含其他数据 , 例如描述 , 时间戳事件 , 建值对的注解 ( 标签 ) , Span ID, Span 父 ID 等。 * 可以简单的认为记录表中的一条数据就为 span。 * Trace ( 跟踪 ) : * 一组 Span 组成的树状结构称为 Trace。 * Annotation ( 标注 ) * CS ( Client Sent 客户端发送 ) : 客户端发起一个请求 , 该 Annotation 描述了 Span 的开始。 * SR ( Server Received 服务器端接收 ) : 服务器端获得请求并准备处理它。 * SS ( Server Sent 服务器端发送 ) : 该 Annotation 表示完成请求处理 ( 当响应发回客户端时 )。 * CR ( Client Received 客户端接收 ) : Span 结束的标识。客户端成功接收到服务器端的响应。 ## Zipkin Server 下载与搭建 * [慕课手记](http://www.imooc.com/article/291572) * Zipkin 持久化 * MySQL * Elasticsearch * Cassandra * [官方文档](https://github.com/openzipkin/zipkin#storage-component) * [环境变量](https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage) * 数据持久化后依赖关系图 需要一个 Spark job 来生成 * Note: This store requires a [spark job](https://github.com/openzipkin/zipkin-dependencies) to aggregate dependency links. # 第15章 进阶:既有代码优化与改善 * 本章主要内容是:优化代码设计,提升可读性、改善代码结构 ## 项目中注释原则 * 每一步主要业务流程 * 核心方法 * 条件, 分支, 判断前 * 必加注释 * IDEA 插件 注释管理 : Statistic * IDEA 插件 [alibaba 代码规约](https://github.com/alibaba/p3c) : Alibaba Java Coding Guidelines ## 代码质量管理 * SonarQube 搭建与使用 [慕课手记](http://www.imooc.com/article/291857) # 第16章 进阶:多维度微服务监控 * 本章主要内容是 : JVM监控与分析,日志监控、聚合与分析,中间件监控,系统级的监控和其他监控等 ## SpringBootAdmin + SpringBoot Actuator * SpringBootAdmin 是为 SpringBoot 量身打造的一个简单易用的监控数据管理工具 * GitHub [地址](https://github.com/codecentric/spring-boot-admin) 可在线修改日志级别, 与监控jvm 线程池, 生成内存快照等操作 * 如果是单体架构可以使用: [SpringBootMonitor](https://gitee.com/ffch/SpringBootMonitor) ## Java自带的JVM监控工具 * jconsole * jvisualvm ## ELK日志监控 * [慕课手记](http://www.imooc.com/article/291751) ![](img/ELK-Log.png) ## GC日志/线程Dump日志/堆Dump可视化分析 * GC日志 `>>` [GCEasy](https://gceasy.io/) 与 GCPlot * 线程Dump日志 `>>` [FastThread](https://fastthread.io/) 与 spring boot admin * 堆Dump可视化分析 `>>` [HeapHero](https://heaphero.io/)与 jvisualvm # 第17章 进阶:完美融合异构微服务 * 本章主要内容是:Sidecar简介,然后编写Sidecar,异构微服务和Spring Cloud应用之间互相调用,Sidecar原理分析和优缺点分析