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的相关知识,因为同样是初识,认识也不太深,下一节把我所知道的分享一下。
总之,到这里为止,已经完成了服务之间的调用,后续熔断器和日志搜集等,一个一个再说。