この記事の出所:GitHubにはこちらをクリック・ || GitEEは・こちらをクリック
A、飼育係の基礎入門
1、概念の紹介
飼育係は、アプリケーションがシステム・アーキテクチャのための協調的なサービスを提供するために、Apacheのオープンソースで配布さ。デザインパターンの観点から見に:これは、オブザーバーデザインパターンのためのコンポーネントベースのフレームワークであるデータを格納し、管理する責任があり、視聴者は登録を受け付け、データの状態が変化したら、それはすでに観察飼育係に登録飼育係に通知する責任を負うことになります誰も同様のクラスタマスター/スレーブの管理を実現するためには、それに応じて反応します。ZooKeeperの目標は、より良いカプセル化、複雑なエラーが発生しやすい重要なサービス、ユーザーにシステムのインタフェースで効率的なパフォーマンス、機能性と安定性を使用して簡単にです。
2、基本的な理論
- データの構造
ZooKeeperのレコードと同様のデータ構造と、Linuxのファイルシステムは、全体として木、のznodeと呼ばれる各ノードとして見ることができます。データを記憶することができるそれぞれのznodeデフォルトの1メガバイトは、それぞれのznodeを一意にパスによって識別されます。
- ノードタイプ
ブリーフ(はかない):クライアントとサーバーが切断された後、ノードは自動的に削除作成されます。
永続的(永続):クライアントとサーバーが切断された後、ノードは、持続的な保全を作成します。
- クラスタサービス
飼育係のクラスタサービスは、リーダー(リーダー)によって、クラスタ内の組成物のより多くのフォロワー(フォロワー)です。解像度に開始し、投票を担当する指導者、およびクラスタサービスのステータスを更新します。クライアント要求を受信するためのフォロワーは選挙リーダープロセスに投票する、クライアントに結果を返します。限り複数のクラスタノードの生存率の半分以下として、飼育係クラスタは通常のサービスすることができるであろう。
- データの一貫性
同じデータのコピーを保存する各サーバは、関係なく、クラスタでサーバプロセスへのクライアント要求の、得られたデータが一致しています。
3、アプリケーションのシナリオ
- Classicアプリケーション:ダボサービスフレームワークの登録と発見。
- 分散メッセージの同期と調整メカニズム。
- 上下ダイナミック・サーバ・ノード。
- 統一された構成管理、負荷分散、クラスタ管理。
第二に、セキュリティ管理操作
1、オペレーティング権限
ZooKeeperのは5つの操作権限があるノード:、READ(チェック)、WRITE(変化する)、DELETE(削除)、ADMIN(管理)およびその他の関連する権利を(増加)を作成し、アクセス権の5セットはcrwda、各単語と略記することができます最初の文字のモザイク。
2、認証:
- 世界
自由にアクセスを全世界のためのソリューションをことができることを意味し、デフォルトモード、オープンなアクセス許可、。
- 認証
ユーザーが許可し、それらがアクセスする前に認証されています。
- ダイジェスト
ユーザー名:パスワード認証モードでは、実際のビジネスの発展は、最も一般的な方法です。
- IPホワイトリスト
IPアドレスのAUTHORIZEを指定し、指定されたポイントの権限は、アクセスを制御します。
3、ダイジェスト認証プロセス
- ユーザ認証を追加します
addauthダイジェストユーザ名:パスワード
- アクセス許可を設定します
SETACL /パス認証:ユーザー名:パスワード:権限
- ビューACLを設定します
GETACL /パス
- 業務プロセスを完了します
-- 添加授权用户
[zk: localhost:2181] addauth digest smile:123456
-- 创建节点
[zk: localhost:2181] create /cicada cicada
-- 节点授权
[zk: localhost:2181] setAcl /cicada auth:smile:123456:cdrwa
-- 查看授权
[zk: localhost:2181] getAcl /cicada
第三に、統合フレームワークのSpringBoot2
コアに依存する1
キュレーターは組立、クライアント接続と操作二次包装のためのキュレーターフレーム飼育係のネイティブAPIインタフェース、オープンソースのApache飼育係です。ZooKeeperのは、アプリケーションのさまざまなシナリオが用意されています。そのような分散キューAPIパッケージとして分散ロック・サービスは、クラスタのリーダーシップの選挙、共有カウンタ、キャッシュ機構、例えば:。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>2.12.0</version>
</dependency>
2、飼育係のパラメータ
zoo:
keeper:
#开启标志
enabled: true
#服务器地址
server: 127.0.0.1:2181
#命名空间,被称为ZNode
namespace: cicada
#权限控制,加密
digest: smile:123456
#会话超时时间
sessionTimeoutMs: 3000
#连接超时时间
connectionTimeoutMs: 60000
#最大重试次数
maxRetries: 2
#初始休眠时间
baseSleepTimeMs: 1000
3、初期設定サービス
@Configuration
public class ZookeeperConfig {
private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperConfig.class) ;
@Resource
private ZookeeperParam zookeeperParam ;
private static CuratorFramework client = null ;
/**
* 初始化
*/
@PostConstruct
public void init (){
//重试策略,初试时间1秒,重试10次
RetryPolicy policy = new ExponentialBackoffRetry(
zookeeperParam.getBaseSleepTimeMs(),
zookeeperParam.getMaxRetries());
//通过工厂创建Curator
client = CuratorFrameworkFactory.builder()
.connectString(zookeeperParam.getServer())
.authorization("digest",zookeeperParam.getDigest().getBytes())
.connectionTimeoutMs(zookeeperParam.getConnectionTimeoutMs())
.sessionTimeoutMs(zookeeperParam.getSessionTimeoutMs())
.retryPolicy(policy).build();
//开启连接
client.start();
LOGGER.info("zookeeper 初始化完成...");
}
public static CuratorFramework getClient (){
return client ;
}
public static void closeClient (){
if (client != null){
client.close();
}
}
}
4、シリーズインタフェースパッケージ
public interface ZookeeperService {
/**
* 判断节点是否存在
*/
boolean isExistNode (final String path) ;
/**
* 创建节点
*/
void createNode (CreateMode mode,String path ) ;
/**
* 设置节点数据
*/
void setNodeData (String path, String nodeData) ;
/**
* 创建节点
*/
void createNodeAndData (CreateMode mode, String path , String nodeData) ;
/**
* 获取节点数据
*/
String getNodeData (String path) ;
/**
* 获取节点下数据
*/
List<String> getNodeChild (String path) ;
/**
* 是否递归删除节点
*/
void deleteNode (String path,Boolean recursive) ;
/**
* 获取读写锁
*/
InterProcessReadWriteLock getReadWriteLock (String path) ;
}
5、インタフェース
@Service
public class ZookeeperServiceImpl implements ZookeeperService {
private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperServiceImpl.class);
@Override
public boolean isExistNode(String path) {
CuratorFramework client = ZookeeperConfig.getClient();
client.sync() ;
try {
Stat stat = client.checkExists().forPath(path);
return client.checkExists().forPath(path) != null;
} catch (Exception e) {
LOGGER.error("isExistNode error...", e);
e.printStackTrace();
}
return false;
}
@Override
public void createNode(CreateMode mode, String path) {
CuratorFramework client = ZookeeperConfig.getClient() ;
try {
// 递归创建所需父节点
client.create().creatingParentsIfNeeded().withMode(mode).forPath(path);
} catch (Exception e) {
LOGGER.error("createNode error...", e);
e.printStackTrace();
}
}
@Override
public void setNodeData(String path, String nodeData) {
CuratorFramework client = ZookeeperConfig.getClient() ;
try {
// 设置节点数据
client.setData().forPath(path, nodeData.getBytes("UTF-8"));
} catch (Exception e) {
LOGGER.error("setNodeData error...", e);
e.printStackTrace();
}
}
@Override
public void createNodeAndData(CreateMode mode, String path, String nodeData) {
CuratorFramework client = ZookeeperConfig.getClient() ;
try {
// 创建节点,关联数据
client.create().creatingParentsIfNeeded().withMode(mode)
.forPath(path,nodeData.getBytes("UTF-8"));
} catch (Exception e) {
LOGGER.error("createNode error...", e);
e.printStackTrace();
}
}
@Override
public String getNodeData(String path) {
CuratorFramework client = ZookeeperConfig.getClient() ;
try {
// 数据读取和转换
byte[] dataByte = client.getData().forPath(path) ;
String data = new String(dataByte,"UTF-8") ;
if (StringUtils.isNotEmpty(data)){
return data ;
}
}catch (Exception e) {
LOGGER.error("getNodeData error...", e);
e.printStackTrace();
}
return null;
}
@Override
public List<String> getNodeChild(String path) {
CuratorFramework client = ZookeeperConfig.getClient() ;
List<String> nodeChildDataList = new ArrayList<>();
try {
// 节点下数据集
nodeChildDataList = client.getChildren().forPath(path);
} catch (Exception e) {
LOGGER.error("getNodeChild error...", e);
e.printStackTrace();
}
return nodeChildDataList;
}
@Override
public void deleteNode(String path, Boolean recursive) {
CuratorFramework client = ZookeeperConfig.getClient() ;
try {
if(recursive) {
// 递归删除节点
client.delete().guaranteed().deletingChildrenIfNeeded().forPath(path);
} else {
// 删除单个节点
client.delete().guaranteed().forPath(path);
}
} catch (Exception e) {
LOGGER.error("deleteNode error...", e);
e.printStackTrace();
}
}
@Override
public InterProcessReadWriteLock getReadWriteLock(String path) {
CuratorFramework client = ZookeeperConfig.getClient() ;
// 写锁互斥、读写互斥
InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, path);
return readWriteLock ;
}
}
Swagger2インターフェイスに基づいて6、
@Api("Zookeeper接口管理")
@RestController
public class ZookeeperApi {
@Resource
private ZookeeperService zookeeperService ;
@ApiOperation(value="查询节点数据")
@GetMapping("/getNodeData")
public String getNodeData (String path) {
return zookeeperService.getNodeData(path) ;
}
@ApiOperation(value="判断节点是否存在")
@GetMapping("/isExistNode")
public boolean isExistNode (final String path){
return zookeeperService.isExistNode(path) ;
}
@ApiOperation(value="创建节点")
@GetMapping("/createNode")
public String createNode (CreateMode mode, String path ){
zookeeperService.createNode(mode,path) ;
return "success" ;
}
@ApiOperation(value="设置节点数据")
@GetMapping("/setNodeData")
public String setNodeData (String path, String nodeData) {
zookeeperService.setNodeData(path,nodeData) ;
return "success" ;
}
@ApiOperation(value="创建并设置节点数据")
@GetMapping("/createNodeAndData")
public String createNodeAndData (CreateMode mode, String path , String nodeData){
zookeeperService.createNodeAndData(mode,path,nodeData) ;
return "success" ;
}
@ApiOperation(value="递归获取节点数据")
@GetMapping("/getNodeChild")
public List<String> getNodeChild (String path) {
return zookeeperService.getNodeChild(path) ;
}
@ApiOperation(value="是否递归删除节点")
@GetMapping("/deleteNode")
public String deleteNode (String path,Boolean recursive) {
zookeeperService.deleteNode(path,recursive) ;
return "success" ;
}
}
第四に、送信元アドレス
GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent