扩展CXF, 支持LoadBalance负载均衡

负载均衡中间件及算法解析 负载均衡 ● 随机 ● 加权随机 ● 轮询 ● 加权轮询 ● 平滑加权轮询 ● 最小调用时间 ● 一致性hash 阅读详情

原文: http://scud.blogjava.net

CXF是一个比较流行的Web Service框架. ( 当然如果追求更高效, 还可以去搜索ice, thrift, protobuff之类的)
近一个月, 断断续续地又好好看了看CXF的一些代码, CXF的文档还是很欠缺,特别是关于内部实现的东西. 从我的感觉来说, 内部实现还是挺复杂的. Inteceptor, Feature, ConduitSelector 这些概念一大堆, 又差不多可以做类似的事情, 真是让人头晕.

CXF本身提供了一个FailoverFeature, 可以在调用服务出错时切换到其他服务器, 但是无法做到负载均衡, 我研究了几天, 在FailoverFeature的基础上改出来一个LoadBalanceFeature, 当然也同时支持Failover.

首先我们来看看如何使用CXF的FailoverFeature: (下载示例中包括使用xml和代码两种方式, 当然CXF自己还提供了使用wsdl内部定义的方式)

    我们需要先准备一个HelloService, 非常简单的一个Web Service, 这里不在贴出, 具体可以看下载包
    调用代码示例:

package  org.javascud.extensions.cxf.testfailover;

import  org.apache.cxf.clustering.FailoverFeature;
import  org.apache.cxf.clustering.RandomStrategy;
import  org.apache.cxf.feature.AbstractFeature;
import  org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import  org.javascud.extensions.cxf.service.Hello;

import  java.util.ArrayList;
import  java.util.List;

public   class  HelloServiceFailOverClient
{
    
public   static   void  main(String[] args)
    {
        String helloFirst 
=   " http://localhost:8080/service/Hello " ;
        String helloSecond 
=   " http://localhost:8081/service/Hello " ;
        String helloThird 
=   " http://localhost:8082/service/Hello " ;
        String helloFour 
=   " http://localhost:8083/service/Hello " ;

        List
< String >  serviceList  =   new  ArrayList < String > ();
        serviceList.add(helloFirst);
        serviceList.add(helloSecond);
        serviceList.add(helloThird);
        
// serviceList.add(helloFour);

        RandomStrategy strategy 
=   new  RandomStrategy();
        strategy.setAlternateAddresses(serviceList);

        FailoverFeature ff 
=   new  FailoverFeature();
        ff.setStrategy(strategy);

        JaxWsProxyFactoryBean factory 
=   new  JaxWsProxyFactoryBean();

        List
< AbstractFeature >  features  =   new  ArrayList < AbstractFeature > ();
        features.add(ff);

        factory.setFeatures(features);
        factory.initFeatures();

        factory.setServiceClass(Hello.
class );
        
// factory.setAddress(" http://localhost :8080/service/Hello");

        Hello client 
=  (Hello) factory.create();
        String result 
=  client.sayHello( " felix " );
        System.out.println(
" result is:  "   +  result);
    }
}


在遇到错误时可以自动使用下一个服务器, 但是必须要自己设置一个地址, 如果不设置的话也可以, 但是会出错然后failover.


下面我们自己来看看我们的 LoadBalanceFeature

1. 首先我们创建一个LoadBalanceFeature (完全和FailoverFeature一样)

   Feature是用来定制Server, Client, Bus的一个组件, 具体可以查看AbstractFeature, 我们使用initialize方法来定制Client, 修改Client的Conduit选择器达到负载均衡的目的.

   LoadBalanceFeature代码如下:

/**
 * This feature may be applied to a Client so as to enable
 * load balance , use any compatible endpoint for the target service.
 *
 * 
@author  Felix Zhang   Date:2010-10-3 22:58
 * 
@see  org.apache.cxf.clustering.FailoverFeature
 
*/
public   class  LoadBalanceFeature  extends  AbstractFeature {
    
private  LoadBalanceStrategy loadBalanceStrategy;

    @Override
    
public   void  initialize(Client client, Bus bus) {
        LoadBalanceTargetSelector selector 
=   new  LoadBalanceTargetSelector();
        selector.setEndpoint(client.getEndpoint());
        selector.setStrategy(getStrategy());
        client.setConduitSelector(selector);
    }

    
public   void  setStrategy(LoadBalanceStrategy strategy) {
        loadBalanceStrategy 
=  strategy;
    }

    
public  LoadBalanceStrategy getStrategy() {
        
return  loadBalanceStrategy;
    }

}




2. 定制一个LoadBalanceStrategy 负载均衡策略
负载均衡策略有很多种, 例如随机选择, 顺序选择等, FailoverFeature提供了三种策略, 总之很简单, 我们在这里就先实现随机策略, 其他的策略都很简单, 几行代码就可以实现了.

    这个类主要用来设置/获取所有的提供服务的地址列表, 为了方便控制, 我新增了2个选项:
    A: alwaysChangeEndpoint 是否每次请求都切换地址: 如果只有一个客户端, 可以分担负载. 缺省为true
    B: removeFailedEndpoint 是否从全局的地址列表中移除失败服务地址 -- 如果你没有监测服务器状态的程序

   关于动态增删服务地址
  • 可以使用zookeeper等服务实时监测服务器状态, 或者自己写程序实现, 调用strategy.setAlternateAddresses即可.
  • removeFailedEndpoint 如果设置为true, 但没有监测服务器状态的程序, 新增的或者复活的服务器则无法被恢复到地址列表中.
  • 考虑到效率和支持failover, 设置地址列表, 移除地址等没有同步锁.
  • 自动移除失败服务地址时, 目前仅支持手动地址列表, 没有考虑wsdl中的多服务地址.
  • 后续我会写一个使用zookeeper增删服务地址列表的示例. (最近也在看zookeeper)


   主要的代码都在AbstractLoadBalanceStrategy 中, 基本和 AbstractStaticFailoverStrategy 一样, 添加了一个removeAlternateAddress 用于移除失败的服务地址.

    LoadBalanceStrategy 接口的代码如下:

/**
 * Supports pluggable strategies for alternate endpoint selection on
 * load balance.
 * <p/>
 * Random, Retries, Mod (later)
 * <p/>
 * 1. support load balance  2.support fail over.
 *
 * 
@author  Felix Zhang   Date:2010-10-1 18:14
 * 
@see  org.apache.cxf.clustering.FailoverStrategy
 
*/
public   interface  LoadBalanceStrategy {

    
/**
     * Get the alternate endpoints for this invocation.
     *
     * 
@param  exchange the current Exchange
     * 
@return  a failover endpoint if one is available
     
*/
    List
< Endpoint >  getAlternateEndpoints(Exchange exchange);

    
/**
     * Select one of the alternate endpoints for a retried invocation.
     *
     * 
@param  alternates List of alternate endpoints if available
     * 
@return  the selected endpoint
     
*/
    Endpoint selectAlternateEndpoint(List
< Endpoint >  alternates);

    
/**
     * Get the alternate addresses for this invocation.
     * These addresses over-ride any addresses specified in the WSDL.
     *
     * 
@param  exchange the current Exchange
     * 
@return  a failover endpoint if one is available
     
*/
    List
< String >  getAlternateAddresses(Exchange exchange);

    
/**
     * Select one of the alternate addresses for a retried invocation.
     *
     * 
@param  addresses List of alternate addresses if available
     * 
@return  the selected address
     
*/
    String selectAlternateAddress(List
< String >  addresses);

    
/**
     * should remove failed endpoint or not.
     * only work for user defined addresses list.
     * 
@return  true or false
     
*/
    
boolean  isRemoveFailedEndpoint();

    
/**
     * change endpoint every time or not.
     * 
@return  boolean
     
*/
    
boolean  isAlwaysChangeEndpoint();

    
/**
     * remove failed address from list.
     * 
@param  address the failed address
     
*/
    
void  removeAlternateAddress(String address);
}



    RandomLoadBalanceStrategy继承自 AbstractLoadBalanceStrategy, 和 RandomStrategy的区别就是获取下一个服务地址时并不从列表中移除此地址, 否则就做不到负载均衡了.


3. 最重要的 LoadBalanceTargetSelector
    A: 这个类比较复杂, 我们为了实现负载均衡, 修改了 prepare来动态设置调用的endpoint, 替换策略取决于LoadBalanceStrategy
    主要代码如下:

             boolean  existsEndpoint  =   false ;
            
// check current endpoint is not null
            Endpoint theEndpoint  =  exchange.get(Endpoint. class );
            
if  (theEndpoint.getEndpointInfo().getAddress()  !=   null ) {
                existsEndpoint 
=   true ;
            }

            Endpoint nextEndpoint;
            
if  (getStrategy().isAlwaysChangeEndpoint()  ||   ! existsEndpoint) {
                
// get a endpoint and set to current endpoint
                Endpoint loadBalanceTarget  =  getLoadBalanceTarget(exchange);
                
if  (loadBalanceTarget  !=   null ) {
                    logger.info(
" switch to next target:  "   +  loadBalanceTarget.getEndpointInfo().getAddress());
                    setEndpoint(loadBalanceTarget);

                    
// update exchange.org.apache.cxf.message.Message.ENDPOINT_ADDRESS --- 不设置这个就用上次的奇怪
                    message.put(Message.ENDPOINT_ADDRESS, loadBalanceTarget.getEndpointInfo().getAddress());
                }

                nextEndpoint 
=  loadBalanceTarget;
            } 
else  {
                
// use current endpoint
                nextEndpoint  =  theEndpoint;
            }




   
    B:为了和原有Failover特性兼容, 我们修改了 getFailoverTarget函数, 在此函数中要移除失败的服务地址, 因为在之前我们修改了LoadBalanceStrategy, 它在获取地址时不再移除当前地址, 所以我们需要手动移除.

    部分代码如下:   
            String currentAddress  =  getEndpoint().getEndpointInfo().getAddress();

            
// failover should remove current endpoint first, then get next -- 根据定义的策略来决定是否从全局地址列表中移除
             if  (getStrategy().isRemoveFailedEndpoint()) {
                logger.warn(
" remove current failed address:  "   +  currentAddress);
                
// remove for client, not for current invocation -- 没有同步锁
                getStrategy().removeAlternateAddress(currentAddress);
            }

            
// remove for current invocation: 当前请求中总是移除失败服务地址
            alternateAddresses.remove(currentAddress);

            String alternateAddress 
=
                    getStrategy().selectAlternateAddress(alternateAddresses);





4. 调用实例:

   此处我们采用XML定义方式:
<? xml version="1.0" encoding="UTF-8" ?>
< beans  xmlns ="http://www.springframework.org/schema/beans"
       xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws
="http://cxf.apache.org/jaxws"
       xmlns:clustering
="http://cxf.apache.org/clustering"
       xmlns:util
="http://www.springframework.org/schema/util"
       xsi:schemaLocation
="
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
>

    
< util:list  id ="addressList" >
        
< value > http://localhost:8081/service/Hello </ value >
        
< value > http://localhost:8082/service/Hello </ value >
        
< value > http://localhost:8083/service/Hello </ value >
        
< value > http://localhost:8086/service/Hello </ value >
        
< value > http://localhost:8087/service/Hello </ value >
        
< value > http://localhost:8088/service/Hello </ value >
    
</ util:list >

    
< bean  id ="SequentialAddresses"  class ="org.apache.cxf.clustering.SequentialStrategy" >
        
< property  name ="alternateAddresses" >
            
< ref  bean ="addressList" />
        
</ property >
    
</ bean >

    
< bean  id ="randomAddresses"  class ="org.javascud.extensions.cxf.RandomLoadBalanceStrategy" >
        
< property  name ="alternateAddresses" >
            
< ref  bean ="addressList" />
        
</ property >
        
< property  name ="removeFailedEndpoint"  value ="true"   />
    
</ bean >

    
< bean  id ="loadBalanceFeature"  class ="org.javascud.extensions.cxf.LoadBalanceFeature" >
        
< property  name ="strategy"  ref ="randomAddresses"   />
    
</ bean >


    
< jaxws:client  name ="helloClient"
                  serviceClass
="org.javascud.extensions.cxf.service.Hello"              >
        
< jaxws:features >
            
< ref  bean ="loadBalanceFeature"   />
        
</ jaxws:features >
    
</ jaxws:client >


</ beans >
 
8081, 8082, 8083是实际存在的服务, 其他的不存在.


调用的Java代码:

package  org.javascud.extensions.cxf.loadbalance;

import  org.apache.cxf.endpoint.Client;
import  org.apache.cxf.frontend.ClientProxy;
import  org.javascud.extensions.cxf.LoadBalanceStrategy;
import  org.javascud.extensions.cxf.service.Hello;
import  org.springframework.context.support.ClassPathXmlApplicationContext;


public   class  HelloLoadBalanceAndFailOverClientByXML
{
    
public   static   void  main(String[] args)
    {
        ClassPathXmlApplicationContext context
                
=   new  ClassPathXmlApplicationContext( new  String[]
                {
" org/javascud/extensions/cxf/loadbalance/loadbalance_fail.xml " });
        Hello client 
=  (Hello) context.getBean( " helloClient " );

        LoadBalanceStrategy strategy 
=  (LoadBalanceStrategy) context.getBean( " randomAddresses " );

        Client myclient 
=  ClientProxy.getClient(client);
        String address 
=  myclient.getEndpoint().getEndpointInfo().getAddress();

        System.out.println(address);

        
for ( int  i = 1 ; i <= 20 ; i ++ )
        {
            String result1 
=  client.sayHello( " Felix "   + i);
            System.out.println(
" Call  "   +  i  + " :  "   +  result1);

            
int  left  =  strategy.getAlternateAddresses( null ).size();
            System.out.println(
" ================== left  "   +  left  +   "  =========================== " );
        }


    }
}

    此处仅仅为模拟测试.


5. 关于测试用例
    没想好如何写单元测试, test里面目前都是随意测试的代码, 基本照顾到所有功能.

    

6. 下载
代码下载: http://cnscud.googlecode.com/files/extensions-cxf_20101015.zip
源码位置: http://cnscud.googlecode.com/svn/trunk/extensions/  其中cxf目录是此文章相关的源码.

7. 有任何问题请留言.

华为od 面试手撕代码题【完成任务最少小时】 阅读详情

相关推荐

逆变器母线电容选型与均压电阻设计实战指南

本文为逆变器母线电容选型与均压电阻设计提供了实战指南。文章从工程角度出发,详细解析了母线电容耐压值、容值的计算方法,并重点强调了纹波电流热设计的重要性。同时,深入探讨了串联电容均压电阻的设计原则与功率计算,通过5.5kW变频器案例,系统演示了从参数确定到最终选型的完整流程,旨在帮助工程师设计出稳定可靠的逆变器系统。

weixin_29299807的博客 292

花里胡哨的技术名词

1、SaaS服务

snakeflash的博客 223

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 248

nginx实现负载均衡

项目场景: nginx实现负载均衡 问题描述: nginx实现负载均衡 配置文件conf.d代码: upstream zhoucong_hosts{ server 49.234.54.54:80 weight=5; server 192.168.1.103:80 weight=1; } server { listen 80; server_name www.test.com; root /var/www/example.com/public

weixin_41946948的博客 218

LabVIEW多设备采集实战:1个程序同时控制3个RS485 Modbus仪表

本文详细介绍了如何使用LabVIEW实现多设备RS485 Modbus同步采集,涵盖硬件架构设计、多线程通信框架搭建、数据帧解析技巧及性能优化策略。通过实际项目案例,展示如何解决端口冲突、数据解析错误等工业自动化常见问题,提升采集系统实时性与可靠性。

qsc901234的博客 302

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

公司nginx keepalived tomcat cxf 搭建高可用负载均衡实战系列1- keepalived安装配置

1,ip说明 vip 10.50.13.67 server1 10.50.13.68 server2 10.50.13.140 2,keepalived安装 keepalived通常与lvs或者nginx结合使用保证集群的高可用,keepalived的master会绑定一个vi...

weixin_30933531的博客 163

Yocto开发讲解系列 - 总目录

Yocto开发讲解系列总纲Yocto开发专栏前言

fulinux的博客 3万+

Dubbo八股文,查缺补漏

恭喜大家看完了dubbo源码,但是这些问题你能回答的上来么?快看看dubbo相关的八股文,给自己做一个总结,并查缺补漏吧! 1.Dubbo是什么?RPC又是什么?2. Dubbo能做什么?3.能说下Dubbo的总体的调用过程吗?4.说说Dubbo 支持哪些协议,每种协议的应用场景和优缺点5.Dubbo中都用到哪些设计模式?6.如果Dubbo中provider提供的服务由多个版本怎么办?7.服务暴露的流程是怎么样的?8.服务引用的流程是怎么样的?9.Dubbo的注册中心有哪些?10.聊聊Dubbo SPI机制

581

【数据集】MODIS 的 MOD07 大气廓线产品概述及下载

MODIS 的 MOD07 大气廓线产品概述及下载

WW、forever的博客 550

终于找到了!Ubuntu 虚拟机卡死的终极解决方案(如何解决VMware安装Ubuntu24.04桌面进不去、黑屏、虚拟机卡死、显示不全、屏幕闪烁等问题)

终于找到了!Ubuntu 虚拟机卡死的终极解决方案(如何解决VMware安装Ubuntu24.04桌面进不去、黑屏、虚拟机卡死、显示不全、屏幕闪烁等问题)

XiaoqiangClub的博客 1万+

策略设计模式的应用

1:背景介绍 2:类图设计 3:代码 4:策略设计模式的优点 5:代码库地址

weixin_42551626的博客 643

基于STM32L4XX、HAL库的GC9307 TFT 液晶驱动IC驱动程序设计

GC9307是一款常用的TFT液晶驱动IC,支持240x320分辨率的RGB接口显示屏。(Master Out Slave In): 连接到STM32L4的SPI数据输出引脚(如PA7)(Serial Clock): 连接到STM32L4的SPI时钟引脚(如PA5)(Data/Command): 连接到STM32L4的GPIO引脚(如PA3)(Chip Select): 连接到STM32L4的GPIO引脚(如PA4)(Reset): 连接到STM32L4的GPIO引脚(如PA2): 分别连接到电源和地。

zhusl6688的博客 1033

MyBatis的数据库负载均衡策略

1.背景介绍 在分布式系统中,数据库负载均衡是一项重要的技术,它可以确保数据库的负载得到均匀分布,从而提高系统性能和可用性。MyBatis是一款流行的Java数据库访问框架,它支持数据库负载均衡策略,可以帮助开发者实现数据库的负载均衡。本文将详细介绍MyBatis的数据库负载均衡策略,包括背景介绍、核心概念与联系、核心算法原理和具体操作步骤、数学模型公式详细讲解、具体最佳实践、实际应用场景、工具...

AI天才研究院 1097

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

负载均衡策略之轮询策略

本文转自:https://mozillazg.com/2019/02/load-balancing-strategy-algorithm-weighted-round-robin.html#hidround-robin,尊重原创 前言: 本文简单介绍一下轮询(Round Robin)这个负载均衡策略。 轮询选择 (Round Robin): 轮询选择指的是从已有的后端节点列表中按顺序依次选择一个节点出来提供服务。 一种轮询选择的方法是把所有的节点看做一个一个的点,并把这些点连起来组成一个圆, 轮询选择就是在

ALakers的博客 2613

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java负载均衡的实现原理

通过随机算法,根据后端服务器的列表随机选取其中的一台服务器进行访问//0~bound(不包含)之间的随机数intrandomNumber=newRandom().nextInt(uris.size());}}

白鸽 634

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

zookeeper负载均衡,怎么指定负载算法?

以上代码实现了一个简单的负载均衡算法。在这个算法中,首先从给定的Zookeeper服务器地址集合中随机选择一个地址,然后将其解析成IP地址和端口号,最终返回一个InetSocketAddress对象。这样,当客户端连接Zookeeper服务器时,就会使用指定的负载均衡算法来选择需要连接的服务器地址。在Java中,通过在Zookeeper客户端中指定一个LoadBalanceStrategy对象来指定负载均衡算法。在Zookeeper中,可以通过客户端在连接服务器的时候指定使用的负载均衡算法来实现负载均衡。

weixin_41641717的博客 583

CXF拦截器介绍及自定义拦截器实现

这篇文章从理论角度描述CXF的拦截器,描述的比较清楚。 CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能。 当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能,拦截器可以在客户端加入,也可以在服务端加入。 拦截器链的阶段: 拦截器链有多个阶段,每个阶段...

weibin_6388的专栏 5483

webservice 教程学习系列(十四)——CXF深入使用(CXF拦截器)

为什么设计拦截器? 为了在webservice请求中,可以主动操作请求和相应数据,CXF设计了拦截器。 拦截器分类: 1.按照所处的位置分:服务端拦截器、客户端拦截器; 2.按照消息的方向划分:入拦截器、出拦截器; 3.按照定义者划分:系统拦截器,自定义拦截器。 拦截器API 拦截器接口: AbstractPhaseInterceptor LoggingInIntercept...

u012045045的博客 682

Apache CXF负载平衡和故障转移

前一段时间,我们已经面临基于Apache CXF的负载平衡Web服务客户端的需求。 此外,当某些服务器关闭时,客户端应自动进行故障转移。 更糟糕的是,服务器目标地址列表要从外部服务获取并在运行时更新。 最终,我们最终获得了自己开发的负载平衡微库(ESB / UDDI / WS-Addressing似乎是一个有趣的替代方案,但在我们的情况下这是一个过大的选择)。 如果我们只知道Apache...

最佳 Java 编程 460

cxf 服务器响应超时时间,cxf - CXF Web服务客户端间歇性出现java.net.SocketTimeoutException:读取超时 - 堆栈内存溢出...

我们在Websphere Application Server 7.0.0上部署了一些CXF Web服务。 它是带有负载均衡器的多服务器环境。我们有一个多线程Web服务客户端(用作缓存工具),该客户端调用Web服务和来自调用方的服务请求。 所以本质上,请求流是这样的-调用方-> CXF WebService客户端(多线程)-> F5负载平衡器-> Websphere AS一切...

weixin_26831583的博客 1098

apache cxf_Apache CXF负载平衡和故障转移

apache cxf 不久前,我们已经面临了基于Apache CXF的负载平衡Web服务客户端的需求。 此外,当某些服务器关闭时,客户端应自动进行故障转移。 更糟糕的是,服务器目标地址列表要从外部服务获取并在运行时更新。 最终,我们最终获得了本地开发的负载平衡微库(ESB / UDDI / WS-Addressing似乎是一个有趣的选择,但在我们的情况下这是一个过大的选择)。 是否仅知道A...

最佳 Java 编程 443

多次负载均衡之后,WebService接口调用地址,和实际调用的接口地址不一致问题记录

这篇文章记录一下,多次负载均衡之后,WebService接口调用地址,和实际调用的接口地址不一致问题记录。

✅ Java 开发工程师 3904

CXF BUS

CXF中的BUS就是一个骨架,管理着CXF的扩展插件以及提供拦截器。注意,BUS提供的拦截器与具体的服务endpoint提供的拦截器是有一点区别的。BUS提供的拦截器将作用于所有的收到、发送以及错误(Fault)的消息。默认情况下,BUS没有为我们提供任何拦截器。     一,BUS提供全局拦截器功能     下面来举例子说明,如何为所有的endpoint提供日志拦截:

kobejayandy的专栏 4133
上一篇: Maven - 依赖
下一篇: Maven - 仓库
胸口碎大石_
博客等级 码龄17年 1154粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值