文章目录
eureka
eureka运行机制
注册
客户端向服务器注册时,会一次次反复注册,知道注册成功为止
拉取
客户端每30秒拉取一次注册表,更新本地注册表缓存
心跳
客户端每30秒发送一次心跳数据,服务器连续三次收不到一个服务的心跳,就会把这个服务从注册表中删除
自我保护模式
- 在网络中断时,15分钟内,85%服务器出现心跳异常(一次心跳停止叫心跳异常),自动进入自我保护模式
- 保护模式下,保护所有注册信息都不删除
- 网络恢复后,可以自动退出保护模式
- 开发调试期间,可以禁用保护模式,这样避免影响测试
客户端连接eureka
修改2,3,4
1.添加eureka clien依赖
2.yml配置eureka地址
- http://eureka1:2001/eureka
3.修改hosts,添加eureka1和eureka2
- win+r ,输入drivers
- 进入etc目录,找到hosts文件
- 用管理员运行启动编辑器,修改hosts文件
高可用
商品的高可用
1.修改item的启动配置,添加springboot启动参数:--server.port=8001
2.复制启动配置类,修改端口8002
eureka 高可用
1、添加eureka1和eureka2
Feign集成的Ribbon
Ribbon负载均衡
Feign 集成Ribbon,默认启动负载均衡
Ribbon重试
- 调用后台服务时,如果失败可以自动发起重试调用
- 出现异常
- 调用超时
- 服务器宕机 - Feign集成Ribbon,默认启动了重试
- 重试参数:
- ribbon.MaxAutoRetries 单台服务器的重试次数,默认是0
- ribbon.MaxAutoRetriesNextServer 更换服务器的次数,默认是1
- ribbon.ReadTimeout 默认1000毫秒超时
- ribbon.ConnectTimeout 与后台服务器建立连接的超时时间,默认1000
- ribbon.OkToRetryOnAllOperations 是否对所有请求方式都重试,默认只对Get重试
为什么不对post重试,因为post基本都是对数据进行增删改的操作,如果重试可能导致重复的修改数据、删除数据,因为他可能过一会就操作成功了
zuul网关
统一入口
统一的权限校验
zuul的过滤器 ZuulProxy,可以过滤客户端请求,在过滤器中可以检查访问权限
测试:
http://localhost:3001/item-service/asfdgh4s --没有登录,不允许访问
http://localhost:3001/item-service/asfdgh4s?token=asfdgh4s --已登录,可以访问
1.新建过滤器类 --AccessFilter 按照zuul规则实现 继承ZuulFilter
2.添加注解:@Component 自动扫描自动创建实例
- zuul的自动配置,会在spring容器中发现过滤器实例,完成自动配置
3.过滤器的类型:pre前置过滤器,routing路由过滤器,post后置过滤器,error错误过滤器
4.通过顺序号来设置过滤器放在哪个位置
5.过滤代码–用来检查权限
代码演示:
package cn.tedu.sp06.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class AccessFilter extends ZuulFilter {
// 设置过滤器的类型:pre前置过滤器,routing路由过滤器,post后置过滤器,error错误过滤器
@Override
public String filterType() { //设置成前置过滤器
// return "pre";
return FilterConstants.PRE_TYPE;// 和上面的return没什么区别
}
// 设置顺序号
@Override
public int filterOrder() {
// 前置过滤器中有5个默认的过滤器,自定义过滤器放在末尾
return 6;
}
/**
* 针对当前请求,是否要执行下面的过滤代码
* */
@Override
public boolean shouldFilter() {
/**
* 调用商品需要判断权限,
* 调用用户或订单不检查权限(不考虑业务的合理性,只完成功能的测试)
* */
// 获得一个请求上下文对象
RequestContext ctx = RequestContext.getCurrentContext();
// 从上下文对象获得调用的后台服务的serviceId
String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);//获取"serviceId"
// 如果调用的是 item-service,返回true
return "item-service".equals(serviceId);
}
// 过滤代码 --是用来检查权限
@Override
public Object run() throws ZuulException {
// http://localhost:3001/item-service/asfdgh4s?token=asfdgh4s
// 获得上下文对象
RequestContext ctx = RequestContext.getCurrentContext();
// 获得 request 对象
HttpServletRequest request = ctx.getRequest();
// 接收token参数
String token = request.getParameter("token");
// 如果token 不存在
// if (token==null||"".equals(token))
if (StringUtils.isBlank(token)){
// 阻止继续调用
ctx.setSendZuulResponse(false);
// 直接返回响应
// jsonResult --> {code:400,msg:"未登录",data:null}
String json = JsonResult.build()
.code(400)
.msg("Not Login! 未登录!")
.toString();
ctx.addZuulResponseHeader(
"Content-Type","application/json;charset=UTF-8");
ctx.setResponseBody(json);
}
return null; // zuul当前版本这个返回值不起任何作用
}
}
Zuul集成Ribbon
1.负载均衡默认启用
2.重载默认禁用
在最前面重试,可能造成后台服务器大面积压力倍增,大面积出现故障
3.启用重试
- 添加spring-retry依赖
- yml配置重用重试: ‘zuul.retryable=true’
- 如果需要可以配置重试参数
Zuul集成Hystrix
Hystrix是容错和限流工具
- Hystrix容错:降级
- Hystrix限流:熔断
Zuul网关实现使用Hystrix 进行容错处理,执行降级
Zuul 默认已经启用Hystrix,任何基础配置都不用做
调用后台数据失败,执行前面模块中的降级代码,向客户端返回降级结果
- 错误提示
- 缓存数据
- 根据业务逻辑,返回任何结果都可以
1.新建降级类 ItemFB,实现FallvackProvider接口
2.添加注解@Component
- zuul的自动配置,可以自动发现降级类实例,完成自动配置
Zuul集成Hystrix实现限流,熔断
当流量过大,后台服务出现故障,可以断开链路,限制后台故障服务的流量,等待它冲故障中恢复
- 断路器打开条件:
10秒20次请求(必须首先满足)
50%请求出错,执行了代码降级 - 断路打开后,会进入半开状态
在半开状态下,会向后台
Turbine
从多台服务器聚合Hystrix监控数据,Hystrix dashboard仪表盘可以从Turbine抓取聚合后的日志数据
创建本地仓库
已经创建过仓库的不要重复创建
1.vcs --create git repository
(double shift 搜索create git repository)
2.选择springcloud1工程作为仓库目录
3.把代码提交到本地仓库
ctrl+k 或 点右上角勾按钮
选择所有文件,填写提交信息完成提交
本地仓库推送到远程仓库
已经有远程仓库的不需要重复创建
1.gitee 中点加号下拉菜单,新建仓库
2.仓库名称:springcloud1
3.设置成开源仓库
4.创建完成后,复制仓库地址
5.推送
ctrl+shift+k
或点右上角向上箭头按钮
6.点define remote链接,粘贴gitee仓库地址,完成推送
搭建配置中心
1.新建 spring模块 sp09-config
2.添加依赖:eureka client,config server
3.yml
# git仓库地址:https://gitee.com/yly451516725/springcloud1.git
# 存放配置文件的目录:config
4.启动类注解 @EnableConfigServer
5.访问验证:
- http://localhost:6001/item-server-dev
- http://localhost:6001/user-server-dev
- http://localhost:6001/order-server-dev
VMware
1.16.x
2.NAT网络的网段使用192.168.64.0
编辑–虚拟网络编辑器 – 选择vmnet8 - 左下角修改 ‘192.168.64.0’
3.上面虚拟机中已经做了基本基础配置
- yun安装源、扩展源使用阿里云服务器
- 安装python、pip、ansible
- 添加了两个脚本文件
- ip-static - 配置固定ip
- ip-dhcp - 自动获取ip
1.解压centos-8-215
2.双击 centos-8-2105.vmx加载镜像
3.启动,按提示选择“已复制虚拟机”
4.如果提示“硬件兼容性”,右键点虚拟机,管理,修改硬件兼容性,改成自己的vnware
5.登录用户名密码都是root
Rabbitmq
消息队列
消息服务器
消息中间间 Borker
- Rabbitmq
- Activemq
- Rocketmq
- Kafka
- Tubemq