首页>>后端>>SpringBoot->springcloud执行流程(spring cloud执行流程)

springcloud执行流程(spring cloud执行流程)

时间:2023-12-03 本站 点击:0

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配置文件后,启动

查看到如下,表示注册成功


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/10605.html