使用zookeeper实现服务路由和负载均衡
三个类:
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实现服务路由和负载均衡的更多相关文章
- RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...
- 【7】JMicro微服务-服务路由,负载均衡
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1.关于服务路由和负载均衡 服务路由:根据预先配置好的策略,为客户端选择一个当前可用的服务提供者,根据策略选择一个可用的 ...
- 面向服务的体系架构 SOA(二) --- 服务的路由和负载均衡
2. 服务的路由和负载均衡 1.2.1 服务化的演变 SOA设计思想:分布式应用架构体系对于业务逻辑复用的需求十分强烈,上层业务都想借用已有的底层服务来快速搭建更多.更丰富的应用,降低新业务开展的人力 ...
- 服务发现与负载均衡 dubbo zk原理
服务发现与负载均衡 拓展阅读 : dubbo 原理概念图 2016-03-03 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 内容整理自文章“实施 ...
- 快速理解高性能HTTP服务端的负载均衡技术原理(转)
1.前言 在一个典型的高并发.大用户量的Web互联网系统的架构设计中,对HTTP集群的负载均衡设计是作为高性能系统优化环节中必不可少的方案.HTTP负载均衡的本质上是将Web用户流量进行均衡减压,因此 ...
- (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh
看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...
- 从零开始入门 | Kubernetes 中的服务发现与负载均衡
作者 | 阿里巴巴技术专家 溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...
- Kubernetes 中的服务发现与负载均衡
原文:https://www.infoq.cn/article/rEzx9X598W60svbli9aK (本文转载自阿里巴巴云原生微信公众号(ID:Alicloudnative)) 一.需求来源 为 ...
- 学习一下 SpringCloud (三)-- 服务调用、负载均衡 Ribbon、OpenFeign
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
随机推荐
- lamp script
centos6 ,不区分32位,64位, 要求机器可以上外网. 支持lamp 和 lnmp, mysql支持5.1和5.6两个版本,php支持5.3和5.6两个版本,apache2.2,nginx1. ...
- canvas基础学习(一)
一.概述 canvas它和其它的HTML5标签的使用基本一致,但是它相当于在浏览器中建立一个画布,可以再这个画布上画图.创建动画甚至是3D游戏.由于canvas要适配不同终端的分辨率,所以尽可能的在标 ...
- 解决mac下sublime中文乱码
Mac OS X 属于 Apple 独家演绎的 Unix 分支版本,默认使用 UTF-8 编码,当使用不同开发平台的小伙伴们,共同维护一份代码的时候,尤其现在很多人都还在用 Windows 系统的时候 ...
- MyEclipse安装jbpm插件
介绍如何在MyEclipse8.6里安装jbpm插件. 工具/原料 MyEclipse8.6 jbpm-4.4.rar 方法/步骤 1 下载jbpm包并解压 下载最新的jbpm包,本文以jbpm4.4 ...
- laravel 常用知识总结
看到一篇别人的文章感觉写的不错 就copy过来了 学习源头: https://www.cnblogs.com/yjf512/p/3830750.html aravel是个很强大的PHP框架,它剔除了开 ...
- maven用途、核心概念、用法、常用参数和命令、扩展
设置问题解决. http://trinea.iteye.com/blog/1290898 本文由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Buil ...
- sleep 和 usleep的实现方法
一.sleep 和 usleep 1.不属于系统调用,是glibc 库函数实现的: 2.glibc函数库中通过调用内核的nanosleep实现的: 3.内核nanosleep通过调用 hrtimer_ ...
- du 命令 -目前的目录所占的磁盘空间
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 1.命令格式: du [选项][文件] 2.命令功能 ...
- java.nio.ByteBuffer中flip、rewind、clear方法的区别
对缓冲区的读写操作首先要知道缓冲区的下限.上限和当前位置.下面这些变量的值对Buffer类中的某些操作有着至关重要的作用: limit:所有对Buffer读写操作都会以limit变量的值作为上限. p ...
- calc PI
https://en.wikipedia.org/wiki/Pi code https://github.com/HHS-IntroProgramming/Calculate-Pi https://g ...