解决Dubbo3调用Springcloud接口报No provider available from registry RegistryDirectory
解决Dubbo调用Springcloud接口报No provider available from registry RegistryDirectory
- 问题发现
- 问题解决
问题发现
在学习Dubbo过程中,Dubbo官网有一篇文章《微服务最佳实践,零改造实现 Spring Cloud & Apache Dubbo 互通》,跟着示例进行实操报错。
依赖文件如下:
<!-- dubbo依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-nacos-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>4.1.3</version>
</dependency>
配置文件如下:
dubbo:
application:
name: dubbo-nacos-consumer
qos-enable: false
registry:
address: nacos://127.0.0.1:8848
register-mode: instance
编写在Dubbo中Feign接口(不介绍SpringCloud相关代码,确保在Nacos注册成功),示例代码如下:
@FeignClient(name = "sc-nacos-product")
public interface EchoService {
@GetMapping(value = "/echo/{str}")
String echo(@PathVariable(value = "str") String str);
}
启动类如下:
@SpringBootApplication
@EnableDubbo
@EnableFeignClients
public class DubboNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboNacosConsumerApplication.class, args);
}
}
调用示例代码如下:
@Component
public class Consumer implements CommandLineRunner {
@DubboReference(providedBy = "sc-nacos-product",check = false)
private EchoService echoService;
@Override
public void run(String... args) throws Exception {
String result = echoService.echo("world");
System.out.println("Receive result ======> " + result);
}
}
执行结果如图:
百度对该问题的解答非常少,无外乎是否注册成功,配置是否正确,似乎这些方案并不能解决我的问题。
问题解决
然后我就去Github寻求答案,发现官方确实是支持了Feign的调用方式,如图所示:
然后也发现一个遇到相同错误的问题,但是该问题却一直未关闭,看样子是未解决。
突然灵感爆发,该不会真的是版本问题把,但是官方都是3.3+的版本,然后我就说尝试一下,先将版本升高,没有解决,然后说把版本降低试试(需要单独引入Http依赖),依赖如下所示:
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.17</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version>
</dependency>
然后重新启动,发现真的请求成功了,如图所示:
也真是大无语,官方的示例居然跑不通,估计代码被覆盖了,文章换了个版本就直接更新了。。。