达博应用迁移到码头工人的问题
达博是阿里开源的一套服务治理与rpc框架,服务的提供者通过饲养员把自己的服务发布上去,然后服务调用方通过zk获取服务的ip和端口,达博客户端通过自己的软负载功能自动选择服务提供者并调用,整个过程牵涉到的三方关系如下图所示。
在正常的情况下,这三方都在同一个互通的网段,供应商提供给zk的就是获取到的本机地址,消费者能访问到这个地址。
但是假如服务放在码头工人容器中,而调用者并不在码头工人中,它们的网段是不一样的。
这个时候就出现问题了,消费者无法访问到提供者了。
达博提供的解决方案
新版的达博提供了四个配置来指定与注册服务相关的地址和端口。
<代码> 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