SpringBoot之四:拾遗

拾遗部分只做简介,不做深入研究,只求脑袋里有印象。

REST

参考

基本概念

Roy Thomas Fielding提出的REST概念,Richardson提出了比较成熟的模型:

rest-maturity-model

目前的 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

从这个过程看,它叫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

# spring 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×