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:连接已建立,请求已发送,等待响应的超时时间
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,添加监控
- 添加 actuator 依赖
- 暴露
hystrix.stream
监控端点 - 查看监控日志
- 重启09
- 访问 http://localhost:3001/actuator/
端口被占用:
1.查看该端口的进程(我的是8080):netstat -ano|findstr 8080
2.kill该进程:taskkill /pid 14376 -f
订单中添加 feign,调用商品和用户
- 添加依赖
- feign
- hystrix
- actuator
- yml
- feign.hystrix.enabled=true
- m.e.w.e.i=hystrix.stream
- 启动类注解
- @EnableFeignClients
- @EnableCircuitBreaker
主要步骤:1.依赖 2.yml 3.注解 4.远程调用接口 5.降级代码
Turbine
1.聚合 Hystrix 监控数据
2.连接多台服务器,抓取日志数据,进行聚合,
3.交给仪表盘在同一个监控界面进行展现
搭建 Turbine 服务
- 添加 Turbine、eureka client 依赖
- yml 配置
- 聚合的服务id:order-service, aa, bb, cc
- 为聚合的监控数据命名: cluster-name=new String(“default”)
- 启动类添加注解 @EnableTurbine
Zuul
API 网关
- 微服务系统统一的调用入口
- 统一的权限校验
- 集成ribbon
- 集成hystrix
统一的调用入口
- zuul 依赖、eureka client依赖、sp01
- yml
# 配置调用转发规则 # 下面是 zuul 默认的转发规则 # 如果不手动配置,zuul可以根据注册表的注册信息进行自动配置 zuul: routes: item-service: /item-service/** user-service: /user-service/** order-service: /order-service/**
- 启动类注解: @EnableZuulProxy
统一权限校验
通过 zuul 过滤器,可以判断用户是否有权限访问后台服务,如果没有权限可以阻止用户继续访问
判断用户是否登录,登录猜允许访问商品服务
http://localhost:3001/item-service/u45y45435 没有登录不允许访问
http://localhost:3001/item-service/u45y45435?token=y45343t4 有token认为登录过,允许访问
添加过滤器
- 继承 ZuulProxy
- 添加 @Component
zuul 集成 ribbon
默认启用了 ribbon 的负载均衡
默认不启用重试,zuul不推荐启用重试
启用重试:
-
spring-retry 依赖
-
yml
zuul.retryable=true
-
重试参数
有默认参数,可以根据需要进行调整
zuul 集成 hystrix
0配置,已经启用了hystrix
添加降级代码
- 实现 FallbackProvider 接口,在子类中实现降级代码
- @Component
zuul的自动配置,会自动配置降级类
Zuul 和 Feign
-
都可以调用后台服务
-
都可以集成 ribbon
-
都可集成 hystrix
zuul -
部署在所有微服务项目之前
-
网关一般是一个独立的服务,与业务无关
-
不推荐启用重试
会造成后台服务压力翻倍
重试尽量不部署在最前面,越往后越好
**feign
-
部署在微服务内部,服务和服务之间调用
-
不推荐启用 hystrix
一般在最前面进行降级和熔断,类似于电箱断路器,只在入户位置部署,
不在微服务内部部署hystrix,否则会引起混乱
**
准备仓库
- 新建module: config,当做一个文件夹,用来存放配置文件
- 把 2,3,4,11 项目的配置文件,放到 config 文件夹
- springcloud1 工程目录创建本地仓库
- VCS - Import into version control - Create git repository
- 选择 springcloud1 工程目录设置成本地仓库
- 把本地仓库提交推送到gitee远程仓库
- ctrl + k 或 VCS - commit
- 勾选要提交的文件,填写提交信息,点击提交
- ctrl+shift+k 或 VCS - git - push
- 点击左上角 define remote
配置中心
- config server 依赖
- yml
远程仓库 uri: https://gitee.com/ningning1599510557/springcloud1 搜索的子目录: config 如果是私有仓库,还要提供用户名和密码
- @EnableConfigServer
rabbitmq工作模式
合理分发消息
-
通过回执,通知服务器消息处理完成
- 通过回执,服务器可以知道消费者有没有处理完消息
-
qos=1
每次只从服务器抓取一条消息,这条消息处理完成之前,不会抓取下一条,
必须在手动ACK模式下 qos设置才有效
消息持久化
防止服务器崩溃、重启造成消息丢失,需要把消息保存在磁盘
-
队列持久化
c.queueDeclare(“队列名”, true, …
-
消息持久化
c.basicPublish("", “队列名”, MessageProperties.PERSISTENT_TEXT_PLAIN, 消息)
配置中心客户端
修改 2,3,4,11 项目
-
config client 依赖
-
新建配置文件: bootstrap.yml
bootstrap.yml 是引导配置文件,它先于application.yml加载
-
bootstrap.yml 添加配置
- 连接eureka, 从注册表得到配置中心的地址
- 连接配置中心
- 从配置中心下载指定的配置文件
总结
一个中心 -注册中心
两个基本点 -ribbon、hystrix
四个监控 - hystrix dashboard、turbine
feign、sleuth、zipkin
3个工具 - feign集成、zuul网关、config配置中心
’