Nacos-dubbo服务调用
1. 服务提供者
首先创建一个空的项目。在项目中创建两个项目,分别为 service-api , service-server。
service-api: 存放接口,独立成一个工程方便被其它服务工程依赖。
service-server: 存放接口实现,即dubbo服务的实现部分。
service-api 工程:
在pom文件中添加
<packaging>pom</packaging>
//定义一个接口
public interface ServiceApi {
public String dubboService();
}
service-server工程:
- 添加依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--添加service-api工程依赖-->
<dependency>
<groupId>org.sparks</groupId>
<artifactId>dubbo-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
1.1 配置文件 bootstrap.yml
server:
port: 8100 #启动端口 命令行注入
spring:
application:
name: dubbo_service
main:
allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
scan:
# dubbo 服务扫描基准包
base‐packages: com.sparks.dubbo.service.api
protocol:
# dubbo 协议
name: dubbo
port: 20891 # dubbo 协议端口
registry:
address: nacos://localhost:8848
application:
qos‐enable: false #dubbo运维服务是否开启
consumer:
check: false #启动时就否检查依赖的服务
1.2 启动类与接口实现
接口实现:
import org.apache.dubbo.config.annotation.Service;
@Service
public class ServiceApiImpl implements ServiceApi{
public String dubboService() {
return "dubboService";
}
}
注意 @Service 的包路径。
启动类:
@SpringBootApplication
public class ServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class,args);
}
}
启动服务提供者。
出现的问题:
启动时报错:Connection refused(Connection refused)
原因:dubbo获取本机所有网卡中的ip地址,然后拿到第一个不是127.0.0.1的那个ip。
解决:在 bootstrap.yml 中添加
dubbo:
provider:
host: 主机ip
2. 消费者调用接口
添加依赖:
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!-- service-api接口依赖-->
<dependency>
<groupId>org.sparks</groupId>
<artifactId>dubbo-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
实现接口调用:
import org.apache.dubbo.config.annotation.Reference;
@RestController
public class ConsumerController {
@Reference
ServiceApi serviceApi;
@GetMapping(value = "/dubbo")
public String dubboService2(){
//远程调用service2
String providerResult = serviceApi.dubboService();
return "consumer dubbo invoke | " + providerResult;
}
}
注意 @Reference 的包路径,不要导错包。
启动消费者。请求路径: http://localhost:9000/dubbo,
出现 consumer dubbo invoke | dubboService 表示消费者成功调用 service.
3. service2
service2服务提供者
功能:
实现消费者调用 service-2 , service-2 调用 service。
步骤:
如上,创建dubbo-service2 父工程。
创建 dubbo-service2-api工程。
创建 dubbo-service2-server工程。
dubbo-service2-api工程:
接口:
public interface Service2Api {
public String dubboService2();
}
dubbo-service2-server 工程
导入依赖:
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--service-api工程依赖-->
<dependency>
<groupId>org.sparks</groupId>
<artifactId>dubbo-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--service2-api工程依赖-->
<dependency>
<groupId>org.sparks</groupId>
<artifactId>dubbo-service2-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
接口实现: 调用 service1 接口 。
@Service
public class Service2ApiImpl implements Service2Api{
@Reference
ServiceApi serviceApi;
public String dubboService2() {
//调用service1
String s1 = serviceApi.dubboService();
return "dubboService2|" + s1;
}
}
配置文件只需修改:
server:
port: 8101 #启动端口 命令行注入
spring:
application:
name: dubbo_service_2
dubbo:
scan:
base‐packages: com.sparks.dubbo.service2.api
protocol:
port: 20892
4. 启动消费者
添加 service2-api 依赖
<dependency>
<groupId>org.sparks</groupId>
<artifactId>dubbo-service2-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
调用 service2接口
@RestController
public class Service2Controller {
@Reference
Service2Api service2Api;
@GetMapping(value = "/dubbo2")
public String service1() {
String providerResult = service2Api.dubboService2();
return "consumer dubbo invoke | " + providerResult;
}
}
将 service1 service2 consumer 分别启动后,
访问 localhost:9000/dubbo2
出现 consumer dubbo invoke | dubboService2|dubboService 表示服务调用成功。