三个类:

ServiceAProvider

ServiceBProvider

ServiceConsumer

其中

ServiceAProvider提供的服务名service-A,指向IP为192.168.58.130

ServiceBProvider提供的服务名service-A,指向IP为192.168.58.131

当有消费者请求时,随机地选取service-A列表的服务器提供服务

ServiceConsumer 为消费者类

依赖:

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5-cdh5.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.helix</groupId>
<artifactId>helix-core</artifactId>
<version>0.6.4</version>
</dependency>

github源码下载地址:

https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/zookeeper

详见下面的代码:

服务提供者ServiceAProvider类的源码为:

package com.jamesfen.zookeeper;
import java.net.InetAddress;
import org.I0Itec.zkclient.ZkClient;
public class ServiceAProvider { private String serviceName = "service-A"; //向zookeeper注册服务
public void init() throws Exception{
String serverList = "192.168.58.11:2181";
String PATH ="/configcenter";//根节点路径
ZkClient zkClient = new ZkClient(serverList);
boolean rootExists = zkClient.exists(PATH);
if(!rootExists){
zkClient.createPersistent(PATH);
}
//判断是否存在,不存在则创建服务节点
boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
if(!serviceExists){
zkClient.createPersistent(PATH + "/" + serviceName);
} //註冊當前服務
InetAddress addr =InetAddress.getLocalHost();
//String ip= addr.getHostAddress().toString();
String ip = "192.168.58.130"; //創建當前服務器節點
zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip); System.out.println("提供的服务节点名称为:"+PATH + "/" + serviceName + "/" + ip);
}
//提供服务
public void provide(){ }
public static void main(String[]args) throws Exception {
ServiceAProvider service = new ServiceAProvider();
service.init(); Thread.sleep(1000*60*60*24);
} }

服务提供者ServiceBProvider类源码为

package com.jamesfen.zookeeper;
import java.net.InetAddress;
import org.I0Itec.zkclient.ZkClient;
public class ServiceBProvider {
//服务名仍然为 A,这样是为了,一个服务名有两个台机器在服务,才能做负载均衡.
private String serviceName = "service-A"; //向zookeeper注册服务
public void init() throws Exception{
String serverList = "192.168.58.11:2181";
String PATH ="/configcenter";//根节点路径
ZkClient zkClient = new ZkClient(serverList);
boolean rootExists = zkClient.exists(PATH);
if(!rootExists){
zkClient.createPersistent(PATH);
} boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
if(!serviceExists){
zkClient.createPersistent(PATH + "/" + serviceName);//創建服務節點
} //註冊當前服務
InetAddress addr =InetAddress.getLocalHost();
//String ip= addr.getHostAddress().toString();
String ip = "192.168.58.131"; //創建當前服務器節點
zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip); System.out.println("提供的服务节点名称为:"+PATH + "/" + serviceName + "/" + ip);
}
//提供服务
public void provide(){ }
public static void main(String[]args) throws Exception {
ServiceBProvider service = new ServiceBProvider();
service.init(); Thread.sleep(1000*60*60*24);
} }

消费者类源码为:

package com.jamesfen.zookeeper;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
public class ServiceConsumer { private List<String> serverList = new ArrayList<String>(); private String serviceName ="service-A"; //初始化服务地址信息
public void init(){
String zkServerList ="192.168.58.11:2181";
String SERVICE_PATH="/configcenter/"+serviceName;//服务节点路径
ZkClient zkClient = new ZkClient(zkServerList); boolean serviceExists =zkClient.exists(SERVICE_PATH);
if(serviceExists){
serverList =zkClient.getChildren(SERVICE_PATH);
}else{
throw new RuntimeException("service not exist!");
} //注册事件监听
zkClient.subscribeChildChanges(SERVICE_PATH,new IZkChildListener(){
//@Override
public void handleChildChange(String parentPath, List<String> currentChilds)throws Exception{
serverList = currentChilds;
}
});
} //消费服务
public void consume(){
//通过负责均衡算法,得到一台服务器进行调用
int index = getRandomNum(0,1);
System.out.println("调用" + serverList.get(index)+"提供的服务:" + serviceName);
} public int getRandomNum(int min,int max){
Random rdm = new Random();
return rdm.nextInt(max-min+1)+min;
} public static void main(String[] args)throws Exception {
ServiceConsumer consumer = new ServiceConsumer(); consumer.init();
consumer.consume(); Thread.sleep(1000*60*60*24);
} }

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用zookeeper实现服务路由和负载均衡的更多相关文章

  1. RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化

    序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...

  2. 【7】JMicro微服务-服务路由,负载均衡

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl   1.关于服务路由和负载均衡 服务路由:根据预先配置好的策略,为客户端选择一个当前可用的服务提供者,根据策略选择一个可用的 ...

  3. 面向服务的体系架构 SOA(二) --- 服务的路由和负载均衡

    2. 服务的路由和负载均衡 1.2.1 服务化的演变 SOA设计思想:分布式应用架构体系对于业务逻辑复用的需求十分强烈,上层业务都想借用已有的底层服务来快速搭建更多.更丰富的应用,降低新业务开展的人力 ...

  4. 服务发现与负载均衡 dubbo zk原理

    服务发现与负载均衡 拓展阅读 : dubbo 原理概念图 2016-03-03 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 内容整理自文章“实施 ...

  5. 快速理解高性能HTTP服务端的负载均衡技术原理(转)

    1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...

  6. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  7. 从零开始入门 | Kubernetes 中的服务发现与负载均衡

    作者 | 阿里巴巴技术专家  溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...

  8. Kubernetes 中的服务发现与负载均衡

    原文:https://www.infoq.cn/article/rEzx9X598W60svbli9aK (本文转载自阿里巴巴云原生微信公众号(ID:Alicloudnative)) 一.需求来源 为 ...

  9. 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign

    (1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...

随机推荐

  1. BEC listen and translation exercise 12

    More than 220 cities now have air quality monitoring systems and 42 others will have systems in plac ...

  2. Tomcat设计模式分析(转) 2

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tom ...

  3. Linux sed 批量替换多个文件中的字符串【转载】

    原文网址:http://blog.sina.com.cn/s/blog_730edb930100qzz5.html     比如,要将目录/modules下面所有文件中的zhangsan都修改成lis ...

  4. Linux安装搜狗拼音输入法-sogoupinyin

    Linux安装搜狗拼音输入法-sogoupinyin Linux安装搜狗拼音输入法-sogoupinyin 一.下载所需安装包 二.卸载原有输入法 三.安装 四.安装配置工具 在网上查资料安装好了搜狗 ...

  5. debian7.2+nginx+mysql

    1.安装mysql sudo aptitude install mysql-server netstat -atln 查看3306端口 数据库目录: /var/lib/mysql/ 配置文件/usr/ ...

  6. JDK 8 - java.util.HashSet 实现机制分析

    JDK 8 Class HashSet<E> Doc: public class HashSet<E> extends AbstractSet<E> impleme ...

  7. java基础练习。。replaceall

    总结:方法不是别人告诉你的.再与你的手 package com.bc; public class gdfk { public static void main(String[] args) { Str ...

  8. 阿里巴巴开源项目: canal 基于mysql数据库binlog的增量订阅&消费

    背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数据库同步业务,主要是基于trigger的方式获取增 量变更,不过从2010年开始,阿里系公司开始逐步的 ...

  9. git学习5 ecipse集成git(转载)

    原文地址:http://blog.csdn.net/hhhccckkk/article/details/10458159 有的eclipse已经自带了GIt了,就不用安装了 1: 进行安装Git,和安 ...

  10. web页面导出到Excel乱码解决

    引言: 前几天 在做web项目的时候 需要导出页面上的数据 到Excel里面 但有的时候出现乱码(有de时候不出现 很奇怪) 原来的代码是这样的: HttpContext.Current.Respon ...