dubbo forbid service的解决办法
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。?
017-05-31 10:36:54.523 [http-nio-8080-exec-5] ERROR c.h.pdl.web.APIExceptionHandler - Unknown Exception, URI = /payday-loan-core/api/sms/send_forget_password_code com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.30.50.239 access service com.htouhui.sms.service.MessageQueueService from registry 10.30.50.239:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).這兩天經(jīng)常被這個(gè)dubbo的錯(cuò)誤所困擾,其實(shí)解決完之后才發(fā)現(xiàn)其實(shí)并沒有那么難,最核心的就是要保證服務(wù)器的provider和consumer之間的版本要對(duì)應(yīng)上,如果沒有對(duì)應(yīng)上,就會(huì)報(bào)這個(gè)錯(cuò)誤,其實(shí)這個(gè)錯(cuò)誤挺誤導(dǎo)人的,因?yàn)殄e(cuò)誤上說的是拒絕這個(gè)consumer調(diào)用dubbo的服務(wù),給出的提示是查看訪問列表,黑名單白名單,但是讀過源碼才知道,其實(shí)就是consumer要調(diào)用provider沒有找到,可以簡單的理解成NullPointerException。
還有我看到很多同事在面對(duì)這個(gè)問題的時(shí)候,處于一種比較迷茫的狀態(tài),不知道該如何入手,其實(shí)我在剛開始接觸的時(shí)候也是如此,不知道該怎么辦,寫這個(gè)文章就是讓大家有一個(gè)參考,提高解決該類問題的效率。
知己知彼方能百戰(zhàn)不殆,要想快速的解決問題,首先要先了解當(dāng)前系統(tǒng)是怎么運(yùn)行的,知道了來龍去脈以后就好解決問題了。
這里要說明的是有兩大塊內(nèi)容,一個(gè)是測試服務(wù)器,一個(gè)是預(yù)發(fā)和正式的服務(wù)器,其實(shí)原理一樣的,但是在實(shí)際使用中還是有一些不同,所以都要提一下。
首先是測試環(huán)境下:?
測試環(huán)境的編譯和部署是靠.gitlab-ci.yml文件進(jìn)行的,所以測試環(huán)境的核心就在這個(gè)文件中,理解這個(gè)文件有助于理解整個(gè)的持續(xù)集成是如何實(shí)現(xiàn)的。首先姑且不論里面的內(nèi)容是什么,代表什么,它首先是一個(gè)配置文件,YAML格式的配置文件,懂得YAML的格式是必須的。
首先主要的內(nèi)容是一些變量的定義:
variables:TOMCAT_PORT: "17771"DUBBO_PORT: "20892"DOCKER_IMAGE_VERSION: "1.0"這里定義了一個(gè)dubbo的端口號(hào):DUBBO_PORT,docker鏡像的版本:DOCKER_IMAGE_VERSION,這個(gè)端口號(hào)是如何使用的呢,可以看下面的配置:
script:- docker stop sms-gateway-$CI_BUILD_REF_SLUG || true- docker rm -f sms-gateway-$CI_BUILD_REF_SLUG || true- docker run -d -p $TOMCAT_PORT:8080 -p $DUBBO_PORT:$DUBBO_PORT -e DOCKER_IP=10.171.54.98 -e RUNTIME_PROFILE=test -v /root/app_logs/sms-gateway-$CI_BUILD_REF_SLUG:/root/logs/sms-gateway --name sms-gateway-$CI_BUILD_REF_SLUG -t registry.cn-beijing.aliyuncs.com/htouhui/sms-gateway:$DOCKER_IMAGE_VERSION這里我雖然無法得知gitlab是如何調(diào)用這些配置的,但是并不妨礙我去理解這些配置。最核心的部分就是docker run后面的參數(shù)了,其中參數(shù)說明如下:
-p, --publish value Publish a container's port(s) to the host (default []) -e, --env value Set environment variables (default []) -v, --volume value Bind mount a volume (default []) --name string Assign a name to the container -t, --tty Allocate a pseudo-TTY- 在docker中-p參數(shù)可以指定容器中對(duì)主機(jī)映射的端口,如上面的例子,-p 17771:8080 的意思也就是說,將docker中的端口17771映射到8080的端口上,當(dāng)我們從外部訪問的時(shí)候,通過8080端口就可以訪問到docker中的17771端口提供的服務(wù)了,同理,DUBBOPORT:DUBBO_PORT意思也是一樣的,這里轉(zhuǎn)成實(shí)際的數(shù)值為:20892:20892,也就是將容器中的20892端口映射為主機(jī)的20892端口。-e是設(shè)定環(huán)境變量,比較好理解,就不多解釋了。
接下來再看application.yaml配置中的情況:
dubbo:registry:address: zookeeper://123.57.8.180:2181port: 20892sms-gateway:provider:version: 0.0.1.local.sms-gateway- 當(dāng)然還有dubbo的配置了
這里可以看到,dubbo將上面yaml配置中的文件讀取到xml配置文件中,這個(gè)例子也就是變成如下內(nèi)容:
<dubbo:application name="sms-gateway"/> <!-- 向指定注冊中心暴露服務(wù)地址 --> <dubbo:registry address="zookeeper://123.57.8.180:2181"/> <!-- 用dubbo協(xié)議在指定端口暴露服務(wù) --> <dubbo:protocol name="dubbo" port="20892"/>也就是說,dubbo在zookeeper上注冊的端口號(hào)為20892,也就是說,docker在暴露dubbo在主機(jī)上的端口號(hào)必須為20892,不然就找不到要注冊的dubbo了,所以肯定就注冊不成功了。
現(xiàn)在的問題是,dubbo容器內(nèi)部的端口是如何指定的呢,也就是DUBBOPORT:DUBBO_PORT左側(cè)的端口號(hào),其實(shí)這里理解有些麻煩,因?yàn)槌绦蛑兄付ū┞兜亩丝谔?hào)為20892,但是,實(shí)際上并不能向外直接暴露,因?yàn)檫@個(gè)指定要暴露的端口是在docker tomcat容器中的,需要指定到服務(wù)器上的端口號(hào),然后zk才能通過這個(gè)端口號(hào)找到容器中對(duì)應(yīng)的端口號(hào),所以才表現(xiàn)出,這三個(gè)端口號(hào)都一致的現(xiàn)象。
要特別注意的是:
<dubbo:service interface="com.htouhui.pdl.user.UserReader" ref="defaultUserReader"timeout="5000"version="${dubbo.hxiaofei.provider.version}"/>這里的version格外重要,由于使用變量的緣故,我們經(jīng)常無法很直觀的判斷出provider和consumer的version是否一致,如果不一致則肯定也會(huì)報(bào)各種錯(cuò)誤。
?
見:http://blog.csdn.net/ksdb0468473/article/details/72820268
總結(jié)
以上是生活随笔為你收集整理的dubbo forbid service的解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]半角全角互转函数[JS版 VBS版
- 下一篇: com.jhlabs:imaging:j