获取配置信息测试的代码:

package com.taobao.diamond.test;

import java.util.concurrent.Executor;

import com.taobao.diamond.manager.DiamondManager;

import com.taobao.diamond.manager.ManagerListener;

import com.taobao.diamond.manager.impl.DefaultDiamondManager;

public class DiamondClient{

public static void main(String[] str){

DiamondManager manager = new DefaultDiamondManager("DEFAULT_GROUP", "topicConfig",

new ManagerListener() {//填写你服务端后台保存过的group和dataId

public void receiveConfigInfo(String configInfo){

System.out.println("changed config: " + configInfo);

}

public Executor getExecutor(){

return null;

}

}, "127.0.0.1,10.126.53.16,10.126.53.17");

//设置diamond-server服务的端口

manager.getDiamondConfigure().setPort(8080);

String availableConfigureInfomation = manager.getAvailableConfigureInfomation(5000);

System.out.println("start config: " + availableConfigureInfomation);

}

}

对DefaultDiamondManager的扩展,支持手动指定服务端地址

添加了它的一个构造函数

public DefaultDiamondManager(String group, String dataId, ManagerListener managerListener,String diamondServer){

this.dataId = dataId;

this.group = group;

diamondSubscriber = DiamondClientFactory.getSingletonDiamondSubscriber();

this.managerListeners.add(managerListener);

((DefaultSubscriberListener) diamondSubscriber.getSubscriberListener()).addManagerListeners(this.dataId,

this.group, this.managerListeners);

String s[] = diamondServer.split(",");

if (s != null && s.length > 0) {

for (String o : s) {

if (o != null && !o.trim().equals(""))

diamondSubscriber.getDiamondConfigure().getDomainNameList().add(o.trim());

}

}

diamondSubscriber.addDataId(this.dataId, this.group);

diamondSubscriber.start();

}

这样的话,就能获取到配置信息了。

上面这个例子通过手动指定diamondServer可以跳过服务端寻址的这个过程。

在配置diamond-server集群的时候,各个server之间的端口并没有要求相同,

但是在这的时候,发现它的端口,只能是相同的,无法每个IP对应自己的端口。

所以这里的diamondServer地址应该是nginx地址,端口的话,也应该是nginx提供diamond-server服务的端口。

nginx提供负载均衡的策略,同一的访问域名,对应了多台diamond-server后台机器,这里面的端口可以是不同的,解决diamond-server的单点问题。

虽然上面的那个例子手动指定了diamondServer地址,但是我们还是要去大体了解获取服务端地址的逻辑。

new

DefaultDiamondManager的构造函数,最后一句是diamondSubscriber.start();

点击进去

serverAddressProcessor = new

ServerAddressProcessor(this.diamondConfigure,

this.scheduledExecutor);

serverAddressProcessor.start();

然后在查看serverAddressProcessor.start()的具体逻辑

public synchronized void start(){

if (isRun) {

return;

}

isRun = true;

initHttpClient();

if (this.diamondConfigure.isLocalFirst()) {

acquireServerAddressFromLocal();

}

else {

synAcquireServerAddress();//首先执行的是这个

asynAcquireServerAddress();

}

}

protected void synAcquireServerAddress(){

if (!isRun) {

throw new RuntimeException("ServerAddressProcessor不在运行状态,无法同步获取服务器地址列表");

}

if (MockServer.isTestMode()) {

diamondConfigure.addDomainName("测试模式,没有使用的真实服务器");

return;

}

int acquireCount = 0;

if (diamondConfigure.getDomainNameList().size() == 0) {

if (!acquireServerAddressOnce(acquireCount)) {

acquireCount++;

if (acquireServerAddressOnce(acquireCount)) {

// 存入本地文件

storeServerAddressesToLocal();

log.info("在同步获取服务器列表时,向日常ConfigServer服务器获取到了服务器列表");

}

else {

log.info("从本地获取Diamond地址列表");

reloadServerAddresses();

if (diamondConfigure.getDomainNameList().size() == 0)

throw new RuntimeException("当前没有可用的服务器列表");

}

}

else {

log.info("在同步获取服务器列表时,向线上ConfigServer服务器获取到了服务器列表");

// 存入本地文件

storeServerAddressesToLocal();

}

}

}

private boolean acquireServerAddressOnce(int acquireCount){

HostConfiguration hostConfiguration = configHttpClient.getHostConfiguration();

String configServerAddress;

int port;

if (null != diamondConfigure.getConfigServerAddress()) {

configServerAddress = diamondConfigure.getConfigServerAddress();

port = diamondConfigure.getConfigServerPort();

}

else {

if (acquireCount == 0) {

configServerAddress = Constants.DEFAULT_DOMAINNAME;//a.b.c

port = Constants.DEFAULT_PORT;//端口

}

else {

configServerAddress = Constants.DAILY_DOMAINNAME;//d.e.f

port = Constants.DEFAULT_PORT;//端口

}

}

hostConfiguration.setHost(configServerAddress, port);

String serverAddressUrl = Constants.CONFIG_HTTP_URI_FILE;

//默认为/url,并且配置域名a.b.c或者d.e.f 访问url==>http://a.b.c:port/url返回以换行分隔的diamond ip列表行.

//所以这个/url很有可能需要被改掉

HttpMethod httpMethod = new GetMethod(serverAddressUrl);

// 设置HttpMethod的参数

HttpMethodParams params = new HttpMethodParams();

params.setSoTimeout(diamondConfigure.getOnceTimeout());

// ///

httpMethod.setParams(params);

try {

if (SC_OK == configHttpClient.executeMethod(httpMethod)) {

InputStreamReader reader = new InputStreamReader(httpMethod.getResponseBodyAsStream());

BufferedReader bufferedReader = new BufferedReader(reader);

String address = null;

List newDomainNameList = new LinkedList();

while ((address = bufferedReader.readLine()) != null) {//以换行分割

address = address.trim();

if (StringUtils.isNotBlank(address)) {

newDomainNameList.add(address);

}

}

if (newDomainNameList.size() > 0) {

log.debug("更新使用的服务器列表");

this.diamondConfigure.setDomainNameList(newDomainNameList);

return true;

}

}

else {

log.warn("没有可用的新服务器列表");

}

}

catch (HttpException e) {

log.error(getErrorMessage(configServerAddress) + ", " + e);

}

catch (IOException e) {

log.error(getErrorMessage(configServerAddress) + ", " + e);

}

catch (Exception e) {

log.error(getErrorMessage(configServerAddress) + ", " + e);

}

finally {

httpMethod.releaseConnection();

}

return false;

}

函数reloadServerAddresses,本地获取服务地址列表

File serverAddressFile = new

File(generateLocalFilePath(this.diamondConfigure.getFilePath(),

"ServerAddress"));

//这里的地址,在我的机器,默认为C:\Users\linchengjun\diamond\ServerAddress

============================分割线==========================================

到这为止,diamond-client获取server列表的顺序出来了

1.如果像我那样对DefaultDiamondManager进行了扩展,手动指定了地址列表,就不会进行其他的寻址逻辑了。

2.如果没有的话,先进行http://a.b.c:port/url请求sever地址列表行,获取不到,再进行http://d.e.f:port/url请求获取;

如果这两个都不行,就会调用reloadServerAddresses,进行本地文件的获取,比如C:\Users\linchengjun\diamond\ServerAddress

--------------------------------------------------读取服务端配置信息的顺序------------------------------------

分析测试代码

String availableConfigureInfomation = manager.getAvailableConfigureInfomation(5000);

public String getAvailableConfigureInfomation(String dataId, String group, long timeout){

// 尝试先从本地和网络获取配置信息

try {

String result = getConfigureInfomation(dataId, group, timeout);

if (result != null && result.length() > 0) {

return result;

}

}

catch (Throwable t) {

log.error(t.getMessage(), t);

}

// 测试模式不使用本地dump

if (MockServer.isTestMode()) {

return null;

}

return getSnapshotConfiginfomation(dataId, group);//从快照文件获取

}

具体断点进行调试,就能总结出来,读取的顺序

先从本地缓存读取

发现本地缓存localConfigInfoProcessor并没有缓存住,就从网络提取,这个时候需要注意Constants.HTTP_URI_FILE这个值,需要被改成/diamond-server/config.co

要不然老是获取不正确,即Constants.java中HTTP_URI_FILE改成public static final

String HTTP_URI_FILE = "/diamond-server/config.co";

从网络获取到数据之后,会先保存到快照里面,然后是保存到本地缓存。

Java中间件mock_JAVA中间件Diamond整理相关推荐

  1. Java基础之中间件的初识

    2019独角兽企业重金招聘Python工程师标准>>> java常用的中间件 一般本地开发的话建议使用tomcat.(小项目,或者是个人开发) linux系统建议使用jetty或ap ...

  2. java 中间件 pdf_Java中间件技术及其应用开发 PDF扫描版[51MB]

    Java中间件技术及其应用开发 内容提要: 本书使用丰富的案例介绍了使用Java技术进行中间件编程的方法及技巧,包括JSP.JavaServlet.JDBC数据库开发.使用JavaMail开发邮件应用 ...

  3. 系统自学Java语言(学习视频整理)

    以下分享的视频教程 99% 来源于B站(哔哩哔哩),其余来自于慕课网,希望这些视频能帮助你系统全面地自学 Java 语言. 目录 一.Java基础 二.数据结构与算法 三.图解Java设计模式 四.J ...

  4. Java RGB数组图像合成 ImageCombining (整理)

    1 /** 2 * Java RGB数组图像合成 ImageCombinning (整理) 3 * 4 * 2016-1-2 深圳 南山平山村 曾剑锋 5 * 6 * 注意事项: 7 * 1.本程序为 ...

  5. linux运维中的中间件,linux中间件Nginx的安装过程

    下面一步一步走进中间件"Nginx"中间件的安装过程中 第一步下载nginx件,本站不提供下载哈,各位看官根据自己linux的版本号下载相对应的nginx中间件.,本站以<n ...

  6. 2017年 第八届蓝桥杯 Java B组真题整理

    2017年 第八届蓝桥杯 Java B组真题整理 1.购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.这不,XX大促销又 ...

  7. 三年java经验面试总结,整理了一些java面试题供参考

    三年java经验面试总结,整理了一些java面试题供参考 此内容偏中高级,适合有三年或以上经验者. 1. java中wait和sleep有什么区别?多线程条件下如何保证数据安全? 答:最大区别是等待时 ...

  8. *Java软件开发面试知识整理*

    Java软件开发面试知识整理 围绕以下几点回答问题:是什么.为什么.什么时候用.项目实现.解决什么问题.遇到的困难 谈谈你对Java和C的理解? Java: 面向对象.Unicode:可以跨平台(JV ...

  9. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证...

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  10. 慕课Java第三季学习及笔记整理

    学习网址及截图和部分图片来源:https://www.imooc.com/learn/110 慕课Java第三季学习及笔记整理 一.异常与异常处理 1-1 java异常简介 概念 异常体系结构 1-2 ...

最新文章

  1. hadoop 1.0.1集群安装及配置
  2. TensorFlow入门教程
  3. day7 python学习随笔
  4. 关于微信授权与登录的相关操作(纯手敲)
  5. 模拟机安装linux教程,Windows 10利用虚拟机安装Linux图文教程
  6. Asp.Net 网站一键部署技术(下)
  7. Forward团队-爬虫豆瓣top250项目-设计文档
  8. 当head遇上runat=server之后发生的纠结之事
  9. [置顶] 原创鼠标拖动实现DIV排序
  10. AutoPostBack
  11. asp.net组件检查网站探针
  12. 数学建模【系统评价决策模型(概论、案例分析-汽车选购、层次分析法、案例分析-职员晋升、动态加权综合评价法、案例分析-大气污染问题)】
  13. 谷歌学术——下载论文
  14. python图片保存pdf_python将JPG图片转换为PDF
  15. 在PB中计算指定日期相对数量单位前(后)的日期
  16. 企业网络:安全只能靠两招
  17. 一个能够快速下载Git.exe历史版本的方法
  18. 百度架构师手把手教深度学习之心得
  19. C# 设计模式:创建型
  20. 《产品思维》一书读书笔记

热门文章

  1. 「电商干货」分销爆单的6个步骤
  2. 高通Thermal debug
  3. Emacs学习笔记(7):简单的配置
  4. stm32f103c6t6
  5. 统计学习之第三天(可汗学院公开课:统计学)
  6. 网站死链接检测工具 Xenu 汉化版
  7. Hulu校招补录已开始,1年内工作经验也可投!
  8. 计算机小高考要点,小高考的复习计划
  9. 性能测试——抗攻击-hyenae-ddos攻击
  10. Android开发常见问题汇总