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.mzph.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. 自定义包(难点) 一个表达式 -> 一条语句 -> 语句块 -> 函数 -> 类 -> 模块 -> 包 -> 项目 包就是我们的文件夹, 包内可以写很…