【十二】一杯敬大佬,一杯敬SpringCloud

《小吴同学的SpringCloud学习之路》

1.微服务概述

1.1到底是啥子

注:没有明确定义,提倡将单一的应用程序划分成一组小的服务。

  • 传统的开发 All in one 单机系统 可以看作eclipse里一个大工程
    • 同一工作空间只有一个工程
  • 分布式系统
    • 拆分
    • 各自独立的进程
  • 微服务(类似医院的各个科室,每个科室做专门的治疗)
    • 看似eclipse里maven开发的一个个小module

2.SpringCloud(微服务全家桶)

2.1 这又是啥黑人问号???

基于SpringBoot提供了一套解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。
包括:配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
SpringBoot:提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
SpringCloud:简而言之,分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称微服务全家桶。

2.2 SpringBoot VS SpringCloud

SpringBoot相当于医院里的科室,SpringCloud相当于组合成的医院。
SpringCloud一定依赖SpringBoot,但反之SpringBoot可以离开SpringCloud独立使用开发项目。(水里可以没有鱼,但鱼离不开水。哇好虐有木有==.==)

  • SpringBoot
    • 专注快速方便的开发单个个体微服务
  • SpringCloud
    • 关注全局的微服务协调整理治理框架,它将SpringBoot开发的单个个体微服务整合并管理起来,为各个微服务之间提供一整套的服务。

2.2 Dubbo VS SpringCloud

社区支持与更新力度: Github项目活跃度SpringCloud比前者活跃多了。
Dubbo的定位始终是一款RPC框架。
SpringCloud抛弃了Dubbo的Rpc通信,采用的是基于HTTP的REST方式。


图2.2.1 Dubbo与SpringCloud对比

图2.2.2 品牌机与组装机的区别

3.项目走起来

3.1 总父工程项目

  • microservicecloud

3.2 通用模块

  • microservicecloud-api

3.3 子工程-----部门服务提供者

  • microservicecloud-provider-dept-8001

3.4 子工程-----部门服务消费者

  • microservicecloud-consumer-dept-80

4.门神Eureka(服务注册与发现)

  • 4.1 是什么东东(C/S结构)


    图4.1 Eureka是什么
  • 4.2 三大角色作用


    图4.2 三大角色
  • 4.3 子工程-Eureka服务注册中心
    • 4.3.1.新建子工程microservicecloud-eureka-7001


      图4.3.1 Eureka跑起来
    • 4.3.2.将部门提供者服务注册到Eureka中

(1)修改Pom.xml文件
添加 spring-cloud-starter-eureka、spring-cloud-starter-config两个Maven坐标
(2)修改application.yml文件
将客户端注册进eureka服务列表内
(3)修改主启动类
添加@EnableEurekaClient注解
(4)修改暴露的部门服务的别名,显示ip及info构建

  instance:
 instance-id: microservicecloud-dept8001
    prefer-ip-address: true #访问路径可以显示IP地址 ,鼠标点上去左下角有ip

图4.3.2 修改服务别名

info构建:修改主工程Pom.xml添加build信息,使其识别src/main/resources下带project.artifactId,在部门的yml配置文件中添加Info构建信息,在部门服务提供者的pom文件添加actuator监控信息完善Maven坐标。
图4.3.3 info内容构建

  • 4.4 Eureka自我保护

某时刻某一个服务不可用了,eureka不会立刻清理,依旧会对该服务的信息进行保存。(好死不如赖活着!!!)


图4.4.1 Eureka故障现象超时

图4.4.2 Eureka故障现象宕机

关闭自我保护:在EurekaServer中设置(墙裂不建议)
server:
enable-self-preservation: false

  • 4.5 Eureka服务发现

主启动类@EnableDiscoveryClient
@Autowired private DiscoveryClient client;

  • 4.6 Eureka集群配置

    • 三个microservicecloud-eureka-7001、microservicecloud-eureka-7002、microservicecloud-eureka-7003yml中配置,部门服务提供者的yml配置文件加上三个eureka-server的地址。
    • C:\Windows\System32\drivers\etc 添加域名映射。验证ping eureka7001.com能ping通代表配置无误。(注:代理添加这三个不走代理)


      图4.6.1 集群配置测试7001
  • 4.7 Eureka VS Zookeeper

    • Eureka保证A(可用性)P,Zookeeper保证C(一致性)P。
    • Eureka可以很好应对网络故障导致部分节点失去联系的情况,而不会像Zookeeper那样使整个注册服务瘫痪。

5.Ribbon负载均衡

  • 客户端 负载均衡的工具。


    图5.1 Ribbon工作图解
  • 如何理解:你去超市收银处 你一定会选择人少的那排吧。就是你作为消费者为考虑去哪消费。

  • 5.1 配置
    因为是客户端负载均衡,所以需要修改消费者microservicecloud-consumer-dept-80项目的相关配置信息。
    (1)pom添加相应的ribbon相关Maven坐标。
    (2)将消费者注册进Eureka中,当然 不向注册中心注册自己。
    (3)ConfigBean中添加负载均衡注解。
    (4)主启动类添加作为@EnableEurekaClient
    (5)修改Controller要找的服务信息直接为部门服务者对外暴露的服务名称。

  • 5.2 Ribbon负载均衡体验升级
    (1)拷贝多个部门服务提供者分别为microservicecloud-provider-dept-8001、microservicecloud-provider-dept-8002、microservicecloud-provider-dept-8003,修改相应的主启动类名称(没别的意义仅作视觉区分);
    (2)修改相应的yml配置文件,端口、数据库信息、除了注册Eureka中的服务microservicecloud-dept(三个均一样)

  • 5.3 Ribbon核心组件IRule(很重要!!!)
    先说一些常用的负载均衡策略,如下所示:


    图5.3.1 常用的询查规则
    • 5.3.1 配置常用的Ribbon负载均衡策略
      (1)在configBean中return new RandomRule();

    • 5.3.2 自定义Ribbo的负载均衡策略
      (1)自定义一个新的配置类,切记一个坑:对于Ribbon的配置必须用@Configuration注解标识,并且不能被@Component注解或者@SpringBootApplication(因为里面包含了@Component)扫描到。因为如果被@ComponetScan扫描到会导致所有的RibbonClient都去共享这个配置。
      (2)自定义的负载均衡策略RandomRule_WQ extends AbstractLoadBalancerRule,里面的choose()方法很重要可以自定义策略,比如我这实现的是每台机器5次。

6.Feign负载均衡

  • Feign是啥
    它是一个声明式WebService客户端 (具体网上搜,我就略略略了)。Feign可以与Eureka和Ribbon组合使用以实现负载均衡。只需要创建一个接口,然后在上面添加注解即可。
    Feign通过接口的方法调用服务(之前是Ribbon+RestTemplate),该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用。

  • 建立microservicecloud-consumer-dept-feign

    • (1)在Pom文件中加上Feign相关的Maven坐标
      (2)api通用模块中也加上Feign相关的Maven坐标,以及新建一个接口DeptClientService,且添加@FeignClient(value = "MICROSERVICECLOUD-DEPT")
      (3)在feign子工程中新建controller注入api通用模块中定义的DeptClientService
      (4)feign子工程中主启动类上面添加

       @EnableFeignClients(basePackages= {"com.wq.springcloud"})
       @ComponentScan("com.wq.springcloud") 
      

7.Hystrix断路器

  • 处理分布式系统延迟和容错的开源库。它能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

  • “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路哭的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

  • 7.1 服务熔断:熔断某个故障节点微服务的调用,快速返回“错误”的响应信息。

    • (一般是某个服务故障或者异常引起,类似现实中的“保险丝”,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时。)

新建microservicecloud-provider-dept-hystrix-8001
(1)Pom文件添加Hystrix的Maven坐标;
(2)在yml配置文件中修改实例名称为microservicecloud-dept8001-hystrix;
(3)在Controller层get()方法修改如果查询部门为空时,抛出一个异常,并在方法上添加@HystrixCommand(fallbackMethod = "getErrorDeptByHystrix"),并定义getErrorDeptByHystrix()方法;
(4)主启动类标明对hystrix熔断机制的支持@EnableCircuitBreaker。

  • 7.2 服务降级(在客户端完成的降级跟服务端没有关系)
    • 所谓降级,一般是从整体负荷考虑。就是当某个服务熔断之后,服务器将不再被调用。此时客户端可以自己准备一个本地的fallback回调,返回一个缺少值。这样做,虽然服务水平下降,但好歹可用,比直接挂掉要强。

(1)修改api的DeptClientService接口,根据已有的DeptClientService接口新建一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory(切记:一定要添加@Component)。(解耦)

(2)在客户端消费者microservicecloud-consumer-dept-feign修改yml配置文件开启服务降级功能。

  • 7.3 豪猪hystrixDashboard

新建子模块:microservicecloud-consumer-hystrix-dashboard
(1)Pom文件添加hystrix和 hystrix-dashboard相关Maven坐标;
(2)配置文件中端口号设为9001;
(3)主启动类添加@EnableHystrixDashboard
访问http://localhost:9001/hystrix,出现如下画面,(初遇豪猪)

图7.3.1 豪猪监控配置

添加相应的监控信息,点击监控查看服务调用情况,如下所示:
图7.3.2 豪猪监控信息

8.SpringCloud_Zuul

  • Zuul包含了对请求的路由和过滤两个最主要的功能:其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
  • 注意:Zuul服务最终还是会注册进Eureka。
  • 提供=代理+路由+过滤三大功能

新建子模块microservicecloud-zuul-gateway-9527
(1)hosts文件添加域名映射关系 myzuul.com
(2)添加Zuul相关的Maven坐标;
(3)yml配置文件中设置微服务名microservicecloud-zuul-gateway以及暴露的实例名称为gateway-9527.com以及设置路由访问的映射规则(添加前缀,以及忽略原来可用的让它不可用)
(4)主启动类添加@EnableZuulProxy


图8.1 最终测试运行

💙注: 本文长期更新。此笔记纯个人学习记录整理,如有错误之处,欢迎指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容