使用 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利 ...
随机推荐
- C语言变量名和地址的关系【转载】//基础的东西
原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...
- 【计算机网络】TCP基础知识详解
1. TCP概念相关 [!NOTE] TCP(Transmission Control Protocol),又叫传输控制协议. TCP协议是面向连接的,可靠的,基于字节流的传输协议.在基于 TCP 进 ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 领扣(LeetCode)七进制数 个人题解
给定一个整数,将其转化为7进制,并以字符串形式输出. 示例 1: 输入: 100 输出: "202" 示例 2: 输入: -7 输出: "-10" 注意: 输入 ...
- 什么是TCP, UDP, HTTP, HTTPS协议?
TCP 传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC793定义. TCP主要特点: 1. 面向连接: (1)应用程序在使用TCP协议之前,必须先建立TCP连接. ...
- libwebsocket协议切换状态机
libwebsocket为连接(connection)定义了一组状态机-lws_connection_states,通过状态机我们来看libwebsocket如何实现协议的切换.除了lws_conne ...
- java 学习第三天小练习
今天做的是一些流程控制题,if...else,for循环等. 1.给定一个成绩,如果成绩大于80,则输出“奖励”.判断完后不管条件成不成立都要输出“继续努力”. package lianXiTi; i ...
- Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)
Condition对象 一).Condition的定义 Condition对象:与锁关联,协调多线程间的复杂协作. 获取与锁绑定的Condition对象: Lock lock = new Reentr ...
- 微信公众号配置及微信jsAPI支付
公众号配置 一.基本配置 首先登陆微信公众平台,在开发--->配置--->公众号开发信息,获取到AppId,开发者秘钥是后台需要的,给到后台,IP白名单配置就是你服务器的IP地址写到里面就 ...
- Stream系列(二)Map方法使用
Stream 将List 里面的对象转换为新的对象 EmployeeTestCase.java package com.example.demo; import lombok.Data; import ...