写点什么

新版负载均衡 WebClient CRUD

作者:Xiao8
  • 2022 年 6 月 22 日
  • 本文字数:2413 字

    阅读完需:约 8 分钟

Webclient 使用场景

前面介绍了 什么是阻塞、非阻塞,以及对应的客户端库,非阻塞在高并发内存不足的情况下,还是一个不错的选择,当被访问者的服务响应很慢、或者自己在请求对方时,并不是很想知道对方返回的结果,都可以使用 Webclient 来进行非阻塞式请求。下面紧接着讲非阻塞客户端库 Webclient 如何实现增删改查。

Webclient 的 RestFul 请求

一、RESTful 风格与 HTTP method

熟悉 RESTful 风格的朋友,应该了解 RESTful 风格 API 使用 HTTP method 表达对资源的操作。



下面我们就来讲下这些资源场景的使用方式。

POST

POST 等常见使用如下方法:


  • block()阻塞获取响应结果的方法

  • subscribe()非阻塞异步结果订阅方法

  • retrieve()获取 HTTP 响应体,exchange()除了获取 HTTP 响应体,还可以获取 HTTP 状态码、headers、cookies 等 HTTP 报文信息。

  • 使用 Mono 接收单个对象的响应结果,使用 Flux 接收集合类对象的响应结果。

  • 占位符语法传参方式

模拟表单提交数据

public void testFormSubmit() {
MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("username", "damoin"); map.add("UID", "11024319902323");
Mono<String> mono = webClientBuilder.build().post() .uri("http://rest-service-service/add") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .body(BodyInserters.fromFormData(map)) .retrieve() .bodyToMono(String.class);
System.out.println(mono.block());}
复制代码


如上所示,在提交表单的时候,需要说明表单数据类型,以及表单的具体数据,我们知道:常见的表单数据都是以 map 形式存在,在请求后要想获取响应返回,可以使用retrieve函数,同时可以借助 Mono 来对返回结果进行类型转换,如果是单个对象使用 Mono,如果是集合流,可以使用 Flux。同时,如果想要阻塞拿到返回结果的信息,可以通过block函数来处理。

传输对象以 JSON 数据形式发送
public void testPostJson() {    SysUser user = new SysUser();    user.setRealName("dwdwdww");    user.setPhone("32323232");    Mono<String> mono = webClientBuilder.build()                    .post()                    .uri("http://rest-service-service/add")                    .contentType(MediaType.APPLICATION_JSON)                    .bodyValue(user)                    .retrieve()                    .bodyToMono(String.class);
System.out.println(mono.block()); }
复制代码


这里将传输的数据以 Json 格式来进行发送给对方,同样需要注明数据类型MediaType.APPLICATION_JSON,其它的函数都是跟上面一样。

模拟向服务端发送 JSON 字符串数据

如果有时候对方需要的不是一个 JSON 对象,可能是需要一个 JSON 字符串,那怎么办呢?


public void testPostJsonStr() {    String jsonStr = "{\"realName\": \"damon\",\"phone\": \"32323232\"}";    Mono<String> mono = webClientBuilder.build().post()                    .uri("http://rest-service-service/add")                    .contentType(MediaType.APPLICATION_JSON)                    .body(BodyInserters.fromValue(jsonStr))                    .retrieve()                    .bodyToMono(String.class);
// 输出结果 System.out.println(mono.block());}
复制代码


此时,数据类型同样还是 MediaType.APPLICATION_JSON,但传输的是 JSON 串。

DELETE

使用 DELETE 方法去删除资源,删除一个已经存在的资源,使用 webClient 的 delete()方法。该方法会向 URL 代表的资源发送一个 HTTP DELETE 方法请求:


public void testDelete()  {  webClientBuilder.build()  .delete()  .uri("http://rest-service-service/1");}
复制代码

PUT

修改一个已经存在的资源,使用 webClient 的 put()方法。该方法会向 URL 代表的资源发送一个 HTTP PUT 方法请求:


public void testPut() {        SysUser user = new SysUser();        user.setRealName("dwdwdww");        user.setPhone("32323232");
Mono<String> mono = webClientBuilder.build() .put() .uri("http://rest-service-service/1") .contentType(MediaType.APPLICATION_JSON) .bodyValue(user).retrieve().bodyToMono(String.class);
System.out.println(mono.block());}
复制代码


这里以传 json 数据的格式来进行发送修改,修改完成后返回修改结果信息。

GET

新增完数据后,我们来查看数据对象,如果是一个对象数据的话,可以使用 Mono:


@GetMapping(value = "/getClientResByWebClient2", produces = MediaType.TEXT_EVENT_STREAM_VALUE)    public Mono<String> getClientResByWebClient2() throws Exception {             Mono<String> resp = webClientBuilder.build()             .get()             .uri("http://diff-ns-service-service/all/getService")             .retrieve().bodyToMono(String.class);             //.exchange().flatMap(clientResp -> clientResp.bodyToMono(String.class));
resp.subscribe(body -> System.out.println(body)); return resp; }
复制代码


如果是多个对象,那就是集合集,此时需要用 Flux 来获取:


public void testFlux() {    Flux<SysUser> flux = webClientBuilder.build()              .get()              .uri("http://diff-ns-service-service/all")              .retrieve()              .bodyToFlux(SysUser.class);      List<SysUser> li = flux.collectList().block();      assert li != null;      System.out.println("li集合元素数量:" + li.size());}
复制代码


发布于: 刚刚阅读数: 4
用户头像

Xiao8

关注

God bless the fighters. 2020.03.11 加入

欢迎关注公众号:程序猿Damon,长期从事Java开发,研究Springcloud的微服务架构设计。目前主要从事基于K8s云原生架构研发的工作,Golang开发,长期研究边缘计算框架KubeEdge、调度框架Volcano、容器云KubeSphere研究

评论

发布
暂无评论
新版负载均衡WebClient CRUD_6月月更_Xiao8_InfoQ写作社区