三个类:

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. Java tutorial 02

    一.EnumTest.java枚举类型 public class EnumTest { public static void main(String[] args) { Size s=Size.SMA ...

  2. 26 python 并发编程之多进程理论

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...

  3. 在VS2013上配置OpenCV1.0

    OpenCV1.0版(下载)基本上已经是老掉牙了,但是不想装新版,只是因为任性.所以就有了这样一个新老搭配.装完回想起来还是挺简单的,但是还是费了我一晚上,所以有必要记录一下.         先在电 ...

  4. UV有问题?

    1.检查读取显示贴图的环境与制作贴图环境UV坐标系是否一致. 如:Directx左上角(0,0),右下角(1,1) unity 左下角(0,0),右上角(1,1) 两者互转需要垂直镜像.

  5. 伪元素after,before,css/js控制样式

    CSS<style> body { font: 200%/1.45 charter; } ref::before { content: '\00A7'; letter-spacing: . ...

  6. 1、在Eclipse中安装TestNG(离线方式)

    1.TestNG安装包:链接: https://pan.baidu.com/s/1UXZlJfrp8LM-6XmDLzVXKg 密码: 46y2 2.安装教程: (1).下载testNG 离线安装包[ ...

  7. mongo之map-reduce笔记

    package com.sy.demo; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import ...

  8. Vue项目开启步骤

    ## Build Setup # install cnpm //安装淘宝CNPM镜像npm install -g cnpm --registry=http://registry.npm.taobao. ...

  9. Spring Boot 集成RabbitMQ

    在Spring Boot中整合RabbitMQ是非常容易的,通过在Spring Boot应用中整合RabbitMQ,实现一个简单的发送.接收消息的例子. 首先需要启动RabbitMQ服务,并且add一 ...

  10. LINUX必须记住的指令

    写在前面: 1,<你一定要知道的关于Linux文件目录操作的12个常用命令>是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...