拾遗部分只做简介,不做深入研究,只求脑袋里有印象。
REST
参考
基本概念
Roy Thomas Fielding提出的REST概念,Richardson提出了比较成熟的模型:
目前的 GET、POST、PUT、DELETE等请求在Level2上,超媒体控制属于Level3
使用HATEOAS, 服务器提供超媒体动态信息,即返回具有自描述性的数据结构。客户端可以知道下一步可操作资源的详细信息及可以对它进行的操作,这样的话,可以“按需”加载资源,就不再需要API文档了。
例如:
客户端请求新浪微博的某个用户信息,REST服务可以返回 用户详情、获取他关注的人的链接、获取他最近微博的链接、获取他最近评论微博对的链接,等等。
这样一定程度上减轻了客户端对服务器端的依赖,在Level2级别需要直到具体的url,在level3级别,后端每次都返回url信息,所以不再硬性需要了。
Spring提供了Spring Data REST来实现超媒体服务,依赖为:spring-boot-start-data-rest
设计方法
-
识别资源:domain
-
选择合适的力度
服务器一次返回的数据粒度
客户端缓存控制
-
URI设计
方法、返回等
Project Reactor
在Project Reacotr中看到了函数编程范式+观察者模式的应用
参考,参考
基本概念
Reactor看到了"来来回回"2趟循环:subscribe -> onSubscribe -> request -> onNext。
public static void main(String[] args) {
Flux.just("tom", "jack", "allen")
.filter(s -> s.length() > 3)
.map(s -> s.concat("@qq.com"))
.subscribe(System.out::println);
}
这里有两个发布者:Flux与Mono,Flux代表的是0-N个元素的响应式序列,而Mono代表的是0-1个的元素的结果。
.filter、.map、.flatmap等每个函数都构造了一个相应的subsciber
在进行最后一个调用subscribe时,开始一层一层的进行订阅操作
订阅完成之后,没有直接进行执行,而是进行一步onSubscribe调用链,这个阶段会让各 Subscriber
知道 subscribe
方法已被触发,真正的处理流程马上就要开始。
源头是在最初来的Flux处,所以又通过request的调用返回来
最后在Flux处依次调用onNext进行了了处理。
从这个过程看,它叫reactor(反应堆)真没毛病,一层一层的调用。
PS:onSubscribe与request这两个阶段的具体用处还需要深入研究。感觉subscibe+onNext就挺6了。
线程
在reactor中处理线程调度的不叫thread pool,而是Schedulers(调度器),通过调度器就可以创建出供我们直接使用的多线程环境。
Schedulers.immediate():当前线程
Schedulers.single():创建一个可重用的单线程环境,该方法的所有调用者都会重复使用同一个线程
Schedulers.elastic():建一个弹性线程池,会重用空闲线程,当线程池空闲时间过长就会自动废弃掉
Schedulers.parallel():创建一个固定大小的线程池,线程池大小和cpu个数相等
错误处理
通过doOnError、onErrorMap、doFinally等函数,以函数编程的方式做到try...catch...finally的工作
Flux.just(1,2,0)
.flatMap(id->getUserByid(id))
.doOnError(e-> Log.error("this occur something error"))
.onErrorMap(v->new CustomizeExcetion("服务器开小差了",v))
.doFinally(System.out.println("我会确保做一些事情"))
;
WebFlux
WebFlux有如下特点:
- 基于Netty服务器,提供了高性能的非阻塞IO
- 基于Reactor技术栈,提供了函数式编程
它对标的是SpringMVC,目前MySQL尚不支持非阻塞
引入依赖:spring-boot-starter-webflux,通过注解方式来使用与SpringMVC的相同。
服务器配置
-
可选择容器
spring-boot-starter-tomcat
spring-boot-starter-jetty
spring-boot-starter-undertow
spring-boot-reactor-netty
配置方式
-
端口
server.port
server.address
-
压缩
server.compression.enabled
server.compression.min-response-size
server.compression.mime-types
-
Tomcat配置
server.tomcat.max-connection=10000
server.tomcat.max-http-post-size=2MB
server.tomcat.max-swallow-size=2MB
server.tomcat.max-threads=200
server.tomcat.min-spare-threads=10
-
错误处理
server.error.path=/error
server.error.include-exception=false
server.error.include-stacktrace=never
server.error.whitelabel.enabled=true
-
其他
server.use-forward-headers
server.servlet.session.timeout
编程方式
WebServerFactoryCustomizer
TomcatServletWebServerFactory
HTTP2
前提条件:
- Java >= JDK 9
- Tomcat >= 9.0.0
- 配置好SSL
配置项:
- server.http2.enabled=true
客户端:
目前OkHttp支持Http2的客户端,RestTemplate在选择web客户端时,可以选择OkHttp3ClientHttpRequestFactory