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

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

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

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

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

@RestController
public class ServiceTestController {

    @PostMapping("/sayHello")
    public Mono<String> sayHello(@RequestBody Mono<String> mono, ServerHttpRequest request){
        HttpHeaders httpHeaders = request.getHeaders();
        StringBuilder sb = new StringBuilder();
        List<String> 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<String> 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,并返回了正确的结果。

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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值