浅谈Dubbo服务

Dubbo分布式服

 推荐大家一个画图工具:https://www.processon.com/i/572d51efe4b0c3c74981ec14

1.Dubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同server。目的分摊压力。dubbo在淘宝也是解决他们实际问题的,不一定适合其他。 另外各家公司也都有大同小异的实现,所以没多少人用、也就没多少介绍。

原理就是:A系统调用B系统接口服务, 后面就是怎么把这个流程,动态化(zookeeper通知)、权限化、配置化、低耦合化、自动化。

 

 

一.dubbo出现的背景

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,需一个治理系统确保架构有条不紊的演进。

目前市场一些基本的架构:

  • 单一应用架构
    • 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
    • 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。
  • 垂直应用架构
    • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
    • 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
  • 分布式服务架构
    • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
    • 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
  • 流动计算架构
    • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
    • 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

在大规模服务化之前,一般只是简单的暴露和引用远程服务,通过配置url进行调用,用f5或者nginx等进行负载均衡;

 

二.Dubbo架构

官网架构图:

 

 

节点角色说明:

  • Provider: 暴露服务的服务提供方。
  • Consumer: 调用远程服务的服务消费方。
  • Registry: 服务注册与发现的注册中心。
  • Monitor: 统计服务的调用次调和调用时间的监控中心。
  • Container: 服务运行容器。

调用关系说明:

  • 0. 服务容器负责启动,加载,运行服务提供者。
  • 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
  • 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  • 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  • 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  • 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

连通性:

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健状性:

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

三.用法

本地服务配置文件:local.xml

<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” />

 

<bean id=“xxxAction” class=“com.xxx.XxxAction”>

    <property name=“xxxService” ref=“xxxService” />

</bean>

 

远程服务配置

在本地服务的基础上,只需做简单配置,即可完成远程化:

  • 将上面的local.xml配置拆分成两份,将服务定义部分放在服务提供方remote-provider.xml,将服务引用部分放在服务消费方remote-consumer.xml。
  • 并在提供方增加暴露服务配置<dubbo:service>,在消费方增加引用服务配置<dubbo:reference>。

 

 

服务者配置provider.xml

<bean id=“xxxService” class=“com.xxx.XxxServiceImpl” /> <!-- 和本地服务一样实现远程服务 -->

 

<dubbo:service interface=“com.xxx.XxxService” ref=“xxxService” /> <!-- 增加暴露远程服务配置 -->

 

 

 

 

Throwbill作为服务者实例:

 

<bean id="iTSMService" class="com.sitech.throwbill.easyask.service.itsm.impl.ITSMServiceImpl" />

 

<dubbo:service interface="com.sitech.throwbill.easyask.service.itsm.ITSMService" ref="iTSMService" version="1.0">

<dubbo:method name="putChatMessage" servicecode="33.1013.putChatMessage"/>

<dubbo:method name="queryAllChatMessage" servicecode="33.1013.queryAllChatMessage"/>

</dubbo:service><!--暴露远程服务的配置接口-->

 

作为服务者完整配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 

    <!-- 提供方应用信息,用于计算依赖关系 -->

    <dubbo:application name="hello-world-app"  />

 

    <!-- 使用multicast广播注册中心暴露服务地址 -->

    <dubbo:registry address="multicast://224.5.6.7:1234" />

 

    <!-- 用dubbo协议在20880端口暴露服务 -->

    <dubbo:protocol name="dubbo" port="20880" />

 

    <!-- 声明需要暴露的服务接口 -->

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />

 

    <!-- 和本地bean一样实现服务 -->

    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />

 

</beans>

 

 

 

 

消费者配置consumer.xml

<dubbo:reference id=“xxxService” interface=“com.xxx.XxxService” /> <!-- 增加引用远程服务配置 -->

 

<bean id=“xxxAction” class=“com.xxx.XxxAction”> <!-- 和本地服务一样使用远程服务 -->

    <property name=“xxxService” ref=“xxxService” />

</bean>

 

作为服务者的完整配置:

 

Throwbill作为消费者实例:

<bean id="easkMessageService" class="com.sitech.service.dubbo.EaskMessageServiceImpl"></bean>

<dubbo:reference id="ymItsmService" interface="com.ffcs.itsm.zj.service.EasyAsk2ItsmService" version="1.0">

<dubbo:method name="launchItsmEventFlow servicecode="33.1404.launchEventFlow"/>

<dubbo:method name="changeItsmEventState"  servicecode="33.1404.changeEventFlowState" />

</dubbo:reference>

 

作为消费者完整配置文件:

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

    xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://code.alibabatech.com/schema/dubbo        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

 

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->

    <dubbo:application name="consumer-of-helloworld-app"  />

 

    <!-- 使用multicast广播注册中心暴露发现服务地址 -->

    <dubbo:registry address="multicast://224.5.6.7:1234" />

 

    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->

    <dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />

 

</beans>

 

 

 

  • <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
  • <dubbo:reference/> 引用配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
  • <dubbo:protocol/> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
  • <dubbo:application/> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
  • <dubbo:module/> 模块配置,用于配置当前模块信息,可选。
  • <dubbo:registry/> 注册中心配置,用于配置连接注册中心相关信息。
  • <dubbo:monitor/> 监控中心配置,用于配置连接监控中心相关信息,可选。
  • <dubbo:provider/> 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。
  • <dubbo:consumer/> 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。
  • <dubbo:method/> 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。
  • <dubbo:argument/> 用于指定方法参数配置。

四.注册中心

 

 

流程:
1.服务提供者启动时向/dubbo/com.foo.BarService/providers目录下写入URL
2.服务消费者启动时订阅/dubbo/com.foo.BarService/providers目录下的URL向/dubbo/com.foo.BarService/consumers目录下写入自己的URL
3.监控中心启动时订阅/dubbo/com.foo.BarService目录下的所有提供者和消费者URL



支持以下功能:

1.当提供者出现断电等异常停机时,注册中心能自动删除提供者信息。

2.当注册中心重启时,能自动恢复注册数据,以及订阅请求。

3.当会话过期时,能自动恢复注册数据,以及订阅请求。

4.当设置<dubbo:registry check="false" />时,记录失败注册和订阅请求,后台定时重试。

5.可通过<dubbo:registry username="admin" password="1234" />设置zookeeper登录信息。

6.可通过<dubbo:registry group="dubbo" />设置zookeeper的根节点,不设置将使用无根树。

7.支持*号通配符<dubbo:reference group="*" version="*" />,可订阅服务的所有分组和所有版本的提供者。



注:阿里内部并没有采用Zookeeper做为注册中心,而是使用自己实现的基于数据库的注册中心,即:Zookeeper注册中心并没有在阿里内部长时间运行的可靠性保障,此Zookeeper桥接实现只为开源版本提供,其可靠性依赖于Zookeeper本身的可靠性。

css调试技巧,向上找问题,布局受上一层级影响 ======================================================== rTools下载 rtools.huawei.com ======================================================== iSource http://isource.huawei.com/UNB_NI/CommonUDWebsite/tree/dev/ ======================================================== GIt 提交 Message规范 【问题单号】:US201904 【修改人】:wWX611086 【修改说明】:家宽网络评估- ======================================================== npm跑项目 npm run dev --project:app=NCAppNetworkQualityCheckWebsite --project:ip=10.21.217.123 项目编译f npm run build --project:app=NCNetworkEvalWebsite --project:buildPath=BCAppUDSituationEvalWebsite npm run build --project:app=NCAppNetworkQualityCheckWebsite --project:buildPath=NCAppNetworkQualityCheckWebsite ======================================================== VS code 离线安装插件 code --install-extension debugger-for-chrome.vsix ======================================================== nginx下载 \\10.74.200.216\devInitor ======================================================== 代码冲突: 1.备份冲突文件 2.原文件revert 3.在 beyond compared 上对比: 不是自己修改的按照revert版本 是自己修改的按自己的版本 ======================================================== WinSCP 账号密码: 100.100.92.213 root zzfwuNB@789! ======================================================== Navicat Premium 账号密码: 连接名:环境清单-指定服务-数据库IP 账号:root 密码:Huawei@123 ======================================================== 网络规划本地文件路径: D:\test\NETWORKUSER\BCAppWNPlanningWebsite\BCAppWNPlanningWebsite\src\main\webapp\appscene\index\dev select * from `table-calculation`.tbl_table_task t where t.project_id='4531447464653000000'; select * from `table-calculation`.tbl_4607808508984000000_8140059922846277632 ======================================================== IP:PORT/eureka/v2/apps 环境清单PaasCseServiceCenter 虚拟机IP redis软件 ip 环境清单CPAccessService redisIP nginx、hostIp 环境清单CPAccessService 虚拟机IP WinSCP 环境清单 对应服务 虚拟机IP OMGreyService -> mysqlIP -> 灰度添加权限 db_grey -> tbl_sys_user_authority applicatioin.properties serviceCenters.uri 环境清单 PaasCseServiceCenter 虚拟机IP application.cache 环境清单 CPPortalService MYSQLIP 端口占用 netstat -ano|findstr 3001 查看占用3001端口的进程 taskkill -PID 17472 -F 杀死指定的进程 ======================================================== PI5 1+4 网络评估-指标参数配置 PI6 FMC网络体验建网解决方案 PI7 数据清洗工具-异常数据分类 PI8 数据清洗工具-数据流程操作可视化 PI9 商业洞察-流量增长分析-基于业务发展模型预测-参数设置 PI2 otn下沉-拓扑规划-结果页面前台展示 PI3 otn下沉-网络评估-光缆资源规划 PI4 otn下沉目标网跨域页面、目标网参数配置 PI5 目标网投资建议参数配置前后台 PI2 拓扑框搜索框 PI3 前台三方件 PI4 链路档位扩展、拓扑参数配置增加默认GIS/TOPO配置、添加网元角色识别信息表格 PI5 基础资源库-左侧面板-四级联动下拉框、刷新数据统计表格 PI6 基础资源库-gis区域绘制、编辑、合并 PI7 基础资源库-数据呈现界面 PI8 管控平台 /**********************************代码片段**********************************/ // 根据指定key对对象数组进行排序 function sortByKey(array, key) { return array.sort(function (a, b) { var x = a[key] var y = b[key] return ((x < y) ? 1 : ((x > y) ? -1 : 0)); }) } // 生成随机16进制代码 '#'+Math.floor(Math.random()*0xffffff).toString(16).padStart(6,'0') // 创建过去7天的数组 [...Array(7).keys()].map(days=>new Date(Date.now() - 86400000*days).toLocaleString()) // 打乱数组元素顺序 (arr)=>arr.slice().sort(()=>Math.random() - 0.5); // 面试题 for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz')) f=i%3?'':'Fizz' // 返回一个图形键盘 (_=>[..."`1234567890-=~~QWERTYUIOP[]\\~ASDFGHJKL;'~~ZXCVBNM,./~"].map(x=>(o+=`/${b='_'.repeat(w=x<y?2:' 667699'[x=["BS","TAB","CAPS","ENTER"][p++]||'SHIFT',p])}\\|`,m+=y+(x+' ').slice(0,w)+y+y,n+=y+b+y+y,l+=' __'+b)[73]&&(k.push(l,m,n,o),l='',m=n=o=y),m=n=o=y='|',p=l=k=[])&&k.join`\n`)() // 将页面所有元素画上轮廓 [].forEach.call($$("*"),(a)=>(a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16))) // 浮点数比较大小 Math.abs(.3 - (.1+.2)) { let DIGIT_PATTERN = /(^|\s)\d+(?=\.?\d*($|\s))/g let MILI_PATTERN = /(?=(?!\b)(\d{3})+\.?\b)/g return (num) => num && num.toString() .replace(DIGIT_PATTERN, (m) => m.replace(MILI_PATTERN, ',')) })() =============================================================================================== vuex state -- data getters -- computed mutations -- async methods actions -- sync methods =============================================================================================== prettier --write "src\app\NITNetRiskEvalWebsite\**\*.vue*" =============================================================================================== 切换了机器的redis密码是这个:uNBRedis@123! 178 NCNetIndicatorService 10.44.162.186:9862 =============================================================================================== git 生成公钥 ssh-keygen -t rsa -b 4096 -C "1102042793@qq.com" -f ~/.ssh/id_rsa_git =============================================================================================== IDEA/Chrome 条件断点 =============================================================================================== DTS 请在3.1.130 后之后版本进行验证 npm run build --app=ITAppNetRiskEvalWebsite --buildPath=NITNetRiskEvalWebsite =============================================================================================== 修改环境上的资源文件的 Owner Group chown -R ossuser dist chgrp -R ossgroup dist chown -R ossuser:ossgroup * http://ideacode.tools.huawei.com/#/plugins/PluginForIntellij =============================================================================================== 灰度IP 144 10.44.163.104 32096 179 10.44.153.121 32097 =============================================================================================== 一键升级项目 D:\software\updateRedis\startup.bat =============================================================================================== 【审核人是否已完成代码检视】:是 【是否在集成环境上完成了验证】:是 【审核是否通过】:是 =============================================================================================== 远程调试 su - ossadm -c "bash /opt/oss/manager/agent/bin/ipmc_adm -cmd restartapp -app NNCNetworkEvalWebsite" export CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9528" =================================================================================================== KAI 提代码 review h00423239,q00352014,w00379106,w00422088,x00379405,y00354292,z00468060 PI2 topo搜索框;参数;idn目标网和智能域网专线规划解决方案适配 US20200508075365;US20200510807373;US20200512813608 ================================================================================ 服务在云龙上配置屏蔽complie告警 服务部署 -> xxxService_complie -> 编辑 -> 底下高级 -> message to ignore [\S\s]+is invalid: input contained no data[\S\s]+,[\S\s]+The metadata[\S\s]+,[\S\s]+Checksum validation failed[\S\s]+,[\S\s]+Maven will be executed[\S\s]+,[\S\s]+Ignoring unrecognized[\S\s]+,**is invalid: input contained no data**,**Checksum validation failed**,**Ignoring unrecognized**,**The metadata** https://unb164-commonservice.huawei.com:31943/NBAAppFrameWebsite/scene/index.action?cur_project_id=1445303537404000000&cur_scene_id=10100000&current_project_name=IPcore_%25E7%25BB%258F%25E5%2585%25B8%25E6%25A1%2588%25E4%25BE%258B&redirectFlag=0&appType=uNetBuilder& ================================================================================ 跨机拷贝 scp -r root@10.44.163.188:/opt/project/2194863595361000000/SRC/mt/* /opt/project/2235287178607000000/SRC/mt shift + insert 执行已复制的命令 chown -R ossuser:ossgroup /opt/project/2228366060107000000/* 【压缩和解压】 tar -czvf 1.gz SRC scp -r root@10.44.163.188:/opt/project/2194863595361000000/1.gz /opt/project/2236095176807000000/1.gz tar -xzvf 1.gz ==================================================================================================== @AllArgsConstructor 全参构造器注解 ==================================================================================================== DTS2020090108489;DTS2020090204778;DTS2020090108428;DTS2020090107400;DTS2020090107272;DTS2020090104429;DTS2020090102845 问题单号】(:|:)\s*.+\W【修改说明】(:|:)\s*.+\W|update version|update app_define.json|maven-release-plugin|UADP[0-9]{5,}|CBaaS \S+|Revert \s*.+|(\[(US|DTS|#)[\dA-Z]{1,19}\]\[(feat|fix|docs|style|refactor|test|chore)\].+) ==================================================================================================== US20201110024643 请于2020.12.10晚上BasicDataManagementWebsite 转测版本进行验证

转载自:https://www.cnblogs.com/chafe/p/5945209.html

posted @ 2020-11-29 14:09  一纸荒唐  阅读(287)  评论(0编辑  收藏  举报