完整搭建Spring Cloud微服务(四) 服务之间的调用(WebClient)

Nacos搭建好了,服务的注册也可以了,配置中心也大概弄得差不多了,是时候让多个服务进行相互调用了。这里用的是webflux,所以我们使用webClient来进行服务之间的调用,用的reactive的风格。

除了刚才的service-1,我们再复制一个client-1出来,搭建过程其实是一模一样的,只是记得要修改默认端口号,这里就不再多说了。具体的服务搭建方法,前两节应该说的算清楚了。

搭建完毕后,在Nacos中查看,如下所示:

完整搭建Spring Cloud微服务(四) 服务之间的调用(WebClient)_第1张图片

我们在service-1中添加一个方法,接受一个名字name,然后返回"你好"+name。我们直接在service-1中写一个controller就可以,webflux的controller写法跟以前没有什么区别,这里我是用Mono,来体现一下webflux的reactive编码api风格。如下:

@RestController
public class ServiceTestController {

    @PostMapping("/sayHello")
    public Mono sayHello(@RequestBody Mono mono, ServerHttpRequest request){
        HttpHeaders httpHeaders = request.getHeaders();
        StringBuilder sb = new StringBuilder();
        List from = httpHeaders.get("from");
        if (!CollectionUtils.isEmpty(from)) {
            sb.append(from.get(0));
        }
        return mono.map(name ->
                sb.append(",来了!").append("你好").append(name).toString());
    }
}

很好理解,获取header中from的字段和name,返回 【from,来了!+"你好"+name】,其中。map方法和jdk8的stream语法类似。

接着我们编写客户端调用代码的逻辑,同样是一个controller。在书写controller之前,我们需要先注入WebClient到spring中,方便使用。可以在启动类中,添加如下方法:

@Bean
@LoadBalanced//集群支持,负载均衡,必须要有本注解,不然请求会失败
public WebClient.Builder webClientBuilder(){
    return WebClient.builder();
}

然后再controller中直接注入使用就可以了。全部代码如下所示:

@RestController
public class ClientTestController {

    private final WebClient.Builder clientBuilder;

    @Autowired
    public ClientTestController(WebClient.Builder clientBuilder) {
        this.clientBuilder = clientBuilder;
    }

    @GetMapping("/sayHello/{name}")
    public Mono sayHello(@PathVariable String name){

        return clientBuilder
                .baseUrl("http://service-1/sayHello")//指定url,service-1是我们注册的微服务applications.name
                .build()
                .method(HttpMethod.POST)//post请求
                .syncBody(name)//参数 Object类型
                .header("from", "client-1")//header 部分的内容
                .retrieve()//请求结果的方法
                .bodyToMono(String.class);//将结果转换为相应的类型,这是String,直接返回即可

    }
}

请求client-1中的接口,可以看到,client-1成功的访问了service-1,并返回了正确的结果。

完整搭建Spring Cloud微服务(四) 服务之间的调用(WebClient)_第2张图片

 关于webflux的相关知识,因为同样是初识,认识也不太深,下一节把我所知道的分享一下。

总之,到这里为止,已经完成了服务之间的调用,后续熔断器和日志搜集等,一个一个再说。

你可能感兴趣的:(springCloud,从无知到精通)