6、SpringCloud微服务项目构建(Eureka、Ribbon、Hystrix、Feign、Zuul、Hystrix dashboard、Turbine、Config)_caomushi的博客-程序员宅基地

技术标签: 微服务  springcloud  

环境

IDEA+SpringBoot-2.3.1.RELEASE+SpringCloud-Hoxton.RELEASE

SpringCloud介绍

  • 框架集合,将其他公司的框架组合,通过SpringBoot简化配置
  • 服务发现注册(Eureka),微服务治理,服务注册和发现
  • 配置中心(Config),集中管理配置文件
  • 消息总线(Bus),消息总线, 配置刷新
  • 负载均衡(Ribbon),负载均衡、请求重试
  • 断路器(Hystrix),服务降级、熔断
  • 数据监控(Hystrix dashboard、Turbine)
  • 声明式客户端(Feign),Ribbon + Hystrix 集成,在微服务之间调用
  • API网关(Zuul,Gateway),提供微服务的统一入口,并提供统一的权限验证
  • 链路跟踪(Sleuth+Zipkin)
    在这里插入图片描述

SpringCloud与Dubbo对比

在这里插入图片描述

  • Dubbo
    • Dubbo只是一个远程调用(RPC)框架
    • 默认基于长连接,支持多种序列化格式
  • Spring Cloud
    • 框架集
    • 提供了一整套微服务解决方案(全家桶)
    • 基于http调用, Rest API
  • 注册中心对比(Zookeeper和Eureka)
    • Zookeeper(Dubbo)
      • 集群分主从节点,主节点宕机需要重新选举,需进行主从同步数据
      • 保证数据一致性,分区一致性,即CP;当节点无法连接时,删除节点注册信息
    • Eureka(SpringCloud)
      • 节点之间对等部署,不分主从,相互注册
      • 保证服务可用性,分区一致性,即AP;当节点无法连接时,保留节点注册信息

分布式服务的CAP原则

  • RDBMS ==>(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性。C:一致性。I:独立性。D:持久性。)。

  • NoSql ==> (redis,Mogodb等非关系型数据库)遵循的原则是:CAP原则(C:强一致性。A:可用性。P:分区容错性)。

在分布式领域有一个很著名的CAP定理C:数据一致性A:服务可用性P:分区容错性(服务对网络分区故障的容错性)。
在这个特性中任何分布式系统只能保证两个。

环境搭建

我将工程中的SpringCloud缩写成了sc,反正项目工程和模块名称自己定义

  • 工具类,sc-common
  • 商品服务,sc-item-service,8001
  • 用户服务,sc-user-service,8101
  • 订单服务,sc-order-service,8201,(使用Feign调用其他微服务)
  • 注册中心,sc-eureka,2001
  • API网关服务,sc-zuul,3001,(集成了Ribbon和Hystrix)
  • 数据监控,sc-hystrix-dashboard,4001
  • 监控数据聚合,sc-turbine,5001
  • 配置中心,sc-config,6001

PS:项目中就不创建测试Ribbon、Hystrix、Feign这三个模块了,其他项目中会用到,如果需要了解它们的工作过程,可以参考文档末尾我参考的博客,所有过程都有,非常详细

父项目搭建

1、创建项目工程,选Spring Initializr
2、修改项目信息,名称、JDK版本
3、依赖选择SpringCloud,Cloud BootStrap
4、修改依赖版本,SpringBoot2.3.1(我前两天创建还可以选择,现在没了,推荐2.3.3了,可以直接使用此版本创建或者工程建好以后在pom中修改)
5、修改父工程的pom文件,SpringBoot版本(2.3.1.RELEASE)和SpringCloud版本(Hoxton.RELEASE),将SpringBoot编译配置标签注释掉,父工程不需要,子项目才会用到
6、新建的工程已经推荐2.3.3和Hoxton.SR7了,我在使用SR7的时候,后面的子项目使用Hystrix dashboard时,无法拿到端点数据,网上搜了一短时间没找到解决方案,我又降到Hoxton.RELEASE

sc-common工具类子项目

1、创建一个普通的Maven模块
2、配置pom添加依赖
3、创建自己的包路径,新建相关service接口、pojo对象、util工具类及返回值封装类

详细创建过程及代码

sc-item-service商品子项目

1、创建一个普通的Maven模块
2、配置pom文件
3、创建启动类、controller、service方法、yml配置文件
在这里插入图片描述

详细创建过程及代码

sc-user-service用户子项目

1、创建普通Maven模块
2、配置pom文件
3、创建启动类、controller、service方法、yml配置文件

详细创建过程及代码

sc-order-service订单子项目

1、创建普通Maven模块
2、修改pom文件
3、启动类、controller、service
4、Feign声明客户端调用接口及降级处理类
5、yml配置

  • Feigin的作用

    • 集成Ribbon负载均衡与重试,Hystrix降级与熔断
    • 声明式客户端,用于微服务之间调用
  • 业务服务的调用关系
    在这里插入图片描述

  • Ribbon负载均衡和重试
    ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用

    • RestTemplate
      RestTemplate 是StringBoot提供的一个Rest远程调用工具
      它的常用方法:
      • getForObject() - 执行get请求
      • postForObject() - 执行post请求
    • 之前的系统结构是浏览器直接访问后台服务
      在这里插入图片描述
    • 通过Ribbon调用
      在这里插入图片描述

在这里插入图片描述
单独使用Ribbon时,超时时间在yml中配置不生效,Feign与Zuul集成以后可以直接在配置文件中配置

  • Hystrix断路器的熔断与降级
    在这里插入图片描述

详细创建过程及代码

sc-eureka注册中心子项目

1、创建普通Maven模块
2、配置pom文件
3、启动类、yml配置文件
4、服务提供者需要在各自的项目中引入eureka依赖,并向eureka服务器注册信息

配置文件中以域名向eureka中注册信息,要在系统文件hosts文件中添加域名
在这里插入图片描述

  • eureka 集群服务器之间,通过 hostname 来区分
  • eureka.server.enable-self-preservation
    eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了低于的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务
  • eureka.client.register-with-eureka=false
    不向自身注册
  • eureka.client.fetch-registry=false
    不从自身拉取注册信息
  • eureka.instance.lease-expiration-duration-in-seconds
    最后一次心跳后,间隔多久认定微服务不可用,默认90

详细创建过程及代码

sc-zuul API网关子项目

1、创建普通Maven模块
2、配置pom文件
3、启动类、过滤器、降级方法
4、yml配置文件
在这里插入图片描述
zuul请求过滤

在这里插入图片描述

详细创建过程及代码

sc-hystrix-dashboard数据监控子项目

1、创建普通Maven模块
2、pom文件配置
3、启动类
4、yml配置文件
5、待监控服务添加actuator依赖,暴漏hystrix 监控端点
6、Hystrix dashboard 仪表盘监控数据
7、访问仪表盘网页,输入监控点路径,观察状态
在这里插入图片描述
在这里插入图片描述
详细创建过程及代码

sc-turbine监控数据聚合子项目

1、创建普通Maven模块
2、pom配置文件
3、启动类
4、yml配置文件
在这里插入图片描述
hystrix dashboard 一次只能监控一个服务实例,使用 turbine 可以汇集监控信息,将聚合后的信息提供给 hystrix dashboard 来集中展示和监控

详细创建过程及代码

sc-config配置中心子项目

1、创建普通Maven模块
2、配置pom文件
3、启动类
4、yml配置文件
5、将其他业务子项目的yml配置文件,存到GitHub中

  • item-service-dev.yml
  • user-service-dev.yml
  • order-service-dev.yml
  • zuul-dev.yml

和本地配置文件内容一样,只是名称不同
PS:配置中心读取的配置文件无法获取到spring.profiles属性

6、在其他业务子项目中添加bootstrap.yml配置文件
不同的服务修改一下name属性

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server
      name: user-service
      profile: dev

eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka

在这里插入图片描述
PS:默认配置中心配置优先级高,配置中心配置会覆盖客户端的所有配置,包括命令行参数配置,这样我们添加的集群配置中配置的端口号启动参数会无效,一般正式环境基本都是一个服务一台机器,不会存在这种问题,开发测试机器不够所以需要一个服务分不同端口启动达到集群效果

禁止配置中心的配置信息覆盖客户端配置

spring:
  cloud:
    config:
      override-none: true
  • 配置刷新
    spring cloud 允许运行时动态刷新配置,可以重新从配置中心获取新的配置信息
    以 user-service 为例演示配置刷新
    • user-service中添加actuator依赖
    • 暴露 refresh 端点
    management:
      endpoints:
        web:
          exposure:
            include: refresh
    
    • UserServiceImpl 添加 @RefreshScope 注解
      只允许对添加了 @RefreshScope 或 @ConfigurationProperties 注解的 Bean 刷新配置,可以将更新的配置数据注入到 Bean 中
    • 修改GitHub仓库中user-service配置文件中的自定义用户属性
    • 使用postman访问刷新端点,刷新配置
    • 访问user-service,查看更新

详细创建过程及代码

参考文档
1、https://blog.csdn.net/weixin_38305440/article/details/102775484
2、https://blog.csdn.net/java_xth/article/details/82621776

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caomushi/article/details/108031638

智能推荐

随便推点