环境准备
下载dubbo
连接:https://github.com/apache/dubbo-admin/
选择master,下载到本地解压得到的项目包含如下目录
进入dubbo目录,打开cmd:
运行命令mvn clean install可以在dubbo目录下生成一个target目录,如果执行成功,里面会有一个jar包(这一步很可能会失败,可能是是环境的问题,如果始终无法成功,可以直接拿别人的jar包来使用)
链接:https://pan.baidu.com/s/1gUz9Ygt4j0v8xuPwByL1Pg
提取码:f7gh
运行这个jar包,
这一步一般不会失败,能访问 localhost:7001表示成功。账号密码均为root。
下载zookeeper
地址:https://zookeeper.apache.org/
下载到本地解压后目录结构如下:
进入conf目录,复制zoo_sample.cfg改名为zoo.cfg
进入bin目录,双击运行zkCli.cdm 和 skServer.cmd
客户端控制台出现显示如下表示客户端服务器连接成功。
刚刚一共打开了三个黑框控制台,这个是要一直保持运行状态的,第一个黑框是dubbo,其实是运行一个springboot项目,可以将它放在tomcat中或者挂到服务器上,第二个和第三个黑框是zookeeper的,可以将他们设置为开机启动服务,就像mysql服务一样。
编写案例
需要创建两个项目,两个项目导入的依赖相同
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
1. 服务提供者
首先开启dubbo功能,在springboot主启动类上加上@EnableDubbo注解。
在springboot的配置property配置文件中配置服务注册信息:
server.port=12345
dubbo.application.name=helloService
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.scan.base-packages=com.example.demo.Service
编写服务接口和实现类:
接口:
package com.example.Service;
public interface helloService {
String sayHello();
}
实现类:
package com.example.Service;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
//需要注意,这里的Service注解是dubbo包下的,而不是spring的
@Service
public class helloServiceImpl implements helloService{
@Override
public String sayHello() {
return "hello";
}
}
运行程序,访问 http://localhost:7001/
可以看到服务成功注册:
2. 服务消费者
定义一个接口与下面helloService相同名且相同路径(当然也可以不这么做,后面会讲述第二种方法)。
定义一个服务消费的类,可以是Service也可以是controller等,并将它注册到spring容器中。
这个类是用来调用远程服务的,如下代码所示,我们在类中定义helloService,我们在这个项目中并没有实现这个接口,在服务提供者的项目中才有实现,所以正常情况下我们在这个项目中helloService是不能调用到重写的方法的。此时只需要加上@Reference注解就可以调用别人重写的服务方法了。
@Service
public class consumerService {
@Reference
helloService helloService;
public void getProvider(){
System.out.println(helloService);
String hello=helloService.sayHello();
System.out.println(hello);
System.out.println(helloService);
}
}
编写测试:
@SpringBootTest
class ServiceconsumerApplicationTests {
@Autowired
consumerService consumerService;
@Test
void contextLoads() {
consumerService.getProvider();
}
}
运行后结果如下:
可以知道,消费者项目可以调用到提供者项目提供的方法。