spring cloud gateway 的执行流程
请求分发处理器,是WebFlux的访问入口。看这似曾相识的样子,没错,对应到Spring MVC中,跟它承担类似作用的,就是DispatcherServlet。DispatcherHander也和DispatcherServlet的请求处理流程类似:
执行他的核心方法:
她的本职工作是将GlobalFilter(全局过滤器)、GatewayFilter(一般来说是我们自己配置的,当然也默认内置了一些,也内含了自己在application配置文件中配的defaultFilter[如果有陪置的话]),放到同一个List里进行优先级排序,生成一个过滤器链。执行过滤器链,就能顺序执行链中保存的所有Filter。
参考文章:
spring cloud gateway 专题收录1
spring cloud gateway 专题收录2
springcloud执行流程
1.Servlet
zuul.servletPath默认配置为/zuul,故请求为/zuul开头的会跳过dispatcherServlet直接进入ZuulServlet,该配置可以自定义配置,例如用于大文件上传
2.ZuulServlet中service方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
try {
this.init((HttpServletRequest)servletRequest, (HttpServletResponse)servletResponse);
RequestContext context = RequestContext.getCurrentContext();
context.setZuulEngineRan();
try {
//运行pre过滤器
this.preRoute();
} catch (ZuulException var12) {
//有异常,执行errorFilter
this.error(var12);
//再执行postFilter
this.postRoute();
return;
}
try {
//运行rote过滤器
this.route();
} catch (ZuulException var13) {
//有异常,执行errorFilter
this.error(var13);
//再执行postFilter
this.postRoute();
return;
}
try {
//运行post过滤器
this.postRoute();
} catch (ZuulException var11) {
//有异常,执行errorFilter
this.error(var11);
}
} catch (Throwable var14) {
this.error(new ZuulException(var14, 500, "UNHANDLED_EXCEPTION_" + var14.getClass().getName()));
} finally {
RequestContext.getCurrentContext().unset();
}
}
3.FilterProcessor
其运行交由FilterProcessor中的方法runFilters,根据service中的顺序,取不同的filter类型,执行其中的run方法
public Object runFilters(String sType) throws Throwable {
if (RequestContext.getCurrentContext().debugRouting()) {
Debug.addRoutingDebug("Invoking {" + sType + "} type filters");
}
boolean bResult = false;
ListZuulFilter list = FilterLoader.getInstance().getFiltersByType(sType);
if (list != null) {
for(int i = 0; i list.size(); ++i) {
ZuulFilter zuulFilter = (ZuulFilter)list.get(i);
Object result = this.processZuulFilter(zuulFilter);//见下面zuulFilter的runFilter()
if (result != null result instanceof Boolean) {
bResult |= ((Boolean)result).booleanValue();
}
}
}
return bResult;
}
zuulFilter的runFilter方法,当filter的shouldFilter()返回true时才执行run()方法
public ZuulFilterResult runFilter() {
ZuulFilterResult zr = new ZuulFilterResult();
if (!this.isFilterDisabled()) {
if (this.shouldFilter()) {
Tracer t = TracerFactory.instance().startMicroTracer("ZUUL::" + this.getClass().getSimpleName());
try {
Object res = this.run();
zr = new ZuulFilterResult(res, ExecutionStatus.SUCCESS);
} catch (Throwable var7) {
t.setName("ZUUL::" + this.getClass().getSimpleName() + " failed");
zr = new ZuulFilterResult(ExecutionStatus.FAILED);
zr.setException(var7);
} finally {
t.stopAndLog();
}
} else {
zr = new ZuulFilterResult(ExecutionStatus.SKIPPED);
}
}
return zr;
}
4.获取过滤器FilterRegistry
其中的属性private final ConcurrentHashMapString, ZuulFilter filters = new ConcurrentHashMap();
保存所有的过滤器
例子中有12个(其中有两个为自定义的):
[org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter@3dc68586,
org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter@4001d8c1,
org.springframework.cl
Spring Cloud调用接口过程
Feign -----Hystrix —Ribbon —Http Client(apache http components 或者 Okhttp) 具体交互流程上
Hystrix 是一个供分布式系统使用,提供 延迟 和 容错 功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用 Hystrix组件提供断路器、资源隔离与自我修复功能 。下图表示服务B触发了断路器,阻止了级联失败
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败,超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性
熔断机制是应对雪崩效应的一种微服务链路保户机制,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息。当检测当该节点微服务调用响应正常后恢复调用链路,熔断机制的注解是@HystrixCommand
“熔断器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,,某个异常条件被触发,直接熔断整个服务。,向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出吊牌用方法无法处理的异常,就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。
服务降级处理是在客户端实现完成的,与服务端没有关系
整体资源快不够了,忍痛将某些服务单元先关掉,关闭后还要返回一些可处理的备选方法,待渡过难关,再开启回来。
分布式项目中,有数十个依赖关系,每个依赖关系在某些时候不可避免地失败,
服务雪崩 :当A调用微服务B,B调C,和其他微服务,这是扇出,当扇出链路上某个微服务调用响应时间过长或者不可用,对微服务的A的调用就会占用越来越多的系统资源,导致系统崩溃,所谓的雪崩效应
服务熔断 :一般是某个服务异常引起的,相当于“保险丝”,当某个异常条件被触发,直接熔断整个服务,不是等到此服务超时
服务降级 :降级一般是从整体负荷考虑,当某个服务熔断之后,服务器将不再被调用,客户端可自己准备一个本地的fallback回调,返回一个缺省值,虽然服务水平下降,当能用,比直接挂掉要强
springcloud是spring,采用AOP的思想,异常处理信息,我们某个服务的功能是每个方法,我们还可以使用AOP直接在api层通过接口设置服务降级。
Docker 部署 Spring Cloud 项目详细步骤
作者 | boonya
链接 | blog.csdn.net/u011508407
准备工作
JDK1.8、Docker1.12.1、CentOS7.0
(1)到Oracle官网下载好 jdk-8u181-linux-x64.tar.gz 备用 (2)卸载系统自带的java
(3)安装jdk
(4)配置环境变量
找到:export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 这一行,并在其下面一行添加如下内容:
使环境变量生效
测试安装
(1) 查看内核版本(Docker需要64位版本,同时内核版本在3.10以上,如果版本低于3.10,需要升级内核)
(2) 更新yum包:
(3) 添加yum仓库:
(4) 安装Docker
(5) 启动Docker
(6)配置docker远程访问
执行命令编辑文件
找到这一行
改为
修改完成后保存并重启Docker
测试访问 如果有返回数据则配置成功。
(7)使用Docker国内镜像(为Docker镜像下载提速,非必须)
3.Docker Compose的安装(1)下载docker-compose ,并放到/usr/local/bin/
(2)为Docker Compose脚本添加执行权限
(3)安装完成,测试
结果显示:
说明Docker Compose已经安装完成了。
4.Docker使用Maven插件构建并上传镜像(1)新建Dockerfile文件 在项目的/src/main下新增文件夹docker,并在文件夹下创建Dockerfile文件,文件内容如下
(2)修改pom.xml文件增加如下plugin imageName:镜像名称 dockerDirectory:Dockerfile文件所在目录 dockerHost:docker所在宿主机ip 2375为docker开启的远程访问端口 其他配置采取默认即可
每一个微服务项目都要进行配置。
(3)构建镜像并上传至docker 使用maven运行如下命令
上传成功后,在服务器输入
可以看到所有的docker镜像啦。
5.使用Docker Compose进行服务编排(1)在服务器任意目录,新建文件docker-compose.yml
文件编写完毕保存,切换到当前文件所在目录,输入命令启动Docker Compose
停止Docker Compose命令
推 荐 阅 读
1. 我建议你尽早进入大厂的 6 个理由
2. Spring Boot 并发登录人数控制
3. 45 个值得收藏的 CSS 形状
4. 淘宝技术架构演进之路
springcloud从基础到入门到精通(nacos集群和持久化配置)
1.linux下安装nacos集群
需要准备的安装包: jdk、mysql、nginx、nacos
百度云盘下载地址
链接:
提取码:tgui
2.安装步骤
2.1 配置jdk环境变量
第一步:解压jdk包
第二步:移动解压后的目录到/usr/local
第三步:配置环境jdk环境
source命令通常用于重新执行刚修改的初始化文件
测试输入java -version 可看到对应的版本号
2.2 linux安装5.7mysql 建议安装在/usr/local/mysql
默认安装目录: /usr/local/mysql
数据文件目录: /usr/local/mysql/data
MySQL占用端口:3306
默认socket文件存放路径:/tmp/mysql.sock 用于客户端与服务端通信得套接字文件
第一步:上传软件包到linux操作系统
第二步:对mysql压缩包进行解压操作
第三步:移动mysql文件夹到/usr/local目录下并更名为mysql
第四步:创建一个mysql用户并更改/usr/local/mysql目录的权限(用户和组)
#没有指定用户组 会自定创建同名的用户组 id mysql可以查看到
#更改权限 chown -R mysql.mysql /usr/local/mysql
#查看ll /usr/local/mysql
查看/etc/my.cnf是否存在,不存在则创建加入以下配置
第五步:初始化数据库 需要进入/usr/local/mysql/bin
第七步:移动support-files目录下的mysql.server脚本到/etc/init.d目录一份 可直接使用service命令
赋予执行权限:chmod +x /etc/init.d/mysql
第八步:启动mysql脚本
第九步:设置密码并测试mysql数据库
3.linux安装nginx
第一步:解压
第二步: 移动解压后的文件到指定/usr/local
第三步:执行编译文件 进入nginx目录
第四步:安装
第五步:启动 进入 cd /usr/local/nginx/sbin目录下启动
4.nacos集群配置
4.1解压nacos
4.2移动文件到usr/local文件夹下
4.3持久化数据库创建
进入nacos的conf目录找到nacos-mysql.sql文件,复制所有内容在mysql执行
4.4在conf的application.properties文件中添加如下配置
4.5修改conf下的cluster.conf文件
下面的ip地址通过hostname -i查询获得,如上
4.6进入bin目录修改startup.sh文件
原文件
修改后的文件
4.7启动nacos集群,进入/usr/local/nacos/bin目录下
5.配置nginx文件
5.1找到conf下的nginx.conf文件
原文件
修改后的文件
5.2启动nginx,进入nginx/sbin目录执行下面命令
最后访问测试:192.168.137.130:1111/nacos/#/login成功进入nacos界面
发布一条配置信息
数据库查看,出现该条信息则表示成功
6.微服务测试,修改之前就创建的cloudalibaba-provider-payment9002的yml配置文件后,启动
查看到如下,表示注册成功