项目中遇到的一些问题总结(五)

news/2024/12/2 14:41:41/

1 灰度发布和ABTest

灰度发布和ABTest是软件开发中常用的两种技术,它们用于在生产环境中逐步推出新功能或新服务,以最小风险的方式验证其可行性和效果。

灰度发布是指将新版本的功能或服务逐步推出给一部分用户进行验证,该部分用户称为灰度用户。对于未经过验证的新版本,只会在小范围内进行测试,而非所有用户同时体验。通过灰度发布,可以在保证正常运行的前提下,累积和分析用户反馈,及时修复和改进新版本中可能出现的问题,确保新版本全面投入使用后更加完善和稳定。

ABTest则是一种用于比较两个或多个不同版本效果的技术,它将用户随机分配到两个版本之中,记录用户在不同版本上的行为和反馈,最终就可以得到用户更喜欢的版本。ABTest可以基于数量、时间等多种因素进行比较与评测,评估的因素可以包括页面布局、颜色、字体、章节设置等多方面。

这两种技术都是按照独立的逐步视图推送新功能或新服务,以最大程度上保障软件的稳定性和性能,同时能够有效降低生产风险,并且能够在较短时间内获取到关键的数据指标,帮助开发者迅速决策和调整。

2 响应式编程

响应式编程是一种编程方式,它可以将异步数据流的处理变得更加简单和高效。在响应式编程中,我们将数据流看作是一个连续的时间序列,通过对数据流进行操作和变换,来实现对数据流的高效处理。这种编程方式相比传统的命令式编程方式,更加简洁、易于维护和扩展。
举个例子,假设你需要对一个数据列表中的每个元素进行一系列的操作,比如过滤、排序、计算等。在响应式编程中,你可以将这个数据列表看作是一个数据流,然后通过一些操作符对这个数据流进行操作和变换,最后得到你想要的结果。这样的代码更加简洁、易于理解和维护,也更加高效。

3 普通代码和响应式编程举例

首先是普通的代码实现:

public void processList(List<Integer> list) {List<Integer> result = new ArrayList<>();for (Integer i : list) {if (i % 2 == 0) {result.add(i * i);}}Collections.sort(result);for (Integer i : result) {System.out.println(i);}
}

这段代码需要对一个整数列表进行操作,首先将其中的偶数平方后加入结果列表,然后对结果列表进行排序,最后将结果打印到控制台。这种实现方式可能会存在一些问题,比如需要手动管理迭代器,代码量较多等等。

现在我们来看一下响应式编程的实现方式:

public void processList(List<Integer> list) {Flux.fromIterable(list).filter(i -> i % 2 == 0).map(i -> i * i).sort().subscribe(System.out::println);
}

这段代码使用了Reactor框架中的Flux类,将整数列表看作是一个数据流,然后通过filter函数将其中的偶数筛选出来,再通过map函数将偶数平方,最后通过sort函数进行排序,并通过subscribe函数将结果打印到控制台。这种实现方式相比普通的代码更加简洁、易于理解和维护,也更加高效。

4 GatewayFilter 和 GlobalFilter

GatewayFilter:应用到单个路由或者一个分组的路由上(需要在配置文件中配置)
GlobalFilter:应用到所有的路由上(无需配置,全局生效)

在Spring Cloud Gateway中,过滤器分为两种类型:GatewayFilter和GlobalFilter。二者的区别如下:

  1. GatewayFilter:应用到单个路由或者一个分组的路由上,需要在配置文件中配置。这种过滤器通常用于对单个服务进行特殊的过滤和处理,比如添加请求头、去除请求路径前缀等等。这些过滤器只会对所配置的路由生效,不会对其他路由产生影响。

  2. GlobalFilter:应用到所有的路由上,无需配置,全局生效。这种过滤器通常用于对所有服务进行通用的过滤和处理,比如添加请求日志、鉴权等等。这些过滤器会对所有路由生效,可以在整个网关中实现全局的过滤和处理。

下面是一个使用GatewayFilter的代码例子,在配置文件中配置一个路由,并为该路由添加一个过滤器:

spring:cloud:gateway:routes:- id: my-serviceuri: http://localhost:8080predicates:- Path=/my-service/**filters:- AddRequestHeader=X-My-Header, MyValue

在上面的配置中,我们定义了一个名为my-service的路由,将请求转发到http://localhost:8080这个服务中,同时指定了一个Path谓词,用于匹配请求路径中以/my-service/开头的请求。最后,我们为该路由配置了一个过滤器AddRequestHeader,用于添加一个请求头X-My-Header,值为MyValue。

下面是一个使用GlobalFilter的代码例子,定义一个自定义的全局过滤器,用于记录请求日志:

@Component
public class LoggingFilter implements GlobalFilter {private static final Logger logger = LoggerFactory.getLogger(LoggingFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {logger.info("Request path: {}", exchange.getRequest().getPath());return chain.filter(exchange);}
}

在上面的代码中,我们定义了一个名为LoggingFilter的类,实现了GlobalFilter接口。在filter方法中,我们记录了请求的路径,并通过chain.filter(exchange)方法将请求继续传递给下一个过滤器或目标服务。这个过滤器会对所有的路由生效,因为它是一个全局过滤器。

5 GlobalFilter 是自动对所有路由生效吗

是的,GlobalFilter会自动对所有路由生效,无需在配置文件中为每个路由单独配置。这意味着,如果我们在网关中定义了多个路由,那么所有的请求都会经过全局过滤器的处理。因此,全局过滤器通常用于对所有服务进行通用的过滤和处理,比如添加请求日志、鉴权等等。
需要注意的是,虽然全局过滤器会对所有路由生效,但它们也可以通过GatewayFilter的order属性来控制过滤器的执行顺序。如果有多个全局过滤器,那么它们会按照order属性从小到大的顺序依次执行。同时,全局过滤器也可以通过实现Ordered接口来指定执行顺序。
总之,全局过滤器是在整个网关中生效的,可以实现对所有服务的全局过滤和处理。

6 怎么使用官方的 GlobalFilter ,并通过 orde r属性来控制过滤器的执行顺序

Spring Cloud Gateway官方提供了一些内置的GlobalFilter,我们可以直接使用它们。同时,我们也可以通过order属性来控制过滤器的执行顺序。下面是一个使用官方GlobalFilter的例子,同时也展示了如何使用order属性来控制过滤器的执行顺序:

@Configuration
public class GatewayConfig {@Beanpublic GlobalFilter customGlobalFilter() {return new OrderedGatewayFilter((exchange, chain) -> {// do something before routingreturn chain.filter(exchange).then(Mono.fromRunnable(() -> {// do something after routing}));}, 100); // 设置 order 为 100}@Beanpublic GlobalFilter anotherGlobalFilter() {return new OrderedGatewayFilter((exchange, chain) -> {// do something before routingreturn chain.filter(exchange).then(Mono.fromRunnable(() -> {// do something after routing}));}, 200); // 设置 order 为 200}
}

在上面的代码中,我们通过@Bean注解定义了两个GlobalFilter,分别是customGlobalFilter和anotherGlobalFilter。这两个过滤器都继承自OrderedGatewayFilter,并在构造函数中分别设置了order属性为100和200。这样,当请求经过这两个过滤器时,它们会按照order属性从小到大的顺序依次执行,即先执行customGlobalFilter,再执行anotherGlobalFilter。
在filter方法中,我们可以编写具体的过滤逻辑。在上面的例子中,我们在路由之前和之后分别做了一些事情,比如记录日志等等。最后,我们通过chain.filter(exchange)方法将请求继续传递给下一个过滤器或目标服务,同时使用Mono.fromRunnable方法在请求处理完成后执行一些后续操作。
总之,我们可以通过内置的GlobalFilter,或者自定义的GlobalFilter来实现对所有服务的全局过滤和处理。同时,我们也可以通过order属性来控制过滤器的执行顺序。


http://www.ppmy.cn/news/73631.html

相关文章

城市内涝监测预警系统解决方案

一、方案背景 城市化进程的逐渐加快&#xff0c;城市内人口大量增多&#xff0c;交通运输压力增大&#xff0c;城市建设越来越密集&#xff0c;道路铺建面积越来越多&#xff0c;城市化的发展改变了城市区域的地表环境&#xff0c;致使城市雨水不能像农村或是古代雨水那样&…

【软考中级】软件设计师选择题题集(二)

若某条无条件转移汇编指令采用直接寻址,则该指令的功能是将指令中的地址码送入(1)。  (1)A.PC (程序计数器) B.AR (地址寄存器) C.AC (累加器) D.ALU (算逻运算单元) 【答案】A 【解析】本题考查指令系统基础知识。 直接寻址是指操作数存放在内存单元中,指令中直接给出…

【算法题】2381. 字母移位 II

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 题目&#xff1a; 给你一个小写英文字母组成的字符串…

【论文合集】Awesome Backdoor Learning

关于后门攻击&防御的博客与论文。 ECCV2022对抗攻击&防御论文汇总 | Lis Blog (tuoli9.github.io) ICLR2022对抗攻击&防御论文汇总 | Lis Blog (tuoli9.github.io) CVPR2022对抗攻击&防御论文汇总 | Lis Blog (tuoli9.github.io) ACM MM2022对抗攻击&防…

VMware安装win10虚拟机教程及常见问题

win10虚拟机安装教程 一、前言 1. 准备VMware虚拟机&#xff08;可自行到VMware官网 或 点击链接 下载正版VMware Workstation Pro&#xff09;。 2. 准备需要安装的win10镜像&#xff0c;下载地址&#xff1a;下载 Windows 10。 3. 文章不一定合适每位安装虚拟机的人&#xff…

聚观早报 |腾讯Q1营收重回两位数增长;特斯拉向印度政府提议建厂

今日要闻&#xff1a;腾讯Q1营收重回两位数增长&#xff1b;传特斯拉向印度政府提议建厂&#xff1b;ChatGPT创始人呼吁加强对AI监管&#xff1b;笑果被罚款1335万&#xff1b;药明康德联合创始人赵宁去世 腾讯Q1营收重回两位数增长 5 月 17 日&#xff0c;腾讯控股发布 2023 …

推荐8款在win11上还能用的“古董级”软件

前几天花重金1.3个w买了一台新电脑华为一体机MateStation X 2023&#xff0c;用了近10年的华硕迷你电脑终于要下岗了。这么多年来一直在用win7操作系统&#xff0c;现在直接迭代到win11了&#xff0c;以前几个用得称手的工具软件不舍得扔&#xff0c;拷到新电脑上居然还能用&am…

【JS】问号点和双问号的用法

1. 问号点(?.) 当访问多层对象属性(比如 res.data.list)时,如果属性res.data为空,则会报引用错误,为此我们不得不这么处理: 1 let dataList = res && res.data && res.data.list 1 看着非常不美观,今天介绍的新语法就是为了解决这种问题的 (可选链…