1.docker安装zookeeper
docker拉取镜像,默认lastest
docker pull zookeeper
启动zookeeper,只使用到了默认的2181端口,把它映射到主机的12181上
docker run --name zk01 -p 12181:2181 --restart always -d zookeeper
2.新建整合工程
1.新建一个springboot-dubbo的空工程,再在这个工程下面,按照dubbo分布式的要求,将生产者(provider-ticker)和消费者(consumer-user)分别建立工程。
2.生产者(provider-ticker)和消费者(consumer-user),pom.xml文件中导入dubbo和zookeeper的jar包,为了方便测试,加上web和test。
<!-- dubbo -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<!-- 引入zookeeper的依赖,和服务器上的zookeeper版本对应 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency>
<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>
3.provider
application.yml文件配置扫描路径和注册地址:
dubbo:
application:
name: provider-ticket
registry:
address: zookeeper://192.168.99.100:12181
scan:
base-packages: com.pc.providerticket.service
注意,这些配置我写在application.properties文件上面的时候,后面测试的时候发生了空指针异常,消费者没能调用到生产者提供的方法,但是写在application.yml文件中就没问题,很奇怪。
新建service包和TicketService接口:
package com.pc.providerticket.service
public interface TicketService {
public String getTicket();
}
新建其实现类:
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
@Service
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket(){
return "《海上钢琴师》";
}
}
记得打上标签,其中@Service是dubbo中的标签,不要搞错。
在Application中使用@EnableDubbo,启用dubbo:
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 1.注册服务提供者
* 1、引入dubbo和zkclient依赖
* 2、配置dubbo扫描路径和注册中心地址
* 3、使用@Service发布服务
*/
@EnableDubbo
@SpringBootApplication
public class ProviderTicketApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderTicketApplication.class, args);
}
}
启动provider-ticker
4.consumer
application.yml的配置,指定了zookeeper的注册地址:
dubbo:
application:
name: consumer-user
registry:
address: zookeeper://192.168.99.100:12181
在consumer-user项目中建路径和provider-ticker中TicketService一样的接口:
package com.pc.providerticket.service;
public interface TicketService {
public String getTicket();
}
效果是TicketService所在包和项目新建时自动生成的consumeruser同级:
在consumeruser下建service包和ConsumerService:
import com.alibaba.dubbo.config.annotation.Reference;
import com.pc.providerticket.service.TicketService;
import org.springframework.stereotype.Service;
@Service
public class ConsumerService {
@Reference
TicketService ticketService;
public void hello(){
String ticket = ticketService.getTicket();
System.out.println("买到"+ticket+"的票了");
}
}
这里面的@Service标签是springboot的标签了,ticketService上面的@Reference标签是dubbo的标签。
在Application类中使用@EnableDubbo,启用dubbo:
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ConsumerUserApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerUserApplication.class, args);
}
}
5.测试
可以使用web去访问,这里就偷懒直接在test里面做了:
import com.pc.consumeruser.service.ConsumerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerUserApplicationTests {
@Autowired
ConsumerService consumerService;
@Test
public void contextLoads() {
consumerService.hello();
}
}
运行测试方法,在控制台看到“买到《海上钢琴师》的票了”,就表示成功喽!