Believe it

相信不屈不挠的努力,相信战胜死亡的年轻

reactive

响应式编程,是一种非阻塞的编程方式,在Spring5中,Spring WebFlux出现了,他就是使用的reactive,传统的servlet和filter是同步的,传统的getParameter和getPart是阻塞的。

同步servlet

servlet的doGet函数是阻塞的,你的doGet占用多久,servlet线程就要占用多久

异步servlet

在doGet中开启新的线程,在新的线程中执行doGet的业务请求,执行完了再通知servlet线程,这样就不会阻塞servlet,可以支持更高的并发。

Mono 和 Flux

Mono可以返回一个, Flux是多个

SSE(server-sent events)

HTTP协议是一问一答,为什么Flux可以表现出流的样子?注意到response有一个flush,当flush调用的时候,就发送了一个数据过去

WebFlux

Eureka

Netfilx在设计Eureka的时候遵守的就是AP原则,Eureka是一个Netfix的子模块, 也是核心模块之一,Eureka是一个基于REST的服务,用于实现云端中间层服务发现和故障转移,它的功能类似于dubbo的注册中心,比如Zookeeper

Eureka架构

graph BT
  C[Eureka Server]
  A[Service Consumer]
  B[Service Provider]
  A--远程调用-->B
  A--获取服务-->C
  B--注册/续约/离开-->C

架构

约定 > 配置 > 编码 先写pom,xml,yml,sql, 然后写dao,写Mapper,Service,Controller

起步

用上面的方法建立一个Restful风格的服务端生产者,然后我们准备建立消费者,这里的消费者就不应该有Service了,你只需要使用RestTemplate即可

RestTemplate

是spring提供的专门针对rest客户端的高度抽象模版,

1
2
3
4
5
6
7
@Configuration
public class ConfigBean{
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}

克鲁斯卡尔重构树

有的时候,我们需要对最小生成树进行进一步的研究,比方说我们考虑最小生成树上任意两点路径的最小值,这个可以使用主席树、树剖等做法, 但是我们这样考虑,加入新的点,让边权变为点权,路径权的最小值就成了点权的最小值,如下图所示,最小生成树的点全部成为了克鲁斯卡尔重构树上的叶子,非叶节点充当了边权。

graph LR;
1((1))-- 5 ---2((2))
2((2))-- 4 ---3((3))
3((3))-- 3 ---4((4))
1((1))-- 8 ---4((4))
2((2))-- 7 ---5((5))
4((4))-- 2 ---6((6))
阅读全文 »

时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld # 题目描述 现有一个传动系统,包含了N个组合齿轮和M个链条。每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y。 即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈。传动比为正表示若编号为u的齿轮顺时针转动,则编号为v的齿轮也顺时针转动。传动比为负表示若编号为u的齿轮顺时针转动,则编号为v 的齿轮会逆时针转动。若不同链条的传动比不相容,则有些齿轮无法转动。我们希望知道,系统中的这N个组合齿轮能否同时转动。

阅读全文 »

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld # 题目描述 Rinne 最近学习了位运算相关的知识,她想运用自己学习的知识发明一个加密算法。 首先她有一个源数组 A,还有一个密钥数组 B,现在她想生成加密后的数组 C。 她发明的方法是:当计算\[C_i\]的时候,首先将 \[C_i\]赋值为\[C_{i-1}\],然后加上\[ A_i\] 分别与每一个满足 \[j \lt i\]\[B_j\] 异或后的和,然后加上 \[B_i\] 分别与每一个满足 \[j \lt i\]\[A_j\] 异或后的和,最后加上 \[A_i\]\[B_i\] 的异或和。 形式化的讲,关于 \[C_i\] 的递推式为以下式子:

阅读全文 »