SpringBoot与Dubbo和Zookeeper实现分布式
今天就来简单使用Spring Boot与Dubbo及zookeeper整合使用分布式
首先, 先来简单了解一下什么是Dubbo及zookeeper
Zookeeper
Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护,域名服务,分布式同步,组服务等
Dubbo
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度的松耦合),从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色
1. 在Liunx系统下下载Zookeeper, 参考如下命令:
[[email protected] ~]# docker pull registry.docker-cn.com/library/zookeeper
这里的Zookeeper是装在docker中的, 如果大家没有装有docker的话, 可以参考: https://blog.****.net/w1316022737/article/details/83652919
2. 启动Zookeeper, 参考如下命令:
docker run --name 给zookeeper启的名字 -p 2181:2181 --restart always -d 这块为安装的Zookeeper的id
3. 这里采用的工具是IntelliJ IDEA进行开发, 首先建立一个空项目, 如图操作:
4. 在建立的空工程里面, 建立两个项目, 第一个项目为提供服务者(将服务提供者注册到注册中心), 首先建立第一个项目, 如图操作:
在Group处填写包名, Artifact中填写项目名, 其他默认即可, 直接Next
这里选择Web就行了, 一定要选好Spring Boot版本
以上是创建空工程中两个项目的步骤:
5. 编写第一个服务提供者项目, 首先在pom.xml中引入相关依赖
<!--引入dubbo的相关依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!--引入zookeeper的客户端工具-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
6. 在application.properties配置文件中配置相应属性:
#dubbo.application.name表示当前应用的名字
dubbo.application.name=springboot-06-provider-ticker
#dubbo.registry.address表示dubbo要将服务发送到注册中心,值为zookeeper的地址,该地址为虚拟机的zookeeper地址
dubbo.registry.address=zookeeper://这块为Liunx系统的ip加Zookeeper的端口号
#dubbo.scan.base-packages表示要将那个包下的什么发送出去
dubbo.scan.base-packages=com.atguigu.springboot06providerticker.service
7. 编写service接口及实现类
public interface TickerService {
public String getTicker();
}
/**
* 注解Service是dubbo的service
* 该注解的作用是将服务发布出去
*/
@Component
@Service
public class TickerServiceImper implements TickerService {
@Override
public String getTicker() {
return "<厉害了,我的国>";
}
}
8. 参考启动类的注释
/**
* provider-ticker项目是供应者
* consumer-user项目是消费者
* 1.将服务提供者注册到注册中心
* 1)在pom.xml文件中导入dubbo与zookeeper的相关依赖
* 2)在application.properties配置文件中配置相应属性,如:要将那个服务发送出去,发送的地址等
* 3)在service实现类中标注service注解,该注解为dubbo下的
*/
@SpringBootApplication
public class Springboot06ProviderTickerApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot06ProviderTickerApplication.class, args);
}
}
9. 建立第二个消费者项目, 建立项目的步骤和第4步建立项目一样, 建立好项目之后, 首先引入pom.xml文件中的相关依赖:
<!--引入dubbo的相关依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!--引入zookeeper的客户端工具-->
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
10. 在application.properties配置中配置相应属性:
#dubbo.application.name表示当前应用的名字
dubbo.application.name=consumer-user
#dubbo.registry.address表示dubbo要将服务发送到注册中心,值为zookeeper的地址,该地址为虚拟机的zookeeper地址
dubbo.registry.address=zookeeper://这块为Liunx系统的ip加Zookeeper的端口号
11. 复制服务提供者项目中service的全路径, 路径名要和消费者项目的路径名一样, 只需要接口类, 不需要实现类
public interface TickerService {
public String getTicker();
}
12. 编写service
/**
* 引用服务的这块标注的Service注解是spring下的
*/
@Service
public class UserService {
/**
* 注解Reference的作用是远程引用
* 过程:根据TckerService类全类名进行匹配,看谁给注册中心注册了这个全类名的服务
*/
@Reference
TickerService tickerService;
public void hello(){
String ticker = tickerService.getTicker();
System.out.println("买到票了:"+ticker);
}
}
13. 编写测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerUserApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
userService.hello();
}
}
14. 过程请参考启动类注释
/**
* provider-ticker项目是提供者
* consumer-user项目是消费者
* 引用服务:
* 1)在pom.xml文件中导入dubbo与zookeeper的相关依赖
* 2)在application.properties配置文件中配置相应的属性
* 3)引用服务
* 在引用服务时,要将发送服务项目的全路径包复制到引用服务的项目中,包的结构要一模一样,
* 如这块的:springboot06providerticker/service
* 但是不需要发送服务项目中service的实现类
*/
@SpringBootApplication
public class ConsumerUserApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerUserApplication.class, args);
}
}
注: 在测试的时候, 一定要先启动服务提供者, 在启动服务提供者项目时最后从启动类中启动, 保证服务一直是运行状态, 再启动消费者项目中的测试类, 在测试类完成之前, 服务提供者项目的启动类必须一直处于运行状态