# SpringCloud模块学习 **Repository Path**: song-rice/spring-cloud-module-learning ## Basic Information - **Project Name**: SpringCloud模块学习 - **Description**: SpringCloudNetflix: 【①注册中心:Eureka ②负载均衡:Ribbon、Feign ③服务熔断:Hystrix ④服务降级:Hystrix ⑤服务监控:Hystrix Dashboard ⑥路由网关:Zuul ⑦配置中心:Config】 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-20 - **Last Updated**: 2023-10-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: 微服务, SpringCloudNetflix ## README # SpringCloud 一个完整项目 ![image-20230919112057107](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112057107.png) 水平拆分,负载均衡 ![image-20230919112112281](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112112281.png) 服务拆分,模块化 ![image-20230919112135521](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112135521.png) ## 微服务四个核心问题及解决方案 ![image-20230919112450178](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112450178.png) ![image-20230919112333793](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112333793.png) ![image-20230919112411120](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112411120.png) 解决方案: ![image-20230919112550054](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112550054.png) ![image-20230919112911392](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112911392.png) ![image-20230919112924024](https://gitee.com/song-rice/upload-image/raw/master/image-20230919112924024.png) ## 面试题 为什么要设计SpringCloud? **本质:分布式项目网络不可靠** ![image-20230919113033240](https://gitee.com/song-rice/upload-image/raw/master/image-20230919113033240.png) ![image-20230919131244248](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131244248.png) ![image-20230919131437007](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131437007.png) ![image-20230919131526770](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131526770.png) ![image-20230919131649829](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131649829.png) ![image-20230919131701945](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131701945.png) ![image-20230919131737783](https://gitee.com/song-rice/upload-image/raw/master/image-20230919131737783.png) ## 比较完善的项目架构图 一个较为完整的项目架构设计图: ![image-20230919132901103](https://gitee.com/song-rice/upload-image/raw/master/image-20230919132901103.png) ![image-20230919133529335](https://gitee.com/song-rice/upload-image/raw/master/image-20230919133529335.png) ![image-20230919171050023](https://gitee.com/song-rice/upload-image/raw/master/image-20230919171050023.png) ![image-20230919171050023](https://gitee.com/song-rice/upload-image/raw/master/image-20230919171050023.png) ![image-20230919171557296](https://gitee.com/song-rice/upload-image/raw/master/image-20230919171557296.png) ## SpringCloud ### 什么是springcloud? ![image-20230920092635935](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230920092635935.png) ![image-20230920092714445](https://gitee.com/song-rice/upload-image/raw/master/image-20230920092714445.png) ### springcloud和springboot的关系? ![image-20230920092840745](https://gitee.com/song-rice/upload-image/raw/master/image-20230920092840745.png) ![image-20230919134141264](https://gitee.com/song-rice/upload-image/raw/master/image-20230919134141264.png) ![image-20230919134427509](https://gitee.com/song-rice/upload-image/raw/master/image-20230919134427509.png) ![image-20230919134526530](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230919134526530.png) ![image-20230919145640485](https://gitee.com/song-rice/upload-image/raw/master/image-20230919145640485.png) 23种设计模式+微服务 ![image-20230919172331018](https://gitee.com/song-rice/upload-image/raw/master/image-20230919172331018.png) ![image-20230919172707717](https://gitee.com/song-rice/upload-image/raw/master/image-20230919172707717.png) ![image-20230919172721432](https://gitee.com/song-rice/upload-image/raw/master/image-20230919172721432.png) 使用最后这两个 ## first-springcloud ### 1.建maven父项目 创建一个简单的maven项目,作为父项目 - 打包方式 : pom - 导入springcloud依赖、springboot依赖、数据库、mybatis、log4j、junit、lombok 兄弟们,听我一句劝,尽量跟狂神版本保持一致,我是后面过来的,重新看版本 ​ ![image-20230920101941691](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230920101941691.png) ![](https://gitee.com/song-rice/upload-image/raw/master/image-20230920101818775.png) ![image-20230920101858398](https://gitee.com/song-rice/upload-image/raw/master/image-20230920101858398.png) ### 2.子模块开发 #### api 建api maven模块 ![image-20230920102206345](https://gitee.com/song-rice/upload-image/raw/master/image-20230920102206345.png) 建表 ![image-20230920102411600](https://gitee.com/song-rice/upload-image/raw/master/image-20230920102411600.png) 创建实体类(实现序列化)序列化:为了转成流 ![image-20230920102944558](https://gitee.com/song-rice/upload-image/raw/master/image-20230920102944558.png) #### provider-8001 导入依赖 ![image-20230920103205162](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103205162.png) ![image-20230920103225481](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103225481.png) ![image-20230920103304798](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103304798.png) ![image-20230920103335596](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103335596.png) 配置:端口、mybatis、spring ![image-20230920103457329](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103457329.png) ![image-20230920103813439](https://gitee.com/song-rice/upload-image/raw/master/image-20230920103813439.png) 写controller、service、dao层,controller层提供Restful服务! ![image-20230920104336756](https://gitee.com/song-rice/upload-image/raw/master/image-20230920104336756.png) ![image-20230920104516477](https://gitee.com/song-rice/upload-image/raw/master/image-20230920104516477.png) ![image-20230920104609644](https://gitee.com/song-rice/upload-image/raw/master/image-20230920104609644.png) ![image-20230920105811197](https://gitee.com/song-rice/upload-image/raw/master/image-20230920105811197.png) ### consumer-80 ![image-20230920110030781](https://gitee.com/song-rice/upload-image/raw/master/image-20230920110030781.png) ![image-20230925093512640](https://gitee.com/song-rice/upload-image/raw/master/image-20230925093512640.png) 注意一下啊,这个别急着点DoRefactor,这个好像把模块2的一个东西也给改了 ![image-20230920111416274](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111416274.png) ![image-20230920111618546](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111618546.png) ![image-20230920111640463](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111640463.png) ![image-20230920111707124](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111707124.png) ![image-20230920111744566](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111744566.png) 测试 ![image-20230920111907123](https://gitee.com/song-rice/upload-image/raw/master/image-20230920111907123.png) 只需要在provider的controller的add方法的参数里面改为(@RequestBody Dept dept)即可 原来dubbo+zookeeper:需要注册进来,并引用,供消费者使用 现在springcloud:知道提供者url,通过restTemplate请求获取数据 ## Eureka注册中心(提供方+消费方) 优瑞卡 ### 服务注册与发现 ![image-20230925135402986](https://gitee.com/song-rice/upload-image/raw/master/image-20230925135402986.png) ![image-20230925135545519](https://gitee.com/song-rice/upload-image/raw/master/image-20230925135545519.png) ![image-20230925135706863](https://gitee.com/song-rice/upload-image/raw/master/image-20230925135706863.png) ![image-20230925140022340](https://gitee.com/song-rice/upload-image/raw/master/image-20230925140022340.png) ![image-20230925141046365](https://gitee.com/song-rice/upload-image/raw/master/image-20230925141046365.png) 1. 新建eureka模块:7001 2. 导包 优瑞卡Eureka 3. 写配置文件 Eureka配置 4. 启动类开启 ![image-20230925140101221](https://gitee.com/song-rice/upload-image/raw/master/image-20230925140101221.png) ![image-20230925144837878](https://gitee.com/song-rice/upload-image/raw/master/image-20230925144837878.png) ![image-20230925144933769](https://gitee.com/song-rice/upload-image/raw/master/image-20230925144933769.png) 访问 7001 ,验证 Eureka 服务是否搭建成功! 接下来,需要将7001服务提供者的服务注册放入Eureka! 1. 导入Eureka依赖 2. Eureka的配置,服务注册到哪里---注册到注册中心 3. 启动类开启支持 ![image-20230925145407442](https://gitee.com/song-rice/upload-image/raw/master/image-20230925145407442.png) ![image-20230925145457110](https://gitee.com/song-rice/upload-image/raw/master/image-20230925145457110.png) ![image-20230925145530424](https://gitee.com/song-rice/upload-image/raw/master/image-20230925145530424.png) ![image-20230925145952040](https://gitee.com/song-rice/upload-image/raw/master/image-20230925145952040.png) 完善监控信息: 可以让别人看到这个微服务是干嘛的 1. 导包 2. 配置信息 ![image-20230925150120821](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150120821.png) ![image-20230925150209760](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150209760.png) ![image-20230925150247716](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150247716.png) ![image-20230925150317999](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150317999.png) ### 自我保护机制 心跳阈值; 好死不如赖活着 ![image-20230925150412573](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150412573.png) 注册进来的微服务,获取一些消息 ![image-20230925150905722](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150905722.png) ![image-20230925150952410](https://gitee.com/song-rice/upload-image/raw/master/image-20230925150952410.png) ![image-20230925151044439](https://gitee.com/song-rice/upload-image/raw/master/image-20230925151044439.png) ![image-20230925151054346](https://gitee.com/song-rice/upload-image/raw/master/image-20230925151054346.png) ### 集群环境配置 Eureka(集群注册中心)+Ribbon(消费方进程内负载均衡) 使用服务提供方将服务注册到集群上,消费方访问服务方的服务时,通过服务名去集群的节点(随机一个)获取服务; new 7002 \7003 moudle,导入依赖 ![image-20230926084829867](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230926084829867.png) ![image-20230926085303788](https://gitee.com/song-rice/upload-image/raw/master/image-20230926085303788.png) 三个结点之间需要绑定关系,当一个崩了,就去访问另一个 ![image-20230926085439532](https://gitee.com/song-rice/upload-image/raw/master/image-20230926085439532.png) ![image-20230926085500179](https://gitee.com/song-rice/upload-image/raw/master/image-20230926085500179.png) 在这里可以修改localhost 的名字,修改为 eurka700x.com 域名,访问这三个网站,就都会去访问 127.0.0.1 ![image-20230926085632274](https://gitee.com/song-rice/upload-image/raw/master/image-20230926085632274.png) ![image-20230926085555680](https://gitee.com/song-rice/upload-image/raw/master/image-20230926085555680.png) ![image-20230926090102108](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090102108.png) 配置集群之间的关联: ![image-20230926090238368](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090238368.png) ![image-20230926090351263](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090351263.png) ![image-20230926090512346](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090512346.png) 服务提供者发布服务到集群:发布到3个注册中心 ![image-20230926090558153](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090558153.png) ![image-20230926090606434](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090606434.png) 访问7003,挂了另外2个结点 ![image-20230926090942321](https://gitee.com/song-rice/upload-image/raw/master/image-20230926090942321.png) 测试访问服务 ### CAP原则 ![image-20230926102902204](https://gitee.com/song-rice/upload-image/raw/master/image-20230926102902204.png) ![image-20230926104312931](https://gitee.com/song-rice/upload-image/raw/master/image-20230926104312931.png) ![image-20230926104505354](https://gitee.com/song-rice/upload-image/raw/master/image-20230926104505354.png) ## Ribbon负载均衡(服务消费方) 瑞泵 ![image-20230926104853490](https://gitee.com/song-rice/upload-image/raw/master/image-20230926104853490.png) ![image-20230926105120044](https://gitee.com/song-rice/upload-image/raw/master/image-20230926105120044.png) ![image-20230926105548908](https://gitee.com/song-rice/upload-image/raw/master/image-20230926105548908.png) ![image-20230926105657611](https://gitee.com/song-rice/upload-image/raw/master/image-20230926105657611.png) ![image-20230926105719518](https://gitee.com/song-rice/upload-image/raw/master/image-20230926105719518.png) nginx : 反向代理服务器 ![image-20230926105915239](https://gitee.com/song-rice/upload-image/raw/master/image-20230926105915239.png) 区分:nginx 是集中式负载均衡(中间单独加一层),ribbon是进程式负载均衡(消费方集成) ### 消费方使用Ribbon 瑞泵 1. 消费方导依赖 Ribbon、Eureka:用于注册发现消费方服务 2. 配置文件:配置Eureka 3. 启动:启动类加注解 4. 配置:configBean 配置负载均衡实现RestTemplate 5. 测试访问:消费方是否能访问到服务 6. 结论 ![image-20230926110331207](https://gitee.com/song-rice/upload-image/raw/master/image-20230926110331207.png) ![image-20230926110343539](https://gitee.com/song-rice/upload-image/raw/master/image-20230926110343539.png) spring-cloud-starter-netflix-ribbon 更新了 现在有spring-cloud-starter-loadbalancer了 eureka已经过期,用netflix的eureka-client 推荐 spring-cloud-starter-netflix-eureka-client,里面集成了 Ribbon哦 ![image-20230926110734449](https://gitee.com/song-rice/upload-image/raw/master/image-20230926110734449.png) ![image-20230926110804339](https://gitee.com/song-rice/upload-image/raw/master/image-20230926110804339.png) ![image-20230926110917738](https://gitee.com/song-rice/upload-image/raw/master/image-20230926110917738.png) ![image-20230926111034784](https://gitee.com/song-rice/upload-image/raw/master/image-20230926111034784.png) 进程式负载均衡 由消费者(通过服务名)决定访问谁(7001/7002/7003) ![image-20230926111401250](https://gitee.com/song-rice/upload-image/raw/master/image-20230926111401250.png) 总结 ![image-20230926111513059](https://gitee.com/song-rice/upload-image/raw/master/image-20230926111513059.png) ### Eureka+Ribbon图解 获取服务列表,再通过负载均衡算法去决定访问谁 ![image-20230926170931288](https://gitee.com/song-rice/upload-image/raw/master/image-20230926170931288.png) ### 实例 1. 创建3个数据库 db01\db02\db03 2. 创建3个提供者 8001\8002\8003,3个服务提供者提供相同服务,访问3个不同数据库 3. 启动,访问消费方接口,看db_source是哪个数据库,就能看到走的是哪个端口服务(拿到的是服务列表中的哪个提供者提供的服务) 发现,是轮询 ![image-20230926171111787](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171111787.png) ![image-20230926171144426](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171144426.png) ![image-20230926171255966](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171255966.png) ![image-20230926171350178](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171350178.png) ![image-20230926171530154](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171530154.png) ![image-20230926171553130](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171553130.png) 客户端从集群注册中心中,获取服务列表,然后自己根据负载均衡策略,判断访问哪个服务提供者的服务,根据结果发现,默认策略是轮询 ![image-20230926171738234](https://gitee.com/song-rice/upload-image/raw/master/image-20230926171738234.png) ![image-20230926172010271](https://gitee.com/song-rice/upload-image/raw/master/image-20230926172010271.png) ### 自己测试 自己建2个提供者,每个提供者有自己的数据库,都有user表; 测试有提供者 8001,8002时候,消费方消费获取用户数据时,会如何获取数据? 访问8001,还是8002,还是轮询访问? Ribbon负载均衡:先从注册中心获取所有提供服务的列表,然后从里面按照策略选择一个,访问获取数据 消费者访问,获取数据: ![image-20231012155219481](https://gitee.com/song-rice/upload-image/raw/master/image-20231012155219481.png) ![image-20231012155258668](https://gitee.com/song-rice/upload-image/raw/master/image-20231012155258668.png) 数据库1: ![image-20231012155337277](https://gitee.com/song-rice/upload-image/raw/master/image-20231012155337277.png)数据库2: ![image-20231012155323128](https://gitee.com/song-rice/upload-image/raw/master/image-20231012155323128.png) ### 自定义负载均衡算法 默认负载均衡策略:轮询, 自己声明为:随机 ![image-20231014154556715](https://gitee.com/song-rice/upload-image/raw/master/image-20231014154556715.png) 自定义规则:每个服务访问5次,5次到了,访问下一个服务![image-20231014160501968](https://gitee.com/song-rice/upload-image/raw/master/image-20231014160501968.png) ## Feign负载均衡(服务消费方) ![image-20231016090927805](https://gitee.com/song-rice/upload-image/raw/master/image-20231016090927805.png) ![image-20231016091631525](https://gitee.com/song-rice/upload-image/raw/master/image-20231016091631525.png) ### 测试使用 1. 复制消费方代码,新建模块 springcloud-consumer-user-feign 2. (可删除可不删)删除现有的负载均衡自定义策略 3. api模块编写service 接口,feign是基于接口做的负载均衡 4. api 、feign 模块都导入feign依赖 5. api 模块 service 接口添加@FeignClient注解 6. feign消费方controller层使用Fegin管理的service接口 7. 启动类注解开启Feign ![image-20231016092005044](https://gitee.com/song-rice/upload-image/raw/master/image-20231016092005044.png) 导入openfeign没有找到注解的同学删除版本信息 maven坐标用这个spring-cloud-starter-openfeign 加@Service注解,否则后面注入找不到 ![image-20231016092416580](https://gitee.com/song-rice/upload-image/raw/master/image-20231016092416580.png) controller注入service,使用 ![image-20231016092723794](https://gitee.com/song-rice/upload-image/raw/master/image-20231016092723794.png) ![image-20231016092828204](https://gitee.com/song-rice/upload-image/raw/master/image-20231016092828204.png) 通过Feign实现负载均衡,通过Ribbon实现远程服务调用 在feign中加上 排除spring-cloud-netflix-ribbon这个依赖 ## Hystrix服务熔断降级 ![image-20231016152746594](https://gitee.com/song-rice/upload-image/raw/master/image-20231016152746594.png) ![image-20231016152902249](https://gitee.com/song-rice/upload-image/raw/master/image-20231016152902249.png) 假设E2断了,这个服务就雪崩了 ![image-20231016153432488](https://gitee.com/song-rice/upload-image/raw/master/image-20231016153432488.png) 解决办法:弃车保帅,做个备份,E2死了,就启用备份(备份只需要做一些容灾处理,比如返回一个报错消息之类的,避免一直在这等待或者抛出调用方法无法处理的异常,这样保证了服务调用方的线程不会被长时间占用,从而避免在分布式系统中的蔓延) ![image-20231016153644297](https://gitee.com/song-rice/upload-image/raw/master/image-20231016153644297.png) ![image-20231016153757373](https://gitee.com/song-rice/upload-image/raw/master/image-20231016153757373.png) ### 服务熔断(服务提供方) ![image-20231016154009295](https://gitee.com/song-rice/upload-image/raw/master/image-20231016154009295.png) #### 模拟使用 相当于给服务提供者设置个备份,当8001异常了,就启动备份,备份做的事情可以是处理返回一个错误信息,不要让一直卡在这就行 1. 新建hystrix-provider-8001模块 2. 导入依赖 3. 编写配置 4. 开启@Enablexxx ![image-20231016154623883](https://gitee.com/song-rice/upload-image/raw/master/image-20231016154623883.png) ![image-20231016154650843](https://gitee.com/song-rice/upload-image/raw/master/image-20231016154650843.png) 模拟提供者异常8001异常,直接抛出运行时异常 ![image-20231016154832640](https://gitee.com/song-rice/upload-image/raw/master/image-20231016154832640.png) 备选方案,返回异常信息 ![image-20231016154949026](https://gitee.com/song-rice/upload-image/raw/master/image-20231016154949026.png) 想要的效果: 上面正常调用的出现异常,没有找到数据时候,不要抛出异常,直接备选方案,返回一个信息。 开整!!! 实现:加注解 1.服务提供者接口上下架 ![image-20231016155206097](https://gitee.com/song-rice/upload-image/raw/master/image-20231016155206097.png) 2.启动类上加 ![image-20231016155257697](https://gitee.com/song-rice/upload-image/raw/master/image-20231016155257697.png) 启动:启动集群,7001 (、7002 启动不启动无所谓,这里主要为了测试消费方消费服务的时候,如果获取数据为空时,会不会走备用服务,既Hystrix服务熔断有没有起作用);启动hystrix-provider 访问消费方接口,先访问存在的id, 再访问不存在的 ![image-20231016155450344](https://gitee.com/song-rice/upload-image/raw/master/image-20231016155450344.png) ![image-20231016155454915](https://gitee.com/song-rice/upload-image/raw/master/image-20231016155454915.png) ![image-20231016161024903](https://gitee.com/song-rice/upload-image/raw/master/image-20231016161024903.png) #### 测试结果 访问消费方接口,获取提供的服务,如果用户存在,返回用户数据;如果用户不存在,返回错误提示信息 ![image-20231017160759738](https://gitee.com/song-rice/upload-image/raw/master/image-20231017160759738.png) ![image-20231017160911257](https://gitee.com/song-rice/upload-image/raw/master/image-20231017160911257.png) #### 显示服务ip ![image-20231016161510788](https://gitee.com/song-rice/upload-image/raw/master/image-20231016161510788.png) 默认false ,显示的是域名,localhost ![image-20231016161553909](https://gitee.com/song-rice/upload-image/raw/master/image-20231016161553909.png) #### 自己测试 ![image-20231017161757553](https://gitee.com/song-rice/upload-image/raw/master/image-20231017161757553.png) ### 服务降级(服务消费方) A资源高并发时候,请求太多,服务器资源不够用了,关闭A,告诉客户端A关闭了,服务降级了,让请求去访问B、C 避免资源浪费、服务雪崩 ![image-20231018093905666](https://gitee.com/song-rice/upload-image/raw/master/image-20231018093905666.png) #### 模拟使用 服务降级是针对消费端,和服务端没有关系 1. 消费方添加 降级服务的service实现类 2. 消费方fegin负载均衡上指定降级服务fallbackFactory = "刚写的实现类" 3. 开启降级配置 application.yml fegin.hystrix.enable:true 4. 启动 - 启动注册中心 7001 - 启动提供方 8001 - 启动消费方 fegin-81 - 测试,获取用户接口,正常获取到了,然后模拟服务降级,关闭 8001, 再次访问就返回服务降级提示信息 ![image-20231018100542500](https://gitee.com/song-rice/upload-image/raw/master/image-20231018100542500.png) ![image-20231018101548621](https://gitee.com/song-rice/upload-image/raw/master/image-20231018101548621.png) 服务降级,需要实现一些很重要的服务,因为资源的不够,只能先把一些服务给暂停了, ![image-20231018100726066](https://gitee.com/song-rice/upload-image/raw/master/image-20231018100726066.png) 必须开这个,否则feign和Hystrix不能共用 新版配置项是叫feign.circuitbreaker.enabled ![image-20231018100759334](https://gitee.com/song-rice/upload-image/raw/master/image-20231018100759334.png) 访问: ![image-20231018101707931](https://gitee.com/song-rice/upload-image/raw/master/image-20231018101707931.png) 关闭 8001 ,模拟服务降级了,返回降级提示信息 ![image-20231018101845063](https://gitee.com/song-rice/upload-image/raw/master/image-20231018101845063.png) 熔断是为了防止服务端被动出现异常,降级是为了合理分配服务器资源 ![image-20231018102146033](https://gitee.com/song-rice/upload-image/raw/master/image-20231018102146033.png) #### 自己测试 启动7001、8001、83 正常访问: ![image-20231018140905562](https://gitee.com/song-rice/upload-image/raw/master/image-20231018140905562.png) 关闭8001服务,看是否会服务降级处理 ![image-20231018141002966](https://gitee.com/song-rice/upload-image/raw/master/image-20231018141002966.png) ## 概念总结 - Eureka注册中心 服务发现,提供的所有服务一目了然 - Eureka集群部署 一个注册中心自身挂了,可以自动访问另一个注册中心来获取服务 ![image-20231018110134534](https://gitee.com/song-rice/upload-image/raw/master/image-20231018110134534.png) - Ribbon、Feign消费方进程级负载均衡 消费方从注册中心获取所有服务提供者列表,从里面挑一个,请求服务 ![image-20231018110914678](https://gitee.com/song-rice/upload-image/raw/master/image-20231018110914678.png) Ribbon 是通过在消费方controller 层 restTemplate.postForObject(服务名) 发送请求,从注册中心可用服务提供方列表中挑一个,获取数据; Feign 是通过在消费方定义的 service 层上通过 @Feign(服务名) 注解来定义服务 + 绑定服务接口 + controller调用service 即可; ​ ![image-20231018112634966](https://gitee.com/song-rice/upload-image/raw/master/image-20231018112634966.png) - Hystrix提供方服务熔断 A调用 -- > G -- >E1(调用E1有问题时候,不要造成死等或者服务奔溃异常,可以搞个服务熔断处理 ,说白了就是 E1 有异常时候,也处理下,E2 来返回个异常提示也行,别让服务挂了) -- >E3 ![image-20231018112919597](https://gitee.com/song-rice/upload-image/raw/master/image-20231018112919597.png) - Hystrix 服务降级 服务资源紧张了,关当前服务,降级处理 ![image-20231018125008178](https://gitee.com/song-rice/upload-image/raw/master/image-20231018125008178.png) ### DashBoard流监控 搞一个监控页面,就是这个 猪,和客户端有关,与服务方无关 ![image-20231018150901961](https://gitee.com/song-rice/upload-image/raw/master/image-20231018150901961.png) ![image-20231018151022963](https://gitee.com/song-rice/upload-image/raw/master/image-20231018151022963.png) - 新建 consumer-hystirx-dashboard 模块,导入依赖、端口 9001 - 启动类上开启监控注解、添加bean - 确保服务端 8001 8002 都导入了监控依赖 - 启动访问 ![image-20231018151242531](https://gitee.com/song-rice/upload-image/raw/master/image-20231018151242531.png) ![image-20231019105959244](https://gitee.com/song-rice/upload-image/raw/master/image-20231019105959244.png) ![image-20231019110602640](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110602640.png) ![image-20231019110047603](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110047603.png) ![image-20231019110243967](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110243967.png) ![image-20231019110343772](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110343772.png) 报错的在dashboard的pom文件加上配置hystrix: dashboard: proxy-stream-allow-list: "*" ![image-20231019110737949](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110737949.png) ![image-20231019110801535](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110801535.png) ![image-20231019110811036](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110811036.png) ![image-20231019110844553](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110844553.png) #### 自己测试 启动7001、8004、9001 访问服务端监视流: [localhost:8004/actuator/hystrix.stream](http://localhost:8004/actuator/hystrix.stream) 访问客户端豪猪监控页面:[Hystrix Dashboard](http://localhost:9001/hystrix) 访问客户端接口:[localhost:9001/consumer/user/get/201722](http://localhost:9001/consumer/user/get/201722) 把监控流url复制到监控页面,进入即可查看豪猪熔断器界面,请求一次,就能看到绿色数量+1 ![image-20231020110755565](https://gitee.com/song-rice/upload-image/raw/master/image-20231020110755565.png) #### 怎么看监控 ![image-20231019110925701](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110925701.png) ![image-20231019110953696](https://gitee.com/song-rice/upload-image/raw/master/image-20231019110953696.png) ![image-20231019111007055](https://gitee.com/song-rice/upload-image/raw/master/image-20231019111007055.png) 出现错误请求时候: ![image-20231019111027052](https://gitee.com/song-rice/upload-image/raw/master/image-20231019111027052.png) 正常请求时候: ![image-20231019111047709](https://gitee.com/song-rice/upload-image/raw/master/image-20231019111047709.png) 自己测试:启动7001、8004、9001 看到监控![image-20231019134844094](https://gitee.com/song-rice/upload-image/raw/master/image-20231019134844094.png) ## Zuul路由网关 对请求的路由和过滤 路由:将请求转发到具体的微服务实例上,实现外部访问统一入口 过滤:对请求过程干预,实现请求年假欧燕,服务聚合 Zuul+Eureka 将Zuul注册为Eureka服务治理下的应用,同时从Eureka中获取其他微服务的消息, 以后访问微服务都是通过Zuul跳转后获得 ![image-20231020125550076](https://gitee.com/song-rice/upload-image/raw/master/image-20231020125550076.png) ![image-20231020125716875](https://gitee.com/song-rice/upload-image/raw/master/image-20231020125716875.png) 隐藏真实服务:www.kuang.com 访问的时候必须去通过路由跳转,不能直接访问真实服务 ![image-20231020130606233](https://gitee.com/song-rice/upload-image/raw/master/image-20231020130606233.png) 现在 注册中心 有5个微服务,每个微服务都有自己真实的地址,获取每个微服务需要访问每个服务的真实地址,很不方便 这时候,外面加一层 网关, 我只需要访问网关,网关去管理访问哪个真实服务 ![image-20231020131152587](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131152587.png) ![image-20231020131222742](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131222742.png) ![image-20231020131446509](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131446509.png) ### 模拟使用 - 新建zuul模块、导入依赖、端口9527 - hosts文件里增加一个域名 www.SongStudy.com - 启动类加注解,启用Zuul - 启动 7001、 8001、 9527 - 隐藏微服务名称,添加路由网关配置 ![image-20231020131537833](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131537833.png) ![image-20231020131719759](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131719759.png) ![image-20231020131740584](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131740584.png) ![image-20231020131834451](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131834451.png) ![image-20231020131935170](https://gitee.com/song-rice/upload-image/raw/master/image-20231020131935170.png) zuul9527被加载进来 ![image-20231020132118310](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132118310.png) 访问服务 ![image-20231020132226100](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132226100.png) ![image-20231020132233045](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132233045.png) ![image-20231020132323059](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132323059.png) 正常情况下,微服务实例名也需要隐藏: ![image-20231020132523992](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132523992.png) ![image-20231020132623364](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132623364.png) ![image-20231020132659678](https://gitee.com/song-rice/upload-image/raw/master/image-20231020132659678.png) 但是这样,原路径也能访问,现在想要所有请求都通过Zuul路由,所有禁用 ![image-20231020140223058](https://gitee.com/song-rice/upload-image/raw/master/image-20231020140223058.png) 设置公共访问统一前缀 ![image-20231020140430501](https://gitee.com/song-rice/upload-image/raw/master/image-20231020140430501.png) ![image-20231020140516581](https://gitee.com/song-rice/upload-image/raw/master/image-20231020140516581.png) ![image-20231020140655181](https://gitee.com/song-rice/upload-image/raw/master/image-20231020140655181.png) 自己测试: ![image-20231023140312316](https://gitee.com/song-rice/upload-image/raw/master/image-20231023140312316.png) ```java package com.song.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; /* zuul路由 相当于一个 provider,端口 9527 本质就是以后需要访问注册中心上的所有其他微服务时,统一访问入口,从zuul所在服务器上访问,zuul会路由到指定微服务上,从而获取结果 访问8004服务提供者服务: http://localhost:8004/user/get/201722 进化:通过统一zuul路由网关入口访问 1.访问95227路由网关服务: http://127.0.0.1:9527/springcloud-provider-user/user/get/201722 2.替换隐匿服务器ip,通过自定义域名 www.song.com 访问通过路由服务器跳转到的微服务 springcloud-provider-user: http://www.song.com:9527/springcloud-provider-user/user/get/201722 3。替换隐匿路径中的微服务实例名,通过自定义路径 /myuser 访问通过路由服务器跳转到的微服务 springcloud-provider-user:(配置微服务实例对应哪个路径) http://www.song.com:9527/myuser/user/get/201722 4.禁用通过微服务实例名访问(禁用1,2,配置ignored-services: "*"): 访问2的路径,发现访问不了,只能通过3来访问服务 5.路径添加公共路径前缀部分(/song): http://www.song.com:9527/song/myuser/user/get/201722 最终实现: 以后,访问微服务都通过zuul服务公共入口访问,且其他微服务的直接访问入口都关闭 */ @SpringBootApplication @EnableZuulProxy // 开启路由网关 public class ZuulApplication_9527 { public static void main(String[] args) { SpringApplication.run(ZuulApplication_9527.class,args); System.out.println("ZuulApplication_9527启动了!"); } } ``` ## Config配置中心 本质:配置管理中心,将配置文件都放到配置管理中心,微服务从配置管理中心去读自己的配置信息,否则一个微服务一个application.yml,上百个微服务模块上百个配置,改的人都要死了!!! ![image-20231023140609466](https://gitee.com/song-rice/upload-image/raw/master/image-20231023140609466.png) ![image-20231023140808965](https://gitee.com/song-rice/upload-image/raw/master/image-20231023140808965.png) ![image-20231023141104948](https://gitee.com/song-rice/upload-image/raw/master/image-20231023141104948.png) ![image-20231023141146454](https://gitee.com/song-rice/upload-image/raw/master/image-20231023141146454.png) ![image-20231023141618058](https://gitee.com/song-rice/upload-image/raw/master/image-20231023141618058.png) ### 服务端连接git 配置中心分为客户端,服务端,现在是先搭建服务端 3344, 本实例是通过 gitee 远程仓库包存储配置文件,也有其他方式,分为2步骤: 1. git环境搭建 - 新建git仓库,git clone xxx.springcloud-config.get 到本地 - 编辑application.yml , 配置 dev, test 分支,激活dev,提交配置文件到git 2. 服务端连接git配置 - 新建spring-cloud-config 3344模块 - 导入依赖 spring-cloud-config,spring-boot-stater-web , spring-cloud-starter-eueka - 编写配置 : 绑定git 上的 springcloud-config 远程配置中心 - 启动类开启配置服务: @EnabelConfigServer - 访问 : localhost:3344 404说明服务访问到了git仓库的springcloud-config服务,这时候访问application.yml,就可以读取到配置 ![image-20231023142052642](https://gitee.com/song-rice/upload-image/raw/master/image-20231023142052642.png) ![image-20231023142219502](https://gitee.com/song-rice/upload-image/raw/master/image-20231023142219502.png) ![image-20231023142935038](https://gitee.com/song-rice/upload-image/raw/master/image-20231023142935038.png) ![image-20231023144108109](https://gitee.com/song-rice/upload-image/raw/master/image-20231023144108109.png) ![image-20231023144126008](https://gitee.com/song-rice/upload-image/raw/master/image-20231023144126008.png) ![image-20231023144546700](https://gitee.com/song-rice/upload-image/raw/master/image-20231023144546700.png) ![image-20231023144807585](https://gitee.com/song-rice/upload-image/raw/master/image-20231023144807585.png) ![image-20231023145226862](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145226862.png) ![image-20231023145321044](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145321044.png) ![image-20231023145447542](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145447542.png) ![image-20231023145459190](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145459190.png) 可以通过其他方式访问配置文件: ![image-20231023145531591](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145531591.png) ![image-20231023145614350](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145614350.png) ![image-20231023145636996](https://gitee.com/song-rice/upload-image/raw/master/image-20231023145636996.png) #### 自己测试 ![image-20231024102152028](https://gitee.com/song-rice/upload-image/raw/master/image-20231024102152028.png) ![image-20231024102204589](https://gitee.com/song-rice/upload-image/raw/master/image-20231024102204589.png) ![image-20231024102213654](https://gitee.com/song-rice/upload-image/raw/master/image-20231024102213654.png) ### 客户端连接服务端 服务端3344准备好了,按在需要写客户端,客户端调用服务端,来获取到配置资源 1. 新建 config-client.yml客户端配置文件,push 到 git 的 springcloud-config 资源存储仓库中 2. 新建 配置中心客户端 moudle 3355, 调用 配置中心服务端 3344 来读取自己的配置 ![image-20231024103616544](https://gitee.com/song-rice/upload-image/raw/master/image-20231024103616544.png) ![image-20231024103724518](https://gitee.com/song-rice/upload-image/raw/master/image-20231024103724518.png) ![image-20231024103833685](https://gitee.com/song-rice/upload-image/raw/master/image-20231024103833685.png) ![image-20231024104010812](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104010812.png) 3355导入依赖 ![image-20231024104323140](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104323140.png) 建系统加载器 bootstrap.yml , 比 applicaiton.yml 用户级别加载器高级,保证和远程冲突依然这个生效 ![image-20231024104426168](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104426168.png) ![image-20231024104453208](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104453208.png) ![image-20231024104745434](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104745434.png) 测试获取![image-20231024104957925](https://gitee.com/song-rice/upload-image/raw/master/image-20231024104957925.png) ![image-20231024105013246](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105013246.png) 用处就是分布式系统庞大的配置信息内容可以直接写一个文件上传到Git仓库,然后项目远程调用配置文件 测试: 服务端连接远程,没有问题: ![image-20231024105036217](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105036217.png) ![image-20231024105108650](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105108650.png) 再测客户端连接服务端测试:远程配置文件设置端口是8201,这里可以改为 3355再试下 ![image-20231024105220431](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105220431.png) 改为访问远程test![image-20231024105347742](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105347742.png) 实现配置与编码解耦: 远程运维人员修改配置只需要改git上的配置文件就行,和代码没有关系 客户端连接服务端访问远程: ![image-20231024105453106](https://gitee.com/song-rice/upload-image/raw/master/image-20231024105453106.png) #### 自己测试 访问客户端,测试获取配置信息 端口改 3355,3356 ![image-20231024130448853](https://gitee.com/song-rice/upload-image/raw/master/image-20231024130448853.png) ### 远程配置实战 1. 编写远程配置: eureka、 provider、 consumer 2. 建立 eureka 、 provider 、consumer moudle eureka配置写入远程: springcloud-config 新建 config-eureka.yml ![image-20231024131700072](https://gitee.com/song-rice/upload-image/raw/master/image-20231024131700072.png) ![image-20231024131742186](https://gitee.com/song-rice/upload-image/raw/master/image-20231024131742186.png) ![image-20231024131805158](https://gitee.com/song-rice/upload-image/raw/master/image-20231024131805158.png) provider服务提供者配置写入远程: springcloud-config 新建 config-user.yml ![image-20231024131908703](https://gitee.com/song-rice/upload-image/raw/master/image-20231024131908703.png) ![image-20231024132002578](https://gitee.com/song-rice/upload-image/raw/master/image-20231024132002578.png) ![image-20231024132020891](https://gitee.com/song-rice/upload-image/raw/master/image-20231024132020891.png) ![image-20231024132032210](https://gitee.com/song-rice/upload-image/raw/master/image-20231024132032210.png) 新建springcloud-config-eureka-7001,copy原来的 7001项目 删除原来的 application.yml ,新建 bootstrap.yml 连接远程配置 ![image-20231024132139323](https://gitee.com/song-rice/upload-image/raw/master/image-20231024132139323.png) ![image-20231025103936984](https://gitee.com/song-rice/upload-image/raw/master/image-20231025103936984.png) ![image-20231025103531427](https://gitee.com/song-rice/upload-image/raw/master/image-20231025103531427.png) 测试读取eureka配置信息: ![image-20231025103648285](https://gitee.com/song-rice/upload-image/raw/master/image-20231025103648285.png) 说明我是谁![image-20231025104025739](https://gitee.com/song-rice/upload-image/raw/master/image-20231025104025739.png) 测试eureka有没有读到远程配置: ![image-20231025104328569](https://gitee.com/song-rice/upload-image/raw/master/image-20231025104328569.png) 新建config-8001 服务提供者moudle: copy 8001内容,原来的application.yml里面的配置不要了, 只声明自己是谁就好了,新建bootstrap.yml连接远程 ![image-20231025104401218](https://gitee.com/song-rice/upload-image/raw/master/image-20231025104401218.png) 导包: ![image-20231025104604156](https://gitee.com/song-rice/upload-image/raw/master/image-20231025104604156.png) ![image-20231025125758396](https://gitee.com/song-rice/upload-image/raw/master/image-20231025125758396.png) ![image-20231025125822154](https://gitee.com/song-rice/upload-image/raw/master/image-20231025125822154.png) ![image-20231026104707553](C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20231026104707553.png) 访问; ![image-20231026104806003](https://gitee.com/song-rice/upload-image/raw/master/image-20231026104806003.png) 在git上改配置,看访问数据库是否切换,来判断是否成功 ![image-20231026104912736](https://gitee.com/song-rice/upload-image/raw/master/image-20231026104912736.png) #### 自己测试 ![image-20231026132922323](https://gitee.com/song-rice/upload-image/raw/master/image-20231026132922323.png) 测试是否能访问到eureka的配置,启动config服务端3344:http://localhost:3344/application-dev.yml ![image-20231026125152466](https://gitee.com/song-rice/upload-image/raw/master/image-20231026125152466.png) 测试服务提供方是否能访问数据库 ![image-20231026133349719](https://gitee.com/song-rice/upload-image/raw/master/image-20231026133349719.png) 测试服务提供方提供的服务是否注册进入注册中心7001 ![image-20231026133718872](https://gitee.com/song-rice/upload-image/raw/master/image-20231026133718872.png) # 总结 ![image-20231026105722458](https://gitee.com/song-rice/upload-image/raw/master/image-20231026105722458.png) ![image-20231026110126673](https://gitee.com/song-rice/upload-image/raw/master/image-20231026110126673.png) ![image-20231026110524203](https://gitee.com/song-rice/upload-image/raw/master/image-20231026110524203.png) # 自己总结 ![image-20231026134842711](https://gitee.com/song-rice/upload-image/raw/master/image-20231026134842711.png) ![image-20231026142650912](https://gitee.com/song-rice/upload-image/raw/master/image-20231026142650912.png) ![image-20231026155441382](https://gitee.com/song-rice/upload-image/raw/master/image-20231026155441382.png)