zookeeper
什么是zookeeper
zookeeper主要服务于分布式系统,使用类似于unix的文件系统管理模式(树状结构)来管理多个节点(znode),还使用监听器管理znode节点的数据变化和子节点的增减变化
应用场景
- 统一配置管理
多个机器上面的配置大同小异时,将公共的配置放到zookeeper的znode节点中,系统A,B,C监听节点有没有做变更,有变更则及时响应,避免同时更改多个服务器配置文件所带来的麻烦 - 统一命名服务
因为zookeeper树状结构实现,可以生成一些唯一的命名,统一命名服务的理解其实跟域名一样,是我们为这某一部分的资源给它取一个名字,别人通过这个名字就可以拿到对应的资源 - 分布式锁
多个服务之间保证资源一致性需要分布式锁实现,
多个系统访问的时候会创建带顺序号的临时/短暂(EPHEMERAL_SEQUENTIAL
)节点,比如,系统A创建了id_000000
节点,系统B创建了id_000002
节点,系统C创建了id_000001
节点。接着,拿到/locks
节点下的所有子节点(id_000000,id_000001,id_000002),判断自己创建的是不是最小的那个节点
- 如果是,则拿到锁。
- 释放锁:执行完操作后,把创建的节点给删掉
- 如果不是,则监听比自己要小1的节点变化
- 队列管理
(4)队列管理
两种类型的队列:
1、 同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。
dubbo
什么是dubbo
dubbo是一个分布式的服务调度框架,可以提供服务注册、服务发现、服务消费,
类似于springcloud的eruka等组件,将服务和消费者注册到注册中心,并用监控器监控所有服务,主要有
provider
用于暴露服务提供者的服务
consumer
用于消费服务提供者的服务
Registry
服务注册与发现的注册中心。
Monitor
统计服务的调用次调和调用时间的监控中心。
Container
服务运行容器。
买票服务示例
接口服务
接口单独实现一个model,provider和consumer都引入接口服务的依赖,就可以将所有接口单独管理,注意消费者和生产者的service方法路径得一致
public interface TicketService {
String getTicket();
}
服务提供者
pom.xml
<!--引入接口服务依赖-->
<dependency>
<groupId>com.wzb</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
properties.yml
dubbo:
application:
name: dubbo_provider
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://127.0.0.1:2181
protocol: zookeeper
scan:
base-packages: com.wzb.provider.service
spring:
application:
name: dubbo_auto_configuration_provider_demo
server:
port: 8080
service
//@Service使用的是dubbo的service注解
@Service(version = "1.0.0",interfaceClass = TicketService.class)
public class ProviderTicketService implements TicketService {
@Override
public String getTicket() {
return "芳华";
}
}
服务消费者
1.pom.xml文件和消费者一致
2.properties.yml如下
dubbo:
application:
name: dubbo_consumer
registry:
address: zookeeper://127.0.0.1:2181
protocol: zookeeper
server:
port: 8085
3.service
@Service
public class ConsumerTicketService {
@Reference(version = "1.0.0",interfaceClass = TicketService.class)
private TicketService ticketService;
public String buyTicket(String user) {
return "welcome "+ user+" to see " + ticketService.getTicket();
}
}
这样启用provider和consumer服务,将服务注册到zookeeper,并通过dubbo进行服务发现和调用,就可以实现一个简单的分布式调用
最后:调用 买票
结果如下图所示: