文章目录
随堂笔记
这是随堂笔记, 详细内容请参考在线笔记:
https://blog.csdn.net/weixin_38305440
笔记乱码问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUYUWw5L-1606731518849)(note.assets/image-20200613174552258.png)]
课程安排(17到18天)
- Spring Cloud(6)
- RabbitMQ(2)
- Lucene Solr(1)
- Docker(2)
- Kubernetes(3)
- 分布式事务(3)
- RocketMQ(1)
王海涛
Spring Cloud
环境
-
IDEA 或 Eclipse(STS插件)
-
Lombok
-
Maven
- 如果下载依赖有问题,更换阿里仓库和中央仓库
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>D:\home\java\maven_repository</localRepository> <mirrors> <!-- 打开阿里仓库,使用阿里仓库更新依赖 注释调用阿里仓库,使用中央仓库更新依赖 --> <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> </mirrors> </settings>
-
微信:wanght6666666
-
笔记:code.tarena.com.cn
-
csdn 笔记:https://blog.csdn.net/weixin_38305440/article/details/108609574
-
代码仓库:https://gitee.com/benwang6/cgb2007
spring cloud是什么
-
spring cloud 是一个工具集
- 集成多个工具,来解决微服务中的各种问题
- 微服务全家桶
-
spring cloud 不是什么?
- spring cloud 不是一个解决单一问题的工具
-
远程调用 - RestTemplate
-
负载均衡 - Ribbon
-
重试 - Ribbon
-
降级、熔断、限流 - Hystrix
-
监控 - Hystrix Dashboard、Turbine、Sleuth、Zipkin
-
配置中心 - Config server
-
…
课程要求
必须严格按照笔记做
笔记中都是完整代码
做的过程中不能直接 cv ,要自己手敲!!!
如果遇到问题解决不了时,把前面做的一步代码cv一遍!!!
业务模块
02-item
03-user
04-order
-
工具类 - 不用自己写,在gitee或github搜索
CookieUtil、JsonUtil、JsonResult
-
TypeReference
指定转换的类型: new TypeReference<List>() {}
-
@RequestBody
用来接收参数,从请求的协议体,完整接收协议体数据
注册和发现
注册中心产品:
zookeeper、eureka、nacos、consul、etcd…
eureka
-
注册
服务提供者启动时,向eureka一次次反复注册,直到注册成功为止
-
拉取注册表
服务发现者每30秒拉取一次注册表(刷新注册表)
-
心跳
服务提供者每30秒发送一次心跳数据
eureka连续3次收不到一个服务的心跳,会删除这个服务
-
自我保护模式
特殊情况
如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式。
在保护模式下,所有服务都不删除。
网络恢复后,可以自动退出保护模式,恢复正常
开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式
eureka 和 zookeeper 区别:
- eureka:
- 强调AP(可用性)
- 集群结构:对等结构
- zookeeper:
- 强调CP(一致性)
- 集群结构:主从结构
- eureka:
搭建eureka服务器
- 新建 springboot 项目
- 添加 eureka server 依赖
- yml配置
- 主机名
- 禁用保护模式
- 针对单台服务器,配置不向自己注册,也不从自己拉取注册表
- 启动类注解 @EnableEurenaServer,通过注解触发自动配置
单台 eureka 服务器启动后报错:
Connect to localhost:8761 timed out
-
这是自动配置的一个默认集群服务器,但是这个默认服务器不存在,所以出错
后面自己搭建了集群服务,默认服务器就不会再自动配置
作业
1. **提前下载最新依赖**
课前资料\pom.xml
新建一个 maven 项目,把 pom.xml 代码粘进去,修改版本
-
springboot:
2.4.0
-
springcloud:
2020.0.0-M5
- pom.xml末尾添加
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories>
然后更新依赖
- 安装新版 VMware
先卸载旧版本(江哥虚拟机镜像不会受影响)
再安装新版本
尽量用最新VMware,新版本对资源使用、运行效率都会有优化。
课前资料中提供了两个版本
-
15.5.2
-
12.x - 旧电脑cpu不支持虚拟化技术,可以使用12.x
官网还有有最新的 16 版本
Springboot 和 Springcloud 版本
- springboot:
2.3.5.RELEASE
- springcloud:
Hoxton.SR9
02、03、04、05,都改
服务提供者
修改hosts文件,添加 eureka1 和 eureka2 的映射配置
C:\Windows\System32\drivers\etc\hosts
127.0.0.1 eureka1
127.0.0.1 eureka2
修改 02、03、04 这三个项目
- 添加 eureka client 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>
spring-cloud-starter-netflix-eureka-client
</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- yml配置eureka的注册连接地址: http://eureka1:2001/eureka
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka
sp02商品,和 sp05 eureka 集群
在另一个端口上再启动一个商品服务
java -jar item.jar # 根据application.yml的配置来启动
# 指定端口启动
java -jar item.jar --server.port=8002 # 命令行参数可以覆盖yml配置
远程调用
RestTemplate
springboot 提供的远程调用工具
类似于 HttpClient,可以发送 http 请求,并处理响应。RestTemplate简化了Rest API调用,只需要使用它的一个方法,就可以完成请求、响应、Json转换
方法:
- getForObject(url, 转换的类型.class, 提交的参数)
- postForObject(url, 协议体数据, 转换的类型.class)
RestTemplate 和 Dubbo 远程调用的区别:
- RestTemplate:
- http调用
- 效率低
- Dubbo:
- RPC调用,Java的序列化
- 效率高
Ribbon
Springcloud集成的工具,作用是负载均衡,和重试
负载均衡
Ribbon 对 RestTemplate 做了封装,增强了 RestTemplate 的功能
- 获得地址表
- 轮询一个服务的主机地址列表
- RestTemplate负责执行最终调用
添加负载均衡
- ribbon依赖
- @LoadBalanced 注解,对 RestTemplate 进行功能增强
- 修改调用地址,使用 服务id,而不是具体主机地址
Ribbon 重试
一种容错机制,当调用远程服务失败,可以自动重试调用
添加重试:
-
添加 spring-retry 依赖
-
配置重试参数
- 在yml中配置
- MaxAutoRetries:单台服务器的
- MaxAutoRetriesNextServer:更换服务器的次数
- 在java代码中设置
- ConnectTimeout:与远程服务建立网络连接的超时时间
- ReadTimeout:连接已建立,请求已发送,等待响应的超时时间
Hystrix
系统容错工具
- 降级
- 调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
- 快速失败
- 熔断
- 当访问量过大,出现大量失败,可以做过热保护,断开远程服务不再调用
- 限流
- 防止故障传播、雪崩效应
降级
- hystrix依赖
- 启动类添加注解 @EnableCircuitBreaker
- 添加降级代码
// 当调用远程服务失败,跳转到指定的方法,执行降级代码
@HystrixCommand(fallbackMethod="方法名")
远程调用方法() {
restTemplate.getForObject(url,......);
}
Hystrix超时
Hystrix有默认的超时时间:1秒
Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效
Hystrix 熔断
短路器打开的条件:
- 10秒内20次请求(必须首先满足)
- 50%失败,执行了降级代码
短路器打开后,所有请求直接执行降级代码
断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用,
如果调用成功,断路器可以自动关闭,恢复正常
如果调用仍然失败,继续保持打开状态几秒钟
Hystrix 故障监控 - Hystrix Dashboard
Hystrix 利用 Actuator 工具,来暴露 Hystrix 的故障日志
Actuator
springboot 提供的日志监控工具,可以暴露项目中多种监控信息
- 健康状态
- 系统环境变量
- spring容器中所有的对象
- spring mvc映射的所有路径
- …
添加 actuator
- 添加 actuator 依赖
- yml 配置暴露监控数据
- m.e.w.e.i="*" 暴露所有的监控
- m.e.w.e.i=health 只暴露健康状态
- m.e.w.e.i=[“health”, “beans”, “mappings”] 暴露指定的多个监控
搭建 Hystrix Dashboard
仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册
- hystrix dashboard 依赖
- @EnableHystrixDashboard
- 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<List<Item>> getItems(@PathVariable String orderId);
}
在这里使用 @GetMapping("/{orderId}"), 指定的是向远程服务调用的路径
Feign 集成 Ribbon
0配置,已经启用了负载均衡和重试
默认重试参数:
- MaxAutoRetries: 0
- MaxAutoRetriesNextServer: 1
- ReadTimeout: 1000
虚拟机
- 解压缩虚拟机
课前资料\虚拟机\
-
centos-7-1908.zip
适用于 VMware 15 以上的虚拟机
-
centos-7-1908-vmware-12.zip
使用与 VMware 12 或以上的虚拟机
-
双击 centos-7-1908.vmx 文件(三个窗口图标)
-
启动这个虚拟机
按提示选择“已复制虚拟机”
-
登录
username: root
password: root (输入密码时没有人反应,实际已经输入成功,直接回车)
重置 VMware 虚拟网络
VMware 的虚拟网络非常不稳定,经常出现问题
- 没有ip
- 没有网卡
- 一切正常,但ping不通
重置VMware虚拟网络环境:
删除所有的虚拟网卡,再重新创建,初始化网络
- 编辑 - 虚拟网络编辑器
- 点右下角“更改设置”获得管理员权限
- 左下角“还原默认设置”按钮
设置 NAT 网络网段: 192.168.64.0
编辑 - 虚拟网络编辑器
选择 VMnet8 网卡
下面网段设置成 192.168.64.0
设置 centos7-1908 的ip
# 在 /root/ 主目录下准备了两个脚本程序: ip-static 和 ip-dhcp
# 里面修改网卡的配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33
ll
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 虚拟机
- 从 centos-7-1908 克隆: rabbitmq
- 设置 ip
./ip-static
ip: 192.168.64.140
-
用 mobaxterm 连接 rabbitmq
-
上传rabbitmq的离线安装文件
- 解压 rabbitmq-install.zip
- 上传 rabbitmq-install 文件夹到 /root/
Feign 集成 Hystrix
Feign默认不启用Hystrix,不推荐启用Hystrix(后面再分析)
启用Hystrix基础配置:
- hystrix起步依赖
- yml中配置启用hystrix
feign.hystrix.enabled=true
- 启动类添加注解
@EnableCircuitBreaker
添加降级代码:
@FeignClient(name="item-service", fallback=降级类.class)
public interface ItemClient {
@GetMapping("/{orderId}")
JsonResult<List<Item>> getItems(@PathVariable String orderId);
}
降级类需要实现声明式客户端接口,在实现的抽象方法中添加降级代码,
降级类需要添加 @Component
注解
Feign 集成 Hystrix,添加监控
- 添加 actuator 依赖
- 暴露
hystrix.stream
监控端点 - 查看监控日志
- 重启09
- 访问 http://localhost:3001/actuator/
订单中添加 feign,调用商品和用户
- 添加依赖
- feign
- hystrix
- actuator
- yml
- feign.hystrix.enabled=true
- m.e.w.e.i=hystrix.stream
- 启动类注解
- @EnableFeignClients
- @EnableCircuitBreaker
Turbine
聚合 Hystrix 监控数据
连接多台服务器,抓取日志数据,进行聚合,
交给仪表盘在同一个监控界面进行展现
搭建 Turbine 服务
- 添加 Turbine、eureka client 依赖
- yml 配置
- 聚合的服务id:order-service, aa, bb, cc
- 为聚合的监控数据命名: cluster-name=new String(“default”)
- 启动类添加注解 @EnableTurbine
消息服务器
分布式系统中广泛应用消息服务
消息服务器:
- rabbitmq
- activemq
- rocketmq
- tubemq
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 会对过滤器进行自动配置
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
配置中心客户端
修改 2,3,4,11 项目
-
config client 依赖
-
新建配置文件: bootstrap.yml
bootstrap.yml 是引导配置文件,它先于application.yml加载
-
bootstrap.yml 添加配置
- 连接eureka, 从注册表得到配置中心的地址
- 连接配置中心
- 从配置中心下载指定的配置文件
rabbitmq工作模式
合理分发消息
-
通过回执,通知服务器消息处理完成
- 通过回执,服务器可以知道消费者有没有处理完消息
-
qos=1
每次只从服务器抓取一条消息,这条消息处理完成之前,不会抓取下一条,
必须在手动ACK模式下 qos设置才有效
消息持久化
防止服务器崩溃、重启造成消息丢失,需要把消息保存在磁盘
-
队列持久化
c.queueDeclare(“队列名”, true, …
-
消息持久化
c.basicPublish("", “队列名”, MessageProperties.PERSISTENT_TEXT_PLAIN, 消息)
导入拼多商城项目
- 导入数据库
- sqlyog 右键点击连接
- 选择“从sql转储文件导入”
- 亿发课前资料\solr\04-拼多数据库\pd.sql
- 导入完成后,右键点击连接,刷新
- 新建 Empty Project:pd
- 导入模块
- D:\home\lesson\课前资料\亿发课前资料\solr\06-拼多项目\pd-web.zip
- 解压到 pd 工程目录
- 按两下shift,搜索 add maven(添加maven)
- 选择 pd-web 下的pom.xml 导入
- 数据库连接
- 如果用 oracle mysql 8 需要调整数据库驱动和连接参数
- 驱动用新版本 8.0.21
- yml 中驱动类改成
com.mysql.cj.jdbc.Driver
- 连接参数添加
&serverTimezone=GMT%2B8
- mapper.xml
- 项目中mapper.xml直接放在了java目录下
- 需要把xml文件移动到 resources 目录下
- 设置工程的jdk
- 启动配置,设置 working directory,设置成pd-web模块目录