Dubbo 的 Java 项目间调用的完整示例
1. 项目结构
假设项目分为三个模块:
api:定义服务接口
provider:服务提供者
consumer:服务消费者
2. 依赖配置
在 pom.xml
中添加 Dubbo 和注册中心(如 Nacos)的依赖:
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.0.2</version>
</dependency>
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.0.3</version>
</dependency>
3. 定义服务接口(api 模块)
创建一个服务接口:
package com.example.api;public interface HelloService {String sayHello(String name);
}
4. 服务提供者(provider 模块)
4.1 实现服务接口
package com.example.provider;import com.example.api.HelloService;
import org.apache.dubbo.config.annotation.Service;@Service(version = "1.0.0")
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name;}
}
4.2 配置 Dubbo
在 application.properties
中配置 Dubbo 和注册中心:
properties
dubbo.application.name=hello-service-provider
dubbo.registry.address=nacos://127.0.0.1:8848
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
5. 服务消费者(consumer 模块)
5.1 引用服务接口
在 application.properties
中配置 Dubbo 和注册中心:
properties
dubbo.application.name=hello-service-consumer
dubbo.registry.address=nacos://127.0.0.1:8848
5.2 调用服务
package com.example.consumer;import com.example.api.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@Reference(version = "1.0.0")private HelloService helloService;@GetMapping("/sayHello")public String sayHello(@RequestParam String name) {return helloService.sayHello(name);}
}
6. 启动项目
启动 Nacos 注册中心。
启动服务提供者模块(provider)。
启动服务消费者模块(consumer)。
访问
http://localhost:8080/sayHello?name=Kimi
,即可看到返回结果。
7. 泛化调用示例(可选)
如果需要泛化调用,可以在消费者端使用 GenericService
:
package com.example.consumer;import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.rpc.service.GenericService;public class GenericConsumer {public static void main(String[] args) {ReferenceConfig<GenericService> reference = new ReferenceConfig<>();reference.setInterface("com.example.api.HelloService");reference.setGeneric(true);GenericService genericService = reference.get();String result = genericService.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"Kimi"});System.out.println(result);}
}
泛化调用不需要提前知道服务接口的具体定义。
通过以上步骤,可以实现一个完整的 Dubbo 服务调用案例