创建常量接口

com.bjsxt.constant.Constants

package com.bjsxt.constant;

public interface Constants {
//访问ZooKeeper集群的URL
String host="192.168.181.129:2181,192.168.181.129:2182,192.168.181.129:2183,"; //连接ZooKeeper的超时时间
int ZK_TIME_OUT=5000; //ZooKeeper集群中注册服务的URL永久结点
String ZK_REGISTER="/provider"; //ZooKeeper集群中注册服务的URL瞬时结点
String ZK_RMI=ZK_REGISTER+"/rmi";
}

com.bjsxt.service.impl.UserService

package com.bjsxt.service.impl;

import java.rmi.Remote;
import java.rmi.RemoteException; public interface UserService extends Remote { public String helloRem(String name) throws RemoteException; }

实现类接口

com.bjsxt.service.impl.impl.UserServiceImpl

package com.bjsxt.service.impl.impl;

import com.bjsxt.service.impl.UserService;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class UserServiceImpl extends UnicastRemoteObject implements UserService {
public UserServiceImpl() throws RemoteException {
} @Override
public String helloRem(String name) throws RemoteException { return "name= "+name;
}
}

创建服务地址的写入节点

com.bjsxt.service.impl.impl.ServiceProvider

package com.bjsxt.service.impl.impl;

import com.bjsxt.constant.Constants;
import org.apache.zookeeper.*; import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.util.concurrent.CountDownLatch; public class ServiceProvider {
CountDownLatch latch=new CountDownLatch(1); /***
* 连接ZooKeeper集群
*/
public ZooKeeper connectZk(){
ZooKeeper zk=null;
try {
zk=new ZooKeeper(Constants.host, Constants.ZK_TIME_OUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
// 判断是否连接zk集群
if (event.getState()==Event.KeeperState.SyncConnected){
latch.countDown();//唤醒处于等待状态的连接
}
}
});
latch.await(); //使当前线程处于等待状态
}catch (Exception e){
e.printStackTrace();
}
return zk;
} /**
* 创建znode结点
*/
public void createNode(ZooKeeper zk,String url){ try {
//将保存的数据URL转换成字节数组
byte[] data=url.getBytes();
zk.create(Constants.ZK_RMI,data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); }catch (Exception e){
e.printStackTrace();
}
} /**
* 发布rmi服务,并且将服务的URL注册到zk集群中
*/
public String publishService(Remote remote,String host,int port){
String url=null;
try {
LocateRegistry.createRegistry(port);
url="rmi://"+host+":"+port+"/rmiservice";
Naming.bind(url,remote);
}catch (Exception e){
e.printStackTrace();
}
return url;
} }

发布 RMI 服务

  /**
* 发布rmi服务,并且将服务的url注册到zk集群
*/
public void publish(Remote remote,String host,int port){
//调用publishService,返回值服务url
String url = publishService(remote, host, port);
if (url!=null){
ZooKeeper zk=connectZk();
if (zk!=null){
createNode(zk,url);
}
}
}

创建启动类

注意:

运行三次启动类,实现服务的集群发布,提高服务的高可用行(HA),每次启动端口号需要修改拷贝前一天课程发布 RMI 服务的 UserService 接口和 UserServiceImpl 实现类

com.bjsxt.app.ZkClusterProviderApp

package com.bjsxt.app;

import com.bjsxt.service.impl.UserService;
import com.bjsxt.service.impl.impl.ServiceProvider;
import com.bjsxt.service.impl.impl.UserServiceImpl; import java.rmi.RemoteException; public class ZkClusterProviderApp {
public static void main(String[] args) throws RemoteException {
//创建ServiceProvider对象
ServiceProvider serviceProvider=new ServiceProvider(); //创建UserService对象
UserService userService=new UserServiceImpl();
System.out.println("==========7777================");
serviceProvider.publish(userService,"localhost",7777); }
}

使用 Zookeeper 的 Api 实现服务注册的更多相关文章

  1. .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡

    大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...

  2. 基于ZooKeeper实现简单的服务注册于发现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...

  3. 使用 Zookeeper 的 Api 实现服务订阅

    服务提供者 服务提供者中拷贝 Constants 服务提供者中拷贝 UserService 连接 Zk 集群 /*** * 连接ZooKeeper集群 */ public ZooKeeper conn ...

  4. 【转帖】基于Zookeeper的服务注册与发现

    http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...

  5. .netcore consul实现服务注册与发现-集群完整版

    原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍    Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...

  6. .netcore consul实现服务注册与发现-集群部署

    一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关 ...

  7. 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面

    Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器 Consul   自动服务发现    健康检查 通过Ocelot搭建API网关   服务注册   负载均衡 1. ...

  8. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  9. 微服务~Consul服务注册与发现

    服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利 ...

随机推荐

  1. 使用websocketpp进行websocket通信

    websocketpp介绍 websocketpp是一个只有头文件的支持websocket协议的C++开源库,支持websocket客户端和服务器功能,网络传输模块基于boost::asio 提供 s ...

  2. [LC]234题 Linked List Cycle (回文链表)(链表)

    ①中文题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2输出: false示例 2: 输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间 ...

  3. Python 常用模块系列学习(1)--random模块常用function总结--简单应用--验证码生成

    random模块--random是一个生成器 首先: import random    #导入模块 print (help(random))    #打印random模块帮助信息 常用function ...

  4. nyoj 22-素数求和问题(打表)

    22-素数求和问题 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:41 submit:52 题目描述: 现在给你N个数(0<N<1000 ...

  5. 【Leetcode 做题学算法周刊】第四期

    首发于微信公众号<前端成长记>,写于 2019.11.21 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 67 ...

  6. centos安装后第一次重启,许可协议、Kdump

    1.许可协议,服务器键盘操作找到许可 确定(遇到过,第一次懵逼了) 2.Kdump是RHEL提供的一个崩溃转储功能,用于在系统发生故障时提供分析数据,它会占用系统内存,一般选择关闭(默认是关闭)(这个 ...

  7. easyui+ef实现省市区三级联动

    1.引用easyui样式及脚本文件 2.数据库创建表(自联表)及数据建模(Code First) use DataBase go CREATE TABLE OP_SJ ( CID UNIQUEIDEN ...

  8. HashMap的源码学习以及性能分析

    HashMap的源码学习以及性能分析 一).Map接口的实现类 HashTable.HashMap.LinkedHashMap.TreeMap 二).HashMap和HashTable的区别 1).H ...

  9. 携程Apollo简单入门教程这一篇就够了

    1. Apollo背景 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善的权限.审核机制……   废话不多说,参考官方文档   如果不想看文档, 也没关系, 跟 ...

  10. LoadRunner中的90%响应时间

    LoadRunner中的90%响应时间是什么意思?这个值在进行性能分析时有什么作用? 为什么要有90%用户响应时间? 这个跟超女.舞林大会等比赛那样在比赛后都要去掉一个最高分一个最低分在取平均值有点类 ...