dubbo forbid service的解決辦法

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。?

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).

這兩天經常被這個dubbo的錯誤所困擾,其實解決完之后才發現其實并沒有那么難,最核心的就是要保證服務器的provider和consumer之間的版本要對應上,如果沒有對應上,就會報這個錯誤,其實這個錯誤挺誤導人的,因為錯誤上說的是拒絕這個consumer調用dubbo的服務,給出的提示是查看訪問列表,黑名單白名單,但是讀過源碼才知道,其實就是consumer要調用provider沒有找到,可以簡單的理解成NullPointerException。

還有我看到很多同事在面對這個問題的時候,處于一種比較迷茫的狀態,不知道該如何入手,其實我在剛開始接觸的時候也是如此,不知道該怎么辦,寫這個文章就是讓大家有一個參考,提高解決該類問題的效率。

知己知彼方能百戰不殆,要想快速的解決問題,首先要先了解當前系統是怎么運行的,知道了來龍去脈以后就好解決問題了。

這里要說明的是有兩大塊內容,一個是測試服務器,一個是預發和正式的服務器,其實原理一樣的,但是在實際使用中還是有一些不同,所以都要提一下。

首先是測試環境下:?
測試環境的編譯和部署是靠.gitlab-ci.yml文件進行的,所以測試環境的核心就在這個文件中,理解這個文件有助于理解整個的持續集成是如何實現的。首先姑且不論里面的內容是什么,代表什么,它首先是一個配置文件,YAML格式的配置文件,懂得YAML的格式是必須的。

首先主要的內容是一些變量的定義:

variables:TOMCAT_PORT: "17771"DUBBO_PORT: "20892"DOCKER_IMAGE_VERSION: "1.0"

這里定義了一個dubbo的端口號:DUBBO_PORT,docker鏡像的版本:DOCKER_IMAGE_VERSION,這個端口號是如何使用的呢,可以看下面的配置:

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是如何調用這些配置的,但是并不妨礙我去理解這些配置。最核心的部分就是docker run后面的參數了,其中參數說明如下:

-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參數可以指定容器中對主機映射的端口,如上面的例子,-p 17771:8080 的意思也就是說,將docker中的端口17771映射到8080的端口上,當我們從外部訪問的時候,通過8080端口就可以訪問到docker中的17771端口提供的服務了,同理,DUBBOPORT:DUBBO_PORT意思也是一樣的,這里轉成實際的數值為:20892:20892,也就是將容器中的20892端口映射為主機的20892端口。-e是設定環境變量,比較好理解,就不多解釋了。

接下來再看application.yaml配置中的情況:

dubbo:registry:address: zookeeper://123.57.8.180:2181port: 20892sms-gateway:provider:version: 0.0.1.local.sms-gateway
  • 當然還有dubbo的配置了
<dubbo:application name="sms-gateway"/>
<!-- 向指定注冊中心暴露服務地址 -->
<dubbo:registry address="${dubbo.registry.address}"/>
<!-- 用dubbo協議在指定端口暴露服務 -->
<dubbo:protocol name="dubbo" port="${dubbo.registry.port}"/>    

這里可以看到,dubbo將上面yaml配置中的文件讀取到xml配置文件中,這個例子也就是變成如下內容:

<dubbo:application name="sms-gateway"/>
<!-- 向指定注冊中心暴露服務地址 -->
<dubbo:registry address="zookeeper://123.57.8.180:2181"/>
<!-- 用dubbo協議在指定端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20892"/>    

也就是說,dubbo在zookeeper上注冊的端口號為20892,也就是說,docker在暴露dubbo在主機上的端口號必須為20892,不然就找不到要注冊的dubbo了,所以肯定就注冊不成功了。

現在的問題是,dubbo容器內部的端口是如何指定的呢,也就是DUBBOPORT:DUBBO_PORT左側的端口號,其實這里理解有些麻煩,因為程序中指定暴露的端口號為20892,但是,實際上并不能向外直接暴露,因為這個指定要暴露的端口是在docker tomcat容器中的,需要指定到服務器上的端口號,然后zk才能通過這個端口號找到容器中對應的端口號,所以才表現出,這三個端口號都一致的現象。

要特別注意的是:

<dubbo:service interface="com.htouhui.pdl.user.UserReader" ref="defaultUserReader"timeout="5000"version="${dubbo.hxiaofei.provider.version}"/>

這里的version格外重要,由于使用變量的緣故,我們經常無法很直觀的判斷出provider和consumer的version是否一致,如果不一致則肯定也會報各種錯誤。

?

見:http://blog.csdn.net/ksdb0468473/article/details/72820268

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450266.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450266.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450266.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用SSH登錄遠程的機器,在遠程機器上執行本地機器上的腳本

假設本地的機器IP為10.245.111.90&#xff0c;我們想要在10.245.111.93上執行一個保存在10.245.111.90上的腳本。經過測試通過的命令如下&#xff1a;ssh root10.245.111.93 bash -s < /root/testlocal.sh如果要帶參數的話&#xff0c;那就需要參考這篇文章中描述的代碼了。…

golang學習之旅(1)

這段時間我開始了golang語言學習&#xff0c;其實也是為了個人的職業發展的拓展和衍生&#xff0c;語言只是工具&#xff0c;但是每個語言由于各自的特點和優勢&#xff0c;golang對于當前編程語言的環境&#xff0c;是相對比較新的語言&#xff0c;對于區塊鏈&#xff0c;大數…

為什么要在Linux平臺上學C語言?用Windows學C語言不好嗎?

用Windows還真的是學不好C語言。C語言是一種面向底層的編程語言&#xff0c;要寫好C程序&#xff0c;必須對操作系統的工作原理非常清楚&#xff0c;因為操作系統也是用C寫的&#xff0c;我們用C寫應用程序直接使用操作系統提供的接口&#xff0c;Linux是一種開源的操作系統&am…

數據庫中Schema(模式)概念的理解

在學習SQL的過程中&#xff0c;會遇到一個讓你迷糊的Schema的概念。實際上&#xff0c;schema就是數據庫對象的集合&#xff0c;這個集合包含了各種對象如&#xff1a;表、視圖、存儲過程、索引等。為了區分不同的集合&#xff0c;就需要給不同的集合起不同的名字&#xff0c;默…

linux系統中打rz命令后出現waiting to receive.**B0100000023be50

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 linux系統中打rz命令后出現 waiting to receive.**B0100000023be50 而沒有出現選擇文件彈出框是什么問題&#xff1a; 我本來用的是 gi…

golang學習之旅(2)- go的數據基本數據類型及變量定義方式

叮鈴鈴&#xff0c;這不有人在評論問下一篇何時更新&#xff0c;這不就來了嘛&#xff0c;&#x1f604; 今天我們說說golang 的基本數據類型 基本類型如下&#xff1a; //基本類型 布爾類型&#xff1a;bool 即true 、flase 類似于java中的boolean 字符類型&#xff1a;s…

StackExchange.Redis 官方文檔(六) PipelinesMultiplexers

流水線和復用 糟糕的時間浪費。現代的計算機以驚人的速度產生大量的數據&#xff0c;而且高速網絡通道(通常在重要的服務器之間同時存在多個鏈路)提供了很高的帶寬&#xff0c;但是計算機花費了大量的時間在 等待數據 上面&#xff0c;這也是造成使用持久性鏈接的編程方式越來越…

開發優秀產品的六大秘訣

摘要&#xff1a;本文是Totango的聯合創始人兼公司CEO Guy Nirpaz發表在Mashable.com上的文章。無論是在哪個行業&#xff0c;用戶永遠是一款產品的中心&#xff0c;本文作者就以用戶為中心&#xff0c;為大家講述了六個如何為企業產品添加功能的秘訣。 隨著云計算的發展&#…

Spring Boot下無法加載主類 org.apache.maven.wrapper.MavenWrapperMain問題解決

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 引言&#xff1a; 在SpringBoot中需要使用mvnw來做相關操作&#xff0c;但是卻有時候會報出達不到MavenWrapperMain的錯誤信息&#xff…

【前端面試】字節跳動2019校招面經 - 前端開發崗(二)

【前端面試】字節跳動2019校招面經 - 前端開發崗&#xff08;二&#xff09; 因為之前的一篇篇幅有限&#xff0c;太長了看著也不舒服&#xff0c;所以還是另起一篇吧?一、 jQuery和Vue的區別 jQuery 輕量級Javascript庫Vue 漸進式Javascript-MVVM框架jQuery和Vue的對比 jQuer…

SpringBoot與SpringCloud的版本說明及對應關系

轉載原文地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

leetcode 8: 字符串轉整數(atoi)

實現 atoi&#xff0c;將字符串轉為整數。 該函數首先根據需要丟棄任意多的空格字符&#xff0c;直到找到第一個非空格字符為止。如果第一個非空字符是正號或負號&#xff0c;選取該符號&#xff0c;并將其與后面盡可能多的連續的數字組合起來&#xff0c;這部分字符即為整數的…

優秀產品頁設計:將訪問者轉化成客戶

摘要&#xff1a;本文是對外文《 Better Product Pages: Turn Visitors Into Customers 》的翻譯&#xff0c;編譯內容如下&#xff1a; 展示產品、服務的方法是其獲得成功的關鍵。在Web上&#xff0c;你留給用戶的第一印象是至關重要的。 如果有人訪問你的網站&#xff0c;一定…

計算機網絡學習方法

原文見&#xff1a;http://blog.csdn.net/qq_33506160/article/details/51872708 一、網絡課程究竟難在哪&#xff1f; 1&#xff0e;內容比較亂 如果把《計算機網絡技術基礎》看做是一本計算機網絡導論方面的教材&#xff0c;就不會認為亂了&#xff0c;因為導論就是為了解決知…

小程序類似抖音視頻整屏切換

更新 現在已經更新了github地址和效果gif&#xff0c;可在文章最后查看。如果我的代碼對你有用&#xff0c;請幫我隨手star一下。 需求 最近在項目中需要加一個功能&#xff0c;在小程序中將已有的短視頻功能&#xff0c;按照抖音的方式來瀏覽&#xff0c;整屏&#xff0c;可上…

Coding For Fun 32小時:充滿創造、激情、團結的編程馬拉松

摘要&#xff1a;Coding for Fun大賽是2012中國軟件開發者大會&#xff08;SDCC&#xff09;的重要環節。由六名黑馬學員組成的“天翼二隊”&#xff0c;經過32小時的“血拼”&#xff0c;憑大賽作品“語音控”&#xff0c;獲得了本次大賽的“最佳設計獎”。本文是該隊隊員的參…

centos6.8安裝oracle12C 詳細步驟講解

2019獨角獸企業重金招聘Python工程師標準>>> centos6.8安裝oracle12C 詳細步驟講解 安裝前環境配置 1 root身份安裝依賴包 [rootdlp ~]# yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33.i686 gcc gcc-c glibc glibc.i686 glibc-deve…

解決 springboot 項目:找不到或無法加載主類

Spring Boot下無法加載主類 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我什么也沒有改&#xff0c;啟動服務報錯如題&#xff1a;找不到或無法加載主類 解決&#xff1a;什么也不…

管理好你的愿望,人生將另一個樣

別讓欲望控制了你欲望是人的本性。人生在世&#xff0c;誰都會有欲望。物欲、食欲、情欲、發財欲、求知欲……欲望是消防隊也無法撲滅的火。作為人&#xff0c;我們不能消除欲望&#xff0c;也不能讓欲望漫無邊際地增長&#xff0c;所以&#xff0c;我們應該把握好欲望的尺度&a…

25 模塊和包

今日內容 import from xxx import xxxx 金庸 1. 導入模塊的執行的步驟 2. 自定義模塊 3. 自定義包(難點) 一個表達式 -> 一條語句 -> 語句塊 -> 函數 -> 類 -> 模塊 -> 包 -> 項目 包就是我們的文件夾, 包內可以寫很…