使用 Zookeeper 的 Api 实现服务注册

创建常量接口
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 实现服务注册的更多相关文章
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
- 基于ZooKeeper实现简单的服务注册于发现
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...
- 使用 Zookeeper 的 Api 实现服务订阅
服务提供者 服务提供者中拷贝 Constants 服务提供者中拷贝 UserService 连接 Zk 集群 /*** * 连接ZooKeeper集群 */ public ZooKeeper conn ...
- 【转帖】基于Zookeeper的服务注册与发现
http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...
- .netcore consul实现服务注册与发现-集群完整版
原文:.netcore consul实现服务注册与发现-集群完整版 一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Clien ...
- .netcore consul实现服务注册与发现-集群部署
一.Consul的集群介绍 Consul Agent有两种运行模式:Server和Client.这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关 ...
- 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面
Ocelot 路由 请求聚合 服务发现 认证 鉴权 限流熔断 内置负载均衡器 Consul 自动服务发现 健康检查 通过Ocelot搭建API网关 服务注册 负载均衡 1. ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- 微服务~Consul服务注册与发现
服务发现是基于微服务架构的关键原则之一.尝试配置每个客户端或某种形式的约定可能非常困难,可以非常脆弱.Consul通过HTTP API和DNS提供服务发现服务.Spring Cloud Consul利 ...
随机推荐
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作
一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...
- C# web项目中sql数据库转sqlite数据库
最近做了一个小网站,用到了一个使用sql server 2005的.net cms系统,但是现在我所买虚拟主机的服务商,不给虚拟主机提供sql server服务了,那就转数据库吧,转啥好呢,思来想去, ...
- 实现支持多用户在线的FTP程序(C/S)
1. 需求 1. 用户加密认证 2. 允许多用户登录 3. 每个用户都有自己的家目录,且只能访问自己的家目录 4. 对用户进行磁盘分配,每一个用户的可用空间可以自己设置 5. 允许用户在ftp ser ...
- linux引导之grub2
先了解下什么是Bootloader 以下是百度百科释意 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适 ...
- 详细讲解 Redis 的两种安装部署方式
Redis 是一款比较常用的 NoSQL 数据库,我们通常使用 Redis 来做缓存,这是一篇关于 Redis 安装的文章,所以不会涉及到 Redis 的高级特性和使用场景,Redis 能够兼容绝大部 ...
- 如何在 PHP 和 Laravel 中使用 Traits
事实上,PHP 作为一门编程语言存在的问题之一,就是你只能使用单继承.这意味着一个类只能从另一个类中继承.例如,可能希望从几个不同的类继承方法,以防止代码重复.在 PHP 5.4 中 一个新的语言特性 ...
- Java自动生成数据
最近在造数据库中的表数据,写了些数据生成类 可以随机生成姓名.性别,民族,出生日期,身份证号,手机号,邮箱,身高,文化程度,地址,单位,日期时间,编码等 package com.util.create ...
- Zabbix-(五)监控Docker容器与自定义jvm监控项
Zabbix-(五)监控Docker容器与自定义jvm监控项 一.前言 前文中讲述了Zabbix对服务器硬件方面的监控功能,本文将讲述利用Zabbix监控Docker容器中的Java Web服务,并通 ...
- 注意android辅助服务事件不能用于保存
本来希望把来自辅助服务的事件,像epoll那样暂存在队列进行调度,或者做成事件堆栈,从而将辅助服务事件加入到容器.但是一直不能达到预期的后果.最后才发现一个坑人的事实,辅助服务事件被释放(或者说重置) ...
- 在linux系统下进行pip升级注意事项
今天鼓捣爬虫的时候需要用pip安装beautifulsoup4,但是出现了错误,说我的pip版本太低,需要升级一下.刚开始我用了下面这段代码: pip install --upgrade pip 显示 ...