- 提供者(provider)提供服务
- 导入依赖
- 配置注册中心地址,以及服务发现名、要扫描的包
- 在想要被注册的服务上加一个@Service注解(该注解是dubbo下的,不是spring的)。
- 消费者(consumer)消费服务
- 导入依赖
- 配置注册中心地址、服务名
- 远程注入服务
具体实现:
项目分为两个moudle,一个消费者,一个提供者
提供者端
- 导入依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
2.配置注册中心、服务名和扫描的包
server.port=8001
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.example.provider.service
- 给想要被注册的服务加注解
package com.example.provider.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
* @Author Roy Yang
* @Date 2020/3/27 21:37
* @Version 1.0
*/
//zookeeper:服务发现与注册
@Service //可以被扫描到,一启动就自动注册到注册中心
@Component //最好不要用@Service
public class TicketServiceImpl implements TicketService {
public String getTicket() {
return "Roy Yang";
}
}
- 打开zookeeper
- 再开启提供者端,去dubbo-admin下确认服务是否被注册
- 通过java -jar 命令打开 dubbo-admin-0.0.1-SNAPSHOT.jar包,访问localhost:7001,默认登陆用户名和密码均为root。
发现提供的服务已被注册
消费者端
- 导入依赖,同上
- 配置注册中心地址、服务名
server.port=8002
#服务应用名字
dubbo.application.name=consumer-server
#注册中心地址(去此处取数据)
dubbo.registry.address=zookeeper://127.0.0.1:2181
- 编写一个类,从zookeeper中拿到想要的服务(TicketService)
注:此处是通过将provider项目中的TicketService接口原封不动的放到consumer项目中
package com.example.consumer.service;
import com.example.provider.service.TicketService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
/**
* @Author Roy Yang
* @Date 2020/3/28 8:21
* @Version 1.0
*/
@Service //这里是spring的@Service,目的是取到服务将其注入到spring容器中方便后续使用
public class UserService {
//想要provider的提供的服务,要去注册中心拿
//消费者处只给了一个接口,具体实现还在提供者处
@Reference
TicketService ticketService;
public void catchTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到的ticket为:"+ticket);
}
}
- 编写测试,看是否拿到服务
@Test
void contextLoads() {
userService.catchTicket();
}
- 控制台输出结果为:
也可以开启服务端,看dubbo-admin中消费端是否存在
说明消费端也被检测到