Spring Cloud
环境:
1、IDEA或Eclipse(STS插件)
2、LomBok
3、Maven
如果下载依赖有问题,更换阿里仓库和中央仓库
Spring Cloud是什么
Spring Cloud是一个工具集
1、集成多个工具,来解决微服务中的各种问题
2、微服务全家桶
Spring MVC 前端控制
Mybatis 封装JDBC
Spring Cloud不是什么
1、Spring Cloud不是一个解决单一问题的工具
远程调用 RestTemplate
负载均衡 Ribbon
重试 Ribbon
降级、熔断、限流 Hystrix
监控 Hystrix DashBoard、Turbine、Sleuth、Zipkin
配置中心 Config server
课程要求
必须严格按照笔记做
笔记中都是完整代码
做的过程中不能直接cv,要自己手敲
业务模块
02-item
03-user
04-order
1、工具类 - 不用自己写,在gitee或github搜索
CookieUtil、JsonUtil、JsonResult
2、TypeReference
指定转换的类型:new ThypeReference>(){}
3、@RequestBody
用来接收参数,从请求的协议体,完整接收协议体数据
注册和发现
注册中心产品:
zookeeper、eureka、nacos、consul、etcd...
eureka
1、注册
服务提供者启动时,向eureka一次次反复注册,直到注册成功为止
2、拉取注册表
服务发现者每30秒拉取一次注册表(刷新注册表)
3、心跳
服务发现者每30秒发送一次心跳数据
eureka连续3次收不到一个服务的心跳,会删除这个服务
4、自我保护模式
特殊情况
如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式
在保护模式下,所有服务都不删除
网络恢复后,可以自动退出保护模式,恢复正常
开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式
eureka和zookeeper区别
eureka:
- 强调AP(可用性)
- 集群结构:对等结构
zookeeper:
- 强调CP(一致性)
- 集群结构:主从结构
搭建eureka服务器
1、新建SpringBoot项目
2、添加eureka server依赖
3、yml配置
1、主机名
2、禁用保护模式
3、针对单台服务器,配置不向自己注册,也不从自己拉取注册表
4、启动类注解@EnableEurenaServer,通过注解触发自动配置
单台eureka服务器启动后报错:Connect to localhost:8761 timedout
这是自动配置的一个默认集群服务器,但是这个默认服务器不存在,所以出错
后面自己搭建了集群服务,默认服务器就不会再自动配置
application.yml配置
spring:
application:
name: eureka-server
server:
port: 2001 #默认8761
eureka:
instance:
hostname: eureka1 #主机名,集群中区分不同服务器
server:
enable-self-preservation: false #开发期间禁用保护模式
client:
register-with-eureka: false #单台服务器不向自己注册
fetch-registry: false #单台服务器不从自己拉取
作业
1、提前下载最新依赖
课前资料\pom.xml
新建一个maven项目,把pom.xml代码粘进去,修改版本
Springboot:2.4.0
Springcloud:2020.0.0-M5
然后更新依赖
2、安装新版VMware
尽量用最新VMware,新版本对资源使用,运行效率都会有优化
课前资料中提供了两个版本
- 15.5.2
- 12.x-旧电脑CPU不支持虚拟化技术,可以使用12.x
官网还有最新的16版本
SpringBoot和SpringCloud版本
SpringBoot:2.3.5.RELEASE
springcloud:Hoxton.SR9
服务提供者
修改hosts文件,添加eureka1和eureka2的映射配置
127.0.0.1 eureka1
127.0.0.1 eureka2
修改02、03、04这三个项目
1、添加eureka client依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR9
pom
import
2、yml配置eureka注册链接地址:http://eureka1:2001/eureka
#向注册中心注册时,用这个名称进行注册
#注册信息:item-service-->localhost: localhost:8001
spring:
application:
name: item-service
server:
port: 8001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka
sp02商品,和sp05eureka集群
在另一端口上再启动一个商品服务
java -jar item.jar #根据application.yml的配置来启动
#指定端口启动
java -jar item.jar --server.port=8002 #命令行参数可以覆盖yml配置
远程调用
RestTemplate
SpringBoot提供的远程调用工具
类似于HttpClient,可以发送http请求,并处理响应,RestTemplate简化了RestAPI调用,只需要使用它一个方法,就可以完成请求、响应、json转换
方法:
- getForObject(url,转换的类型.class,提交的参数)
- postForObject(url,协议体数据,转换的类型.class)
RestTemplate和Dubbo远程调用的区别:
RestTemplate:
- http调用
- 效率低
Dubbo:
- RPC调用,java的序列化
- 效率高
Ribbon
springcloud集成的工具,作用是负载均衡,和重试
负载均衡
Ribbon对RestTemplate做了封装,增强了RestTemplate的功能
1、获取地址表
2、轮询一个服务的主机地址列表
3、RestTemplate负责执行最终调用
添加负载均衡
1、ribbon依赖
2、@LoadBalanced注解,对RestTemplate进行功能增强
3、修改调用地址,使用服务ID,而不是具体主机地址
Ribbon重试
一种容错机制,当调用远程服务失败,可以自动重试调用
添加重试:
1、添加spring-retry依赖
2、配置重试参数
1、在yml中配置
- MaxAutoRetries:单台服务器的重试次数
- MaxAutoRetriesNextServer:更换服务器的次数
2、在java代码中设置
- Connecttimeout:与远程服务建立网络连接的超时时间
- ReadTimeout:连接已建立,请求已发送,等待响应的超时时间
HyStrix
系统容错工具
- 降级
调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
快速失败 - 熔断
当访问量过大,出现大量失败,可以过热保护,断开远程服务不再调用
限流
防止故障传播,雪崩效应
降级
1、hystrix依赖
2、启动类添加注解@EnableCircuitBreaker
3、添加降级代码
//当调用远程服务失败,跳转到指定的方法,执行降级代码
@HystrixCommand(fallbackMenthod="方法名")
远程调用方法(){
restTemplate.getForObject(url...);
}
Hystrix超时
Hystrix有默认的超时时间:1秒
Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效
Hystrix熔断
断路器打开的条件:
- 10秒内20次请求(必须首先满足)
- 50%失败,执行了降级代码
断路器打开后,所有请求直接执行降级代码
断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用
如果调用成功,断路器可以自动关闭,恢复正常
如果调用仍然失败,继续保持打开状态几秒钟
Hystrix故障监控 - Hystrix Dashboard
Hystrix利用Actuator工具,来暴露Hystrix的故障日志
Actuator
springboot提供的日志监控工具,可以暴露项目中多种监控信息
- 健康状态
- 系统环境变量
- Spring容器中所有的对象
- 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"] 暴露指定的多个监控
management:
endpoints:
web:
exposure:
include: "*"
搭建Hystrix Dashboard
仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
1、Hystrix dashboard依赖
2、@EnableHystrixDashboard
3、yml - 允许对那台服务器开启监控
hystrix:
dashboard:
proxy-stream-allow-list: localhost
Feign
远程调用:RestTemplate
ribbon
hystrix
集成工具
- 远程调用:声明式客户端
- ribbon负载均衡和重试
- hystrix降级和熔断
声明式客户端接口
只需要声明一个抽象接口,就可以通过接口做远程调用,不需要再使用调用RestTemplate
//调用远程的商品服务,获取订单的商品列表
//通过注解,配置:
//1、调用那个服务
//2、调用服务的那个路径
//3、向路径提交什么参数数据
@FeignClient(name="item-service")
public interface ItemClient(){
@GetMapping("/{orderId}")
JsonResult> getItems(@PathVariable String orderId);
}
在这里使用@GetMapping("/{orderId}"),指定的是向远程服务调用的路径
Feign继承Ribbon
0配置,已经启用了负载均衡和重试
默认重试参数:
- MaxAutoRetries: 0
- MaxAutoRetriesNextServer: 1
- ReadTimeout: 1000
虚拟机
1、解压缩虚拟机
课前资料\虚拟机\
- centos-7-1908.zip
适用于VMware15以上的虚拟机 - centos-7-1908-vmware-12.zip
使用与VMware12以上的虚拟机
2、双击centos-7-1908.vmx文件(三个窗口图标)
3、启动这个虚拟机
按提示选择"已复制虚拟机"
4、登录
username:root
password:root (输入密码时没有反应,实际已经输入成功,直接回车)
重置 VMware虚拟网络
VMware的虚拟网络非常不稳定,经常出现问题
- 没有IP
- 没有网卡
- 一切正常,但ping不通
重置VMware虚拟网络环境:
删除所有的虚拟网卡,再重新创建,初始化网络
1、编辑 - 虚拟网络编辑器
2、点右下角"更改设置"获取管理员权限
3、左下角"还原默认设置"按钮
设置NAT网络网段:192.168.64.0
编辑 - 虚拟网络编辑器
选择VMnet8网卡
下面网段设置成192.168.64.0
设置centos7-1908的IP
# 在/root/主目录下准备了两个脚本程序:ip-static 和 ip-dhcp
# 里面修改网卡的配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33
cat ip-static
cat ip-dhcp
#动态分配ip
./ip-dhcp
ifconfig
#指定固定ip
./ip-static
ip: 192.168.64.8
ifconfig
如果网络服务network.service服务无法启动,可能是和NetworkManager服务发生冲突,可以禁用NetworkManager
#停止NetworkManager服务
systemctl stop NetworkManager
#禁用NetworkManager
systemctl disable NetworkManager
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/