1.dubbo和Zookeeper
1.简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集,提供Java和C的接口。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口.
2.dubbo和zookeeper使用
1.需要下载zookeeper组件进行启动
window使用直接解压版
默认端口号 : 2181
启动 zkserver.cmd
连接 zkcli.cmd
1.配置文件详解
tickTime:基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每隔 tickTime时间就会发送一个心跳。
dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
initLimit:这个配置项是用来配置 Zookeeper 接受客户端初始化连接时最长能忍受多少个心跳时间间隔数,当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒
server.A = B:C:D
A表示这个是第几号服务器
B 是这个服务器的 ip 地址
C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口
D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader
2.运行dubbo监控台
将打包好的dubbo的jar包 使用 Java -jar 命令执行
地址 localhost:7001
用户名 密码 root root
3.如何在项目中多模块配置提供者 ,注册中心,消费者
1.创建项目
1.创建一个springboot 项目 ,不勾选javaweb
2.删除除pom文件之外的目录
3.刷新maven
4.创建新的模块 (module)javaweb 项目
分别 为 :privider api consumer
2.父级pom文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.kgc.sbt</groupId>
<artifactId>springboot-09-dubbo-88</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-09-dubbo-88</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<dubbo.version>0.1.0</dubbo.version>
<zkclient.version>0.10</zkclient.version>
</properties>
<modules>
<module>deoccenter-provider</module>
<module>edoccenter-api</module>
<module>edoccenter-consumer</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>edoccenter-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
// 修改父级pom
// 添加模块管理 module 管理的是 配置文件中dubbo.application.name
// dependencyManagement 管理版本依赖,在子模块的pom中添加的依赖如果背父pom管理了,就不要添加版本,注意;新添加的jar包,必须通过dependency去下载
// 无需打包 所以 <artifactId>spring-boot-maven-plugin</artifactId> 无需添加
3.privider(提供者)配置
1.pom修改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.kgc.sbt</groupId>
<artifactId>springboot-09-dubbo-88</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>deoccenter-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>deoccenter-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>edoccenter-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.配置文件修改
# 端口
server.port=8088
# dubbo+zookeeper配置
dubbo.application.name=edoc-provider //统一的提供者的名称
dubbo.registry.address=127.0.0.1:2181 // 注册中心的ip
dubbo.registry.protocol=zookeeper // 注册协议
dubbo.protocol.port=20880 // 注册id号
# 从20880开始 也可以使用-1 // -1是dubbo自动寻找空置的id进行配置
# 只需要记住扫描@service注解所在的父包
dubbo.scan.base-packages=com.kgc.sbt.edoc.provider // 将包内的类注册为提供者
3.启动类上启用@EnableDubbo
@SpringBootApplication
@EnableDubbo
@MapperScan("com.kgc.sbt.edoc.mapper")
public class DeoccenterProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DeoccenterProviderApplication.class, args);
}
}
4.编写提供者程序,并使用@Service注解
@Service
public class EdocEntryProvider implements EdocQueryApi {
@Autowired
private EdocEntryMapper edocEntryMapper;
@Override
public EdocEntry queryEdocEntryById(Integer id) {
return edocEntryMapper.selectEdocEntryById(id);
}
}
4.consumer(消费者)配置
1.pom文件修改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.kgc.sbt</groupId>
<artifactId>springboot-09-dubbo-88</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>edoccenter-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>edoccenter-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
</dependency>
<dependency>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>edoccenter-api</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.配置文件修改
# 端口号
server.port=8089
# dubbo+zookeeper配置
dubbo.application.name=edoc-consumer
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
dubbo.scan.base-packages=
3.使用@Reference 注册为消费者
@Service
public class EdocEntryServiceImpl implements EdocEntryService {
@Reference
private EdocQueryApi edocQueryApi;
@Override
public EdocEntry queryEntryById(Integer id) {
return edocQueryApi.queryEdocEntryById(id);
}
}
5.api -注册中心
1.加入pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.kgc.sbt</groupId>
<artifactId>springboot-09-dubbo-88</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.kgc.sbt.edoc</groupId>
<artifactId>edoccenter-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>edoccenter-api</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
2.无需配置文件,因为只是将提供者的接口打包成jar包,以便其他模块的依赖
3.创建公共接口
public interface EdocQueryApi {
EdocEntry queryEdocEntryById(Integer id);
}
2.dubbo的管理功能
提供者
权重 : 设置调用该接口的几率
消费者
容错 : 设置可以查询为null,友好的页面返回
禁止: 禁止该消费者调用接口
负载均衡:可以设置调用的接口的方法
随机 :
轮询 : 来回访问
最少并发 : 自动识别访问最少的机器