达博应用迁移到Kubernetes

  

达博应用迁移到码头工人的问题

  

达博是阿里开源的一套服务治理与rpc框架,服务的提供者通过饲养员把自己的服务发布上去,然后服务调用方通过zk获取服务的ip和端口,达博客户端通过自己的软负载功能自动选择服务提供者并调用,整个过程牵涉到的三方关系如下图所示。

  

达博应用迁移到Kubernetes

  

在正常的情况下,这三方都在同一个互通的网段,供应商提供给zk的就是获取到的本机地址,消费者能访问到这个地址。

  

但是假如服务放在码头工人容器中,而调用者并不在码头工人中,它们的网段是不一样的。

  

达博应用迁移到Kubernetes

  

这个时候就出现问题了,消费者无法访问到提供者了。

  

达博提供的解决方案

  

新版的达博提供了四个配置来指定与注册服务相关的地址和端口。

  
 <代码> DUBBO_IP_TO_REGISTRY:要发布到注册中心上的地址
  DUBBO_PORT_TO_REGISTRY:要发布到注册中心上的端口
  DUBBO_IP_TO_BIND:要绑定的服务地址(监听的地址)
  DUBBO_PORT_TO_BIND:要绑定的服务端口 
  

以IP地址为例,达博先找是不是有DUBBO_IP_TO_BIND这个配置,如果有使用配置的地址,如果没有就取本机地址。然后继续找DUBBO_IP_TO_REGISTRY,如果有了配置,使用配置,否则就使用DUBBO_IP_TO_BIND。具体代码如下:

  
 <=坝镅詊ava代码类>/* *
  *注册,为服务提供者绑定IP地址,可以单独配置。
  *配置优先级:环境变量→java系统属性→主机属性配置文件→
  */etc/hosts→默认网络地址→第一个可用网络地址
  *
  * @param protocolConfig
  * @param registryURLs
  * @param地图
  * @return
  */私有静态字符串findConfigedHosts (ServiceConfig<?比;sc,
  ProtocolConfig ProtocolConfig,
  ListregistryURLs,
  String> Map<字符串;地图){
  布尔anyhost=false;
  
  字符串hostToBind=getValueFromConfig (protocolConfig DUBBO_IP_TO_BIND);
  如果(hostToBind !=零,,hostToBind.length()比;0,,isInvalidLocalHost (hostToBind)) {
  把新IllegalArgumentException(“指定无效的绑定ip从房地产:“+ DUBBO_IP_TO_BIND +”,值:+ hostToBind);
  }//如果没有找到绑定ip环境,继续找
  如果(StringUtils.isEmpty (hostToBind)) {
  hostToBind=protocolConfig.getHost ();
  如果(sc.getProvider() !=零,,StringUtils.isEmpty (hostToBind)) {
  .getHost hostToBind=sc.getProvider () ();
  }
  如果(isInvalidLocalHost (hostToBind)) {
  anyhost=true;
  尝试{
  logger.info(“没有发现有效的ip环境,试图找到有效的从DNS主机。”);
  .getHostAddress hostToBind=InetAddress.getLocalHost () ();
  }捕捉(UnknownHostException e) {
  logger.warn (e.getMessage (), e);
  }
  如果(isInvalidLocalHost (hostToBind)) {
  如果(CollectionUtils.isNotEmpty (registryURLs)) {
  (URL registryURL: registryURLs) {
  如果(MULTICAST.equalsIgnoreCase (registryURL.getParameter(“注册表”))){//跳过多播注册以来我们不能通过套接字连接到它
  继续;
  }
  尝试新套接字(Socket套接字=()){
  SocketAddress addr都=新的InetSocketAddress (registryURL.getHost (), registryURL.getPort ());
  套接字。连接(addr, 1000);
  .getHostAddress hostToBind=socket.getLocalAddress () ();
  打破;
  }捕捉(异常e) {
  logger.warn (e.getMessage (), e);
  }
  }
  }
  如果(isInvalidLocalHost (hostToBind)) {
  hostToBind=getLocalHost ();
  }
  }
  }
  }
  
  地图。把(BIND_IP_KEY hostToBind);//注册ip不用于默认绑定的ip
  字符串hostToRegistry=getValueFromConfig (protocolConfig DUBBO_IP_TO_REGISTRY);
  如果(hostToRegistry !=零,,hostToRegistry.length()比;0,,isInvalidLocalHost (hostToRegistry)) {
  把新IllegalArgumentException(“指定无效的注册ip从房地产:”+ DUBBO_IP_TO_REGISTRY +”,值:+ hostToRegistry);
  }else if (StringUtils.isEmpty (hostToRegistry)) {//默认绑定ip作为注册ip
  hostToRegistry=hostToBind;
  }
  
  地图。把(ANYHOST_KEY String.valueOf (anyhost));
  
  返回hostToRegistry;
  } 
  

然后我们看这个getValueFromConfig(),它调用了下面的函数,可以看的到,它是先找环境变量,再找属性。

  
 <代码类="语言java "> getSystemProperty公共静态字符串(字符串键){
  字符串值=https://www.yisu.com/zixun/System.getenv(关键);
  如果(StringUtils.isEmpty(值)){
  值=System.getProperty(关键);
  }
  返回值;
  }

达博应用迁移到Kubernetes