栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于SpringCloud,我肝了7万字

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于SpringCloud,我肝了7万字

目录

概述 

一、业务场景介绍

                  微服务cloud整体聚合父工程Project 

父工程的pom

                  子模块

         微服务提供者支付模块:cloud-provider-payment8001 

         微服务消费者订单模块cloud-consumer-order80

         工程重构 

二、SpringCloud核心组件:Eureka

                  单机Eureka构建步骤—IDEA生成EurekaServer服务注册中心

将Client端8001注册进入EurekaServer成为服务提供者

将EurekaClient端80注册进EurekaServer成为服务消费者

Eureka集群 

支付服务提供者集群环境 

actuator微服务信息完善

服务发现Discovery

​​​​​​Eureka自我保护机制

                  Zookeeper服务注册与发现

                  Consul服务注册与发现

三、SpringCloud核心组件:Feign

         OpenFeign服务接口调用 

         OpenFeign超时控制 

         OpenFeign日志增强

四、SpringCloud核心组件:Ribbon

         入门案例 

         RestTemplate的使用

         Ribbon核心组件IRule接口

         Ribbon负载均衡—轮询算法

五、SpringCloud核心组件:Hystrix

         Hystrix案例

下面新建80消费微服务,测试在高并发环境下,通过客户端来访问,结果会怎样?

         服务降级(分别从微服务提供者和消费者进行)

         服务熔断

         服务监控HystrixDashboard

六、SpringCloud核心组件:Zuul

七、总结:

概述 

毫无疑问,SpringCloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术,不过大多数讲解还停留在对Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓,因此本文将通过大量的手绘图,给大家谈谈SpringCloud微服务架构的底层原理。

实际上,SpringCloud是一个全家桶式的技术栈,包含了很多的组件,本文先从其最核心的几个组件入手,来剖析一下其底层的工作原理,也就是Eureka、Ribbon、Feign、Hystrix、Zuul这几个组件,并结合实战演示,帮助大家更深的理解!

注:本文转载于:拜托!面试请不要再问我Spring Cloud底层原理 - 掘金

只是对其增加了案例演示,方便自我学习,案例来自于尚硅谷SpringCloud!

一、业务场景介绍

先来给大家说一个业务场景,假设我们现在要开发一个电商网站,要实现支付订单的功能,流程如下:

  • 创建一个订单后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付”
  • 扣减相应的商品库存
  • 通知仓储中心,进行发货
  • 给用户的这次购物增加相应的积分

针对上述流程,我们需要有订单服务、库存服务、仓储服务、积分服务。整个流程的大体思路如下:

  • 用户针对一个订单完成支付之后,就会去找订单服务,更新订单状态
  • 订单服务调用库存服务,完成相应功能
  • 订单服务调用仓储服务,完成相应功能
  • 订单服务调用积分服务,完成相应功能

至此,整个支付订单的业务流程结束

下图这张图,清晰表明了各服务间的调用过程:

好!有了业务场景之后,咱们就一起来看看SpringCloud微服务架构中,这几个组件是如何相互协作、各自发挥的作用的,最后刨析其背后的原理! 


实战演示 

微服务cloud整体聚合父工程Project 

1.选择模板新建project

2.进行一些配置

 3.File Type过滤

父工程的pom

删除src目录,并在pom文件中添加

pom

父工程整个pom文件




  4.0.0

  com.IT.springcloud
  SpringCloud01
  1.0-SNAPSHOT
  
    cloud-provider-payment8001
  
  pom 

  
  
    UTF-8
    1.8
    1.8
    4.12
    1.16.18
    1.2.17
    5.1.47
    1.1.16
    1.3.0
  
  
  

    
      
        org.apache.maven.plugins
        maven-project-info-reports-plugin
        3.0.0
      
      
      
        org.springframework.boot
        spring-boot-dependencies
        2.2.2.RELEASE
        pom
        import
      
      
      
        org.springframework.cloud
        spring-cloud-dependencies
        Hoxton.SR1
        pom
        import
      
      
      
        com.alibaba.cloud
        spring-cloud-alibaba-dependencies
        2.1.0.RELEASE
        pom
        import
      
      
      
        mysql
        mysql-connector-java
        ${mysql.version}
        runtime
      
      
      
        com.alibaba
        druid
        ${druid.version}
      
      
      
        org.mybatis.spring.boot
        mybatis-spring-boot-starter
        ${mybatis.spring.boot.version}
      
      
      
        junit
        junit
        ${junit.version}
      
      
      
        log4j
        log4j
        ${log4j.version}
      
    

  
  
  
    
      
        org.springframework.boot
        spring-boot-maven-plugin
        
          true
          true
        
      
    
  

子模块

步骤:

  1. 建module
  2. 改pom
  3. 写yml
  4. 主启动类
  5. 业务类
  6. 测试

微服务提供者模块:cloud-provider-payment8001 

1.新建模块(省略)

2.在pom文件中添加依赖



    
        SpringCloud01
        com.IT.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloud-provider-payment8001

    
        8
        8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
        
        
            com.alibaba
            druid-spring-boot-starter
            1.1.20
            
        
        
        
            mysql
            mysql-connector-java
        
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

3. 写yml

在resources目录下新建application.yml配置文件

# 微服务建议一定要写服务端口号和微服务名称
server:
  # 端口号
  port: 8001

spring:
  application:
    # 微服务名称
    name: cloud-payment-service
  # 数据库配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql5.x的没有cj
    driver-class-name: com.mysql.jdbc.Driver
    # 记得先创建数据库
    url: jdbc:mysql://localhost:3306/db2021
    username: root
    password: 123456

# mybatis配置
mybatis:
  mapper-locations: classpath:mapper
    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet() ;
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadonStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return  registrationBean;
    }

3.启动监控测试

  • 启动一个Eureka7001
  • 9001监控8001,填写监控地址:http://localhost:8001/hystrix.stream,进入监控窗口
  • 浏览器地址栏输入:localhost:8001/payment/circuit/1,localhost:8001/payment/circuit/-1,测试正确请求时:

 当访问请求总次数达到一定阈值和请求错误次数达到一定百分比时,断路器开启:

六、SpringCloud核心组件:Zuul

说完了Hystrix,接着给大家说说最后一个组件:Zuul,也就是微服务网关,这个组件是负责网络路由的,不懂网络路由吗?行,那我给你说说,如果没有Zuul的日常工作会怎样?

假设你后台部署了几百个服务,现在有个前端兄弟,人家请求是直接从浏览器那儿发过来的,打个比方:人家要请求一下库存服务,你难道还让人家记着这服务的名字叫做inventory-service?部署在5台机器上?就算人家肯记住这一个,你后台可有几百个服务的名称和地址呢?难不成人家请求一个,就得记住一个?你要这样玩儿,那真是友谊的小船,说翻就翻!

上面这种情况,压根儿是不现实的,所以一般微服务架构中都必然会设计一个网关在里面,像android、ios、pc前端、微信小程序、H5等等,不用去关心后端有多少个服务,就只知道有一个网关,所有请求都往网关这里走,网关会根据请求中的一些特征,将请求转发给后端的各个服务,而且有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全等!


关于网关的演示案例可以看:https://blog.csdn.net/qq_45769329/article/details/121118878

七、总结:

最后再来总结一下,上述几个SpringCloud核心组件,在微服务架构中分别扮演的角色:

  • Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
  • Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
  • Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
  • Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
  • Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

以上就是我们通过一个电商业务场景,阐述了Spring Cloud微服务架构几个核心组件的底层原理,文字总结还不够直观?没问题!我们将SpringCloud的5个核心组件通过一张图串联起来,再来直观的感受一下其底层的架构原理:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/489011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号