使用 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利 ...
随机推荐
- 更新linux时候提示“由于没有公钥,无法验证下列签名".
本文链接:https://blog.csdn.net/loovejava/article/details/21837935 新安装的Ubuntu在使用sudo apt-get update更新源码的时 ...
- python手册学习笔记2
笔记2 > http://www.pythondoc.com/pythontutorial3/datastructures.html 列表操作 list.append(x) 把一个元素添加到列表 ...
- PHP获取PHP执行的时间
php获取PHP执行的时间 <pre> //程序运行时间 $starttime = explode(' ',microtime()); //代码区域 //程序运行时间 $endtime = ...
- 学Linux到底学什么?
前言 我们常常听到很多人说要学学Linux或者被人告知说应该学学Linux,那么学Linux到底要学什么? 为什么要学Linux 在回答学什么之前,我们先看看为什么要学.首先我们需要认识到的是,很多服 ...
- W与V模型的联系与区别
很多小白一定要注意: 看准那个是开发的工作哪个是测试的工作,不要弄混了!!! 软件测试的V模型 以“编码”为黄金分割线,将整个过程分为开发和测试,并且开发和测试之间是串行的关系 ...
- 基于Docker的Mysql主从复制
基于Docker的Mysql主从复制搭建 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相 ...
- Windows平台LoadLibrary加载动态库搜索路径的问题
一.背景 在给Adobe Premiere/After Effects等后期制作软件开发第三方插件的时候,我们总希望插件依赖的动态库能够脱离插件的位置,单独存储到另外一个地方.这样一方面可以与其他程序 ...
- 【计算机网络】TCP基础知识详解
1. TCP概念相关 [!NOTE] TCP(Transmission Control Protocol),又叫传输控制协议. TCP协议是面向连接的,可靠的,基于字节流的传输协议.在基于 TCP 进 ...
- 网络图片的获取以及二级缓存策略(Volley框架+内存LruCache+磁盘DiskLruCache)
在开发安卓应用中避免不了要使用到网络图片,获取网络图片很简单,但是需要付出一定的代价——流量.对于少数的图片而言问题不大,但如果手机应用中包含大量的图片,这势必会耗费用户的一定流量,如果我们不加以处理 ...
- 【翻译】全球用尽IPv4的一点思考
作者:Dimple 公众号:奔跑吧攻城狮 简介:专属于Java和Android开发,和你聊聊职场话题,一同展望未来 作为小小号主的我表示很无力啊,这几天,天天都是热点.前有网易员工勇敢发声维护自己的利 ...