容器跨区双向调用的域名注册方案实现

2019-07-20  本文已影响0人  千淘萬漉

不同网段的容器之间访问存在防火墙,之前在文章Dubbo跨区访问注册IP异常的解决方案已经做过详细的背景介绍了,根本原因在于不同网段的容器服务到注册中心都以本机Host注册和调用,而跨网段之间的访问只能通过Nat-IP进行,以IP注册服务的方式不能满足跨网段的双向调用,最好的解决方案是通过以域名注册的方式,下面就以在工作环境中的真实案例,来验证方案的可行性,从dubbo跨区到MetaQ (Rocket-MQ)都可以进行拓展。

一、Dubbo跨区访问


1.服务提供者申请域名注册

一般来说,服务提供者Provider如果需要满足跨区调用,则需要申请内网域名解析,在同网段解析域名可以得到真实IP,外网段解析该域名的时候能得到Nat-IP。这种线上容器的域名申请一般需要向容器平台或者网络组进行申请,下发域名以后,可以分别在容器内进行验证(IP与域名均已脱敏屏蔽):

#内网容器->解析出真实IP
[wls81@DockerHost ~]$ nslookup
> app-docker-dmz01.doc.demo.com.cn
Server:         215.0.0.1
Address:        215.0.0.1#53

Non-authoritative answer:
Name:   app-docker-dmz01.doc.demo.com.cn
Address: 215.0.0.1
#外网容器->解析出 Nat-IP
[wls81@DockerHost ~]$ nslookup
> app-docker-dmz01.doc.demo.com.cn
Server:         30.0.0.1
Address:        30.0.0.1#53

Non-authoritative answer:
Name:   app-docker-dmz01.doc.demo.com.cn
Address: 30.0.0.1

2.服务注册

Dubbo注册到ZooKeeper注册中心的Host是可以通过配置文件直接修改的,也有通过修改容器host文件达到目的,但是直接修改环境host也有潜在风险,建议采用配置文件修改的方式,dubbo可以有两种方式:

<!--单机版写法,不适合集群-->
<dubbo:protocol name="dubbo" host="app-docker-dmz01.doc.demo.com.cn"
                port="20880"/>

上面是单机版的写法,集群部署情况下,配置文件需要采用灵活一点读取本机配置文件的方式,配置值从本机的环境变量中动态获取:

<dubbo:protocol name="dubbo" host="${app.dubbo.config.host}"
                port="${app.dubbo.config.port}"/>

可以在全局配置application.properties文件中分别定义dubbo变量(当然也可以写到JAVA_OPS环境变量中):

app.dubbo.config.host=app-docker-dmz01.doc.demo.com.cn
app.dubbo.config.port=20880
dubbo.protocol.host=app-docker-dmz01.doc.demo.com.cn

3.云平台的补充说明

我所在的云平台,因为没有为每个实例单独挂载文件目录,所有的副本都是公用同一份资源空间,如此就导致了集群副本无法差异化自己的个性化配置,只能通过在公共目录下新建实例的IP名目录,提前放好dubbo的配置文件,然后在容器的启动脚本里放上如下程序,在镜像运行后即可将配置文件放在运行目录下生效。

###### get ip ###########################
eth1=`ifconfig  |grep -A 2 eth1|grep "inet addr"|awk -F: '{print $2}'|awk '{print $1}'`
if [ -z "$eth1" ]
then
    ip_addr_eth1="None"
else
    ip_addr_eth1=$eth1
fi

echo $ip_addr_eth1 >/wls/applogs/before.out

###### copy file ###########################
if [ ! -d /middleware/$ip_addr_eth1 ]
then
    mkdir -p /middleware/$ip_addr_eth1
    chown -R wls81.deploy /middleware/$ip_addr_eth1
fi

echo 'ok1' >/wls/applogs/before.out

if [ -f /middleware/$ip_addr_eth1/dubbo.properties ]
then
    \cp -af /middleware/$ip_addr_eth1/dubbo.properties /wls/appsystems/conf/
    chown -R wls81.deploy /wls/appsystems/apps/metamorphosis-server-wrapper/conf/
fi

echo 'ok2' >/wls/applogs/before.out

4.Zookeeper查看服务注册信息

修改完成后都需要重启容器,dubbo就会加载这部分配置信息到Zookeeper上注册服务,有两种方式可以检查服务信息:

Provider注册信息
[zk: localhost:2181(CONNECTED) 14] ls2 /dubbo/com.paic.mo.dubbo.biz.service.PecpDubboService/providers
dubbo://app-docker-dmz01.doc.demo.com.cn:28080/com.paic.mo.dubbo.biz.service.PecpDubboService?
application=app&dubbo=2.4.10&group=pasc&interface=com.demo.dubbo.biz.service.PecpDubboService&
methods=sendMail&pid=471&revision=1.0.0&side=provider&timeout=3000×tamp=1563542682061&version=1.0.0
cZxid = 0x600015f3f
ctime = Wed Jul 17 17:36:06 CST 2019
mZxid = 0x600015f3f
mtime = Wed Jul 17 17:36:06 CST 2019
pZxid = 0x600023b18
cversion = 81
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: localhost:2181(CONNECTED) 15] 

二、MetaQ


1.Broker申请域名注册

此步骤同上完全一致,只不过申请域名的对象由服务提供者转变为消息中间件的Broker,因为应用同MQ交互的是Broker角色。

2.服务注册

如果是早起的MetaQ版本,注册域名很简单只需要在server.ini文件中添加本机的域名信息即可:

[wls81@DockerHost]$ vi server.ini
[system]
brokerId=0
hostName=metaq-broker1-01.doc.demo.com.cn
numPartitions=4
serverPort=8123

如果是RocketMQ,注册域名的方式则需要在broker.properties文件中修改配置项如下即可:

[wls81@DockerHost]$ vi broker.properties
namesrvAddr=ip:port;
brokerIP1=rocketmq-broker1-01.doc.demo.com.cn

3.应用查看注册信息

应用在运行与重启都会从zk中拉取到metaq-broker的信息,如果能看到日志中rebalance到域名下的broker节点信息,同样可以验证MQ类型的MQ调用是正常可用了,如果域名解析失败或者防火墙不通,容器都不会健康启动,或者会在启动日志里打印出连接broker的异常堆栈信息的。

[DefaultLoadBalanceStrategy] -  Consumer app rebalancing the following partitions: [0-0, 0-1, 0-2, 0-3] for 
topic metaq_test with consumers: [app-1, app-2] 
[ConsumerZooKeeper] -  app-2 attempting to claim partition 0-2 
[ConsumerZooKeeper] -  app-2 attempting to claim partition 0-3 
[ConsumerZooKeeper] -  Connected to meta:metaq-broker1-01.doc.demo.com.cn//:8123 
[ConsumerZooKeeper] -  Starting fetch runners 
[ConsumerZooKeeper] -  end rebalancing consumer app-2 try #0 
[ConsumerZooKeeper] -  rebalance success. 
[MessageListenerContainer] -  Initialize message listener container successfully.
上一篇下一篇

猜你喜欢

热点阅读