Spring cloud

spring cloud

spring cloud 是一个工具集
集成多个工具,解决微服务中的各种问题
微服务全家桶
spring cloud不是什么
spring cloud不是一个解决 单一问题的工具

远程调用-RestTemplate
负载均衡-Ribbon
重试-Ribbon
降级、熔断、限流-Hystrix
监控-Hystrix Dashboard、Turbine、Sleuth
配置中心-Config server

简单demo搭建

01-commoms
02-item
03-user
04-order
1.工具类-不用自己写 gitee或者github搜索
2.TypeReference
指定转换类型:new TypeReference<List>(){}
3.@RequestBody
用来接收参数,从请求的协议体,完成接收协议体数据

05-eureka(微服务搭建)

1. eureka简单介绍

	1.注册
	**服务者提供者**启动时,向eureka一次次反复注册,知道注册成功为止
	 2.拉取注册表
	 **服务发现者**每30s拉取一次注册表(刷新注册表)
	 3.心跳
	 **服务提供者**每30s发送一次心跳数据
	 eureka连续**3次收不到**一个服务的心跳,会删除这个服务
	  4.自我保护模式(特殊情况)
	 如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式。在保护模式下,所有服务都不删除。
	 网络恢复后,可以自动退出保护模式,恢复正常。

服务的发现:一个服务想调用别的服务,先得到地址表,按照地址表的地址进行分配调用

2.搭建eureka服务器

		1.新建springboot项目
		2.添加eureka server依赖
		3.yml配置
			1.主机名(hostname)
			2.禁用保护模式(enable-self-preservation开发期间禁用)
			3.针对单台服务器(register-with-eureka单挑服务器不向自己注册,fetch-registry,单挑服务器不向自己拉取)
		4.启动类注解@EnableEurenaServer,通过注解触发自动配置

eureka和zookeeper的区别

eureka:
	强调AP:
	集群结构:
zookeeper:
	强调CP:一致性
	集群结构:主从结构

服务提供者(客户端连接eureka)

修改hosts文件,添加eureka1和eureka2的映射配置
02,03,04
1.添加eureka client依赖
  <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>
            spring-cloud-starter-netflix-eureka-client
        </artifactId>
    </dependency>
org.springframework.cloud spring-cloud-dependencies Hoxton.SR9 pom import 2.yml配置eureka的注册连接地址

eureka高可用

	配置多台服务器,减轻服务器压力,一个服务器宕机 另外的服务器还可以使用
	为什么向两台eureka发送信息:防止eureka宕机。

远程调用

RestTemplate
远程调用工具
类似于HttpClient,可以发送http请求,并处理响应。RestTemplate简化了Rest API调用,只需要使用他的一个方法,就可以完成请求,响应,json转化。
方法:
getForObject(url,转换的类型.class,提交的参数)
postForObject(url,协议体数据,转换的类型.class)

测试流程:
1.在application中创建RestTemplate实例,放入spring 容器
2.配置yml
3.Controller中

RestTemplate和Dubbo远程调用的区别:
RestTemplate:
1.http调用
2.效率低
Dubbo:
1.RPC的调用,java的序列化
2.效率高

Ribbon

Springcloud集成的工具,作用是负载均衡和重试。ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用

负载均衡
Ribbon对RestTemplate进行了封装,增强了RestTemplate的功能
1.从eureka获取地址表
2.轮询一个服务的主机地址列表
3.RestTemplate负责执行最终调用
添加负载均衡
1.ribbon依赖
2.@LoadBalance注解,对RestTemplate进行功能增强
3.修改调用地址,使用服务id,而不是具体的主机地址(请求地址修改成service-id,http://item-service/{1})

Ribbon重试
概念:一种容错机制,当调用远程服务失败,可以自动重试调用
添加重试:
1.添加spring-retry依赖
2.配置重试参数
在yml中配置(次数越少越好,一般为0,1)
MaxAutoRetries:单台服务器的
MaxAutoRetriesNextServer:更换服务器的次数
在java代码中设置
ConnecTimeout:与远程服务建立网络的超时时间
ReadTimeout:连接已建立,请求已发送,等待响应的超时时间
Spring cloud

Hystrix

系统容错工具
1.降级
1.1调用远程服务失败(宕机,500错,超时
),可以降级执行当前服务中的一段代码,向客户端返回结果
1.2快速失败
2.熔断
2.1当访问量过大,出现大量失败,可以过热保护,断开远程服务不再调用
2.2限流
2.3防止故障传播,雪崩效应

降级

	1.hystrix依赖
	2.启动类添加注解@EnableCircuitBreaker
	3.添加降级代码
@HystrixCommand(fallbackMethod="方法名")
远程调用方法(){
	restTemplate.getForObject(url,.....);
}

Hystrix超时
Hystrix有默认的超时时间:1s

Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效

设置:在yml文件中加入hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
Hystrix熔断
断路器打开的条件:
1.10s内20次请求
2.50%失败,执行了降级代码
断路器打开后,所有请求直接执行降级代码。断路器断开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用,如果调用成功,断路器可以自动关闭,恢复正常。如果调用仍然失败,继续保持打开状态几秒钟。
Hystrix故障监控 - Hystrix Dashboard
Hystrix利用Actuator工具,来暴露Hystrix的故障日志

Actuator
springboot提供的日志监控工具,可以暴露项目中多种监控信息
1.健康状态
2.系统环境变量
3.spring容器中所有的对象
4.springmvc映射的所有路径

添加actuator
1.添加actuator依赖
2.yml配置暴露监控数据
m.e.w.e.i="*" 暴露所有监控
m.e.w.e.i=health 只暴露健康状态
m.e.w.e.i=[“health”,“beans”,“mappings”] 暴露指定的多个监控

搭建Hystrix Dashboard
仪表盘项目是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
1.hystrix dashboard依赖
2.@EnableHystrixDashboard
3.yml - 允许对哪台服务器开启监控
hystrix:
dashboard:
proxy-stream

Fegin(代替hystrix+ribbon)

06demo远程调用:RestTemplate
ribbton
hystrix
集成工具
1.远程调用:声明式客户端
2.ribbon负载均衡和重试
3.hystrix降级和熔断

声明式客户端借口

只需要声明一个抽象接口,就可以通过接口做远程调用,不需要再使用RestTemplate来调用

//调用远程的商品服务,获取订单的商品列表
//通过注解,配置:
//1. 调用哪个服务
//2. 调用服务的哪个路径
//3. 向路径提交什么参数数据
@FeignClient(name="item-service")
public interface ItemClient{
	@GetMapping("/{orderId}")
	JsonResultM<List<Item>> getItems(@PathVariable String orderId);
}

在这里使用@GetMapping("/{orderId}"),指定的是向远程服务调用的路径

十五 feign + ribbon 负载均衡和重试
无需额外配置,feign默认启用了ribbon负载均衡和重试机制
重试的默认配置参数:
1.ConnectTimeout=1000
2.ReadTimeout=1000
3.MaxAutoRetries=0
4.MaxAutoRetriesNextServer=1

十六 虚拟机
1.启动虚拟机
2.登录
username:root
password:root(输入密码没反应,实际已经输入成功)

重置VMware虚拟网络
VMware的虚拟网络非常不稳定,经常出现问题
1.没有ip
2.没有网卡
3.一切正常,但ping不通

重置VMware虚拟网络环境:
删除所有的虚拟网卡,再重新创建,初始化**

网络
1.编辑-虚拟网络编辑器
2.点右下角“更改设置”获得管理员权限
3.左小角“还原默认设置”按钮

设置NAT网络网段,192.16.64.0
编辑-虚拟网络编辑器,选择VMnet8网卡,下面网段设置成192.168.64.0

设置centos7-1908的ip
在/root/主目录下准备了两个脚本程序: ip-static 和 ip-dhcp
里面修改网卡的配置文件 /etc/

cat ip-static
cat ip-dncp
#动态分配ip
./ip-dncp
ifconfig
#指定固定ip
./ip-static
ip:192.168.64.8

ipconfig
如果网络服务network.service无法启动,可能是和NetworkManager服务发生冲突,可以禁用Net

Rabbitmq虚拟机
1.从centos-7-1908克隆:rabbitmq
2.设置ip
./ip-static
ip:192.168.64.140
3.用mobaxterm连接rabbitmq
4.上传rabbitmq的离线安装文件
1.解压rabbitmq-install.zip
2.上传rabbitmq-install文件夹到/root/

Fegin集成Hystrix

feign默认不启动Hystrix,不推荐启用Hystrix

启用Hystrix基础配置
1.hystrix起步依赖
2.yml中配置启用hystrix
fegin.hystrix.enabled=true
3.启动类添加注解 @EnableCircuitBreaker

添加降级代码:

@FeignClient(name="item-service", fallback=降级类.class)
public interface ItemClient {
    @GetMapping("/{orderId}")
    JsonResult<List<Item>> getItems(@PathVariable String orderId);
}

降级类需要实现声明式客户端接口,在实现的抽象方法中添加降级代码,降级类需要添加 @Component 注解

错误:A bean with that name has already been defined in null and overriding is disabled.
原因: 这是由于我在同一个项目中用了相同的两个@FeignClient(“hello-service”)导致报错我在同一个项目中用了相同的两个@FeignClient(“hello-service”)导致报错

Fegin集成Hystrix,添加监控

  1. 添加 actuator 依赖
  2. 暴露 hystrix.stream 监控端点
  3. 查看监控日志
    1. 重启09
    2. 访问 http://localhost:3001/actuator/

端口被占用:
1.查看该端口的进程(我的是8080):netstat -ano|findstr 8080
2.kill该进程:taskkill /pid 14376 -f

订单中添加 feign,调用商品和用户

  1. 添加依赖
    • feign
    • hystrix
    • actuator
  2. yml
    • feign.hystrix.enabled=true
    • m.e.w.e.i=hystrix.stream
  3. 启动类注解
    • @EnableFeignClients
    • @EnableCircuitBreaker

主要步骤:1.依赖 2.yml 3.注解 4.远程调用接口 5.降级代码

Turbine

1.聚合 Hystrix 监控数据
2.连接多台服务器,抓取日志数据,进行聚合,
3.交给仪表盘在同一个监控界面进行展现

搭建 Turbine 服务

  1. 添加 Turbine、eureka client 依赖
  2. yml 配置
    • 聚合的服务id:order-service, aa, bb, cc
    • 为聚合的监控数据命名: cluster-name=new String(“default”)
  3. 启动类添加注解 @EnableTurbine

Zuul

API 网关

  • 微服务系统统一的调用入口
  • 统一的权限校验
  • 集成ribbon
  • 集成hystrix

统一的调用入口

  1. zuul 依赖、eureka client依赖、sp01
  2. yml
    # 配置调用转发规则
    # 下面是 zuul 默认的转发规则
    # 如果不手动配置,zuul可以根据注册表的注册信息进行自动配置
    zuul:
      routes:
        item-service: /item-service/**
        user-service: /user-service/**
        order-service: /order-service/**
    
  3. 启动类注解: @EnableZuulProxy

统一权限校验

通过 zuul 过滤器,可以判断用户是否有权限访问后台服务,如果没有权限可以阻止用户继续访问

判断用户是否登录,登录猜允许访问商品服务

http://localhost:3001/item-service/u45y45435 没有登录不允许访问

http://localhost:3001/item-service/u45y45435?token=y45343t4 有token认为登录过,允许访问

添加过滤器

  1. 继承 ZuulProxy
  2. 添加 @Component

zuul 集成 ribbon

默认启用了 ribbon 的负载均衡

默认不启用重试,zuul不推荐启用重试

启用重试:

  1. spring-retry 依赖

  2. yml

    zuul.retryable=true
    
  3. 重试参数

    有默认参数,可以根据需要进行调整

zuul 集成 hystrix

0配置,已经启用了hystrix
添加降级代码

  1. 实现 FallbackProvider 接口,在子类中实现降级代码
  2. @Component
    zuul的自动配置,会自动配置降级类

Zuul 和 Feign

  • 都可以调用后台服务

  • 都可以集成 ribbon

  • 都可集成 hystrix
    zuul

  • 部署在所有微服务项目之前

  • 网关一般是一个独立的服务,与业务无关

  • 不推荐启用重试

    会造成后台服务压力翻倍

    重试尽量不部署在最前面,越往后越好

**feign

  • 部署在微服务内部,服务和服务之间调用

  • 不推荐启用 hystrix

    一般在最前面进行降级和熔断,类似于电箱断路器,只在入户位置部署,

    不在微服务内部部署hystrix,否则会引起混乱
    **

准备仓库

  1. 新建module: config,当做一个文件夹,用来存放配置文件
  2. 把 2,3,4,11 项目的配置文件,放到 config 文件夹
  3. springcloud1 工程目录创建本地仓库
    1. VCS - Import into version control - Create git repository
    2. 选择 springcloud1 工程目录设置成本地仓库
  4. 把本地仓库提交推送到gitee远程仓库
    1. ctrl + k 或 VCS - commit
    2. 勾选要提交的文件,填写提交信息,点击提交
    3. ctrl+shift+k 或 VCS - git - push
    4. 点击左上角 define remote

配置中心

  1. config server 依赖
  2. yml
    远程仓库 uri: https://gitee.com/ningning1599510557/springcloud1
    搜索的子目录: config
    
    如果是私有仓库,还要提供用户名和密码
    
  3. @EnableConfigServer

rabbitmq工作模式

合理分发消息

  1. 通过回执,通知服务器消息处理完成

    • 通过回执,服务器可以知道消费者有没有处理完消息
  2. qos=1

    每次只从服务器抓取一条消息,这条消息处理完成之前,不会抓取下一条,

    必须在手动ACK模式下 qos设置才有效

消息持久化

防止服务器崩溃、重启造成消息丢失,需要把消息保存在磁盘

  1. 队列持久化

    c.queueDeclare(“队列名”, true, …

  2. 消息持久化

    c.basicPublish("", “队列名”, MessageProperties.PERSISTENT_TEXT_PLAIN, 消息)

配置中心客户端

修改 2,3,4,11 项目

  1. config client 依赖

  2. 新建配置文件: bootstrap.yml

    bootstrap.yml 是引导配置文件,它先于application.yml加载

  3. bootstrap.yml 添加配置

    1. 连接eureka, 从注册表得到配置中心的地址
    2. 连接配置中心
    3. 从配置中心下载指定的配置文件

总结

一个中心 -注册中心
两个基本点 -ribbon、hystrix
四个监控 - hystrix dashboard、turbine
feign、sleuth、zipkin
3个工具 - feign集成、zuul网关、config配置中心

上一篇:断路器Netflix Hystrix


下一篇:Soul 学习笔记---使用 hystrix 插件(十七)