Dubbo+Zookeeper
2020-06-10 10:48:55 0 举报
AI智能生成
Dubbo+Zookeeper
作者其他创作
大纲/内容
Dubbo提供的特性
启动检查(check)
http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html
超时(timeout)
配置的覆盖关系
JVM的启动参数 > application.propertites(同xml文件) > dubbo.propertites(<font color="#c41230">优先级:方法级优先,接口级次之,全局配置再次之</font>)
http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html
http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-consumer.html
重试次数(retries)
多版本(version)
http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html
本地存根
http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html
SpringBoot整合Dubbo的三种方式
注解
导入Dubbo-starter,在application.propertites中配置属性,使用@Service暴露服务,使用@Reference远程调用服务<br>记得开启@EnableDubbo(或者配置Dubbo.scan.base.packages)
配置文件
保留dubbo.xml配置文件,在主启动类上利用@ImportResource(Locations=XXX)注解引入该配置文件
配置类
写配置类@Configuration
手动创建组件,@Bean放到容器中
主启动类@EnableDubbo(ScanBasePackage=XXX)
dubbo直连
没有注册中心也可调用服务
在@Reference注解里添加url属性,指定所调服务的ip和端口,例如:@Reference(url="127.0.0.1:20880")
高可用
Zookeeper的健壮性
现象
zookeeper注册中心宕机,还可以消费dubbo暴露服务
原因
监控中心宕掉不影响使用,只是丢失部分采样设计
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复
负载均衡
http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html
随机:Random LoadBalance
可在可视化管理界面调整权重
轮询:RoundRobin LoadBalance
最少活跃调用数:LeastActive LoadBalance
一致性 Hash:ConsistentHash LoadBalance
服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,<br>或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作<br>
两种屏蔽方式
强制返回null
moke=force:return+null
在dubbo-header可视化界面,直接点击屏蔽掉消费者的服务调用请求
调用失败后返回null
moke=fail:return+null
点击可视化界面中消费者列表的容错,进行服务屏蔽,它会调用,失败便返回null
集群容错<br>
提供者和消费者都导入Hystrix框架支持
<dependency><br> <groupId>org.springframework.cloud</groupId><br> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId><br> </dependency>
主启动类上添加<font color="#c41230">@EnableHystrix</font>
提供方的方法上加上<font color="#c41230">@HystrixCommand</font>注解,声明该方法被Hystrix代理,Hystrix可对该方法进行容错处理
在消费者对提供者方法进行调用的方法上,也添加@HystrixCommand注解(添加fallbackMethod属性,可定义调用失败后的回调函数)
Dubbo原理
相关
RPC原理
一次完整的RPC调用(U型环):<font color="#c41230">RPC就是将2-8步进行封装</font><br>1、服务消费方(client)以本地方式调用服务(即接口)<br>2、client stub(服务代理)接收到调用后将方法,参数等组装成能够进行网络传输的消息体(如序列化)<br>3、client stub找到服务地址,并将消息发送到服务端<br>4、server stub接收到消息体后进行解码<br>5、server stub根据解码结果调用本地的服务<br>6、本地服务执行并将结果返回给serverstub<br>7、server stub将返回结果打包成消息并发送至消费方<br>8、client stub接收到消息,并进行解码<br>9、服务消费方得到最终结果
netty通信原理
Netty 是一个<font color="#c41230">基于NIO(Non-Blocking IO)</font>的<font color="#16884a">客户、服务器端编程框架</font>,使用Netty 可以确保你快速和简单的开发出一个网络应用,<br>例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程
BIO和NIO的区别
https://mp.weixin.qq.com/s/EVequWGVMWV5Ki2llFzdHg
dubbo原理
框架设计
http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html
启动解析,加载配置信息
服务暴露
服务引用
服务调用
分布式系统
由一组通过网络通信,为了完成共同的任务而协调工作的计算机节点组成的系统
1、什么是 Dubbo
Apache Dubbo是一款高性能、轻量级的开源java RPC<font color="#c41230">网络通信框架</font>(就是一个jar包),帮助java程序连接到zookeeper
http://dubbo.apache.org/img/architecture.png
提供了三大核心能力
面向接口的远程方法调用
智能容错和负载均衡
服务自动注册和发现
由Zookeeper实现
默认端口号:2181
2、Dubbo-admin安装
Dubbo-admin可视化监控管理程序
Dubbo-admin是一个SpringBoot项目,下载下来后直接打成jar,启动运行即可提供服务
localhost:7001
默认用户名密码都为root
Zookeeper安装与启动
直接解压安装包
bin目录下启动zkServer.cmd
启动出现出现闪退,打开zkServer.cmd文件,在endlocal前添加<font color="#f1753f">pause</font>语句,便可查看报错情况
error提示找不到conf下的zoo.cfg文件,此时将zoo_sample.cfg文件复制一份,改名为zoo.cfg即可
实战
新建提供者服务
卖票服务提供者
添加依赖
Dubbo依赖
<!-- dubbo-spring-boot-starter --><br> <dependency><br> <groupId>org.apache.dubbo</groupId><br> <artifactId>dubbo-spring-boot-starter</artifactId><br> <version>2.7.5</version><br> </dependency>
Zookeeper客户端
<!-- zkclient客户端 --><br> <dependency><br> <groupId>com.github.sgroschupf</groupId><br> <artifactId>zkclient</artifactId><br> <version>0.1</version><br> </dependency>
zookeeper服务端
<!--日志会冲突--><br> <!-- 引入zookeeper --><br> <dependency><br> <groupId>org.apache.curator</groupId><br> <artifactId>curator-framework</artifactId><br> <version>2.12.0</version><br> </dependency><br><br> <dependency><br> <groupId>org.apache.curator</groupId><br> <artifactId>curator-recipes</artifactId><br> <version>2.12.0</version><br> </dependency><br><br> <!--服务端--><br> <dependency><br> <groupId>org.apache.zookeeper</groupId><br> <artifactId>zookeeper</artifactId><br> <version>3.4.14</version><br> <!--排除这个slf4j-log4j12--><br> <exclusions><br> <exclusion><br> <groupId>org.slf4j</groupId><br> <artifactId>slf4j-log4j12</artifactId><br> </exclusion><br> </exclusions><br> </dependency>
添加配置
application.propertites
# 服务端口<br>server.port=8001<br># 注册应用名字<br>dubbo.application.name=provider-server<br><font color="#c41230"># 注册中心地址<br>dubbo.registry.address=zookeeper://127.0.0.1:2181<br># 哪个包内的服务要被注册<br>dubbo.scan.base-packages=com.kk.service </font><br>
在服务的类上加上org.springframework.stereotype.Service包下的<font color="#c41230">@Service</font>注解<br>
在主启动类上加上@EnableDubbo注解
启动Zookeeper注册中心
管理员身份启动zkServer.cmd
cmd页面启动dubbo-admin.jar
访问localhost:7001
如出现端口被占用的情况
netstat -ano|findstr "7001",查看到pid<br>
终止该进程,重启
启动卖票服务
dubbo-admin页面查看服务(一启动就自动将服务注册进Zookeeper中)
Zookeeper和dubbo-admin的启动doc窗口多点点回车键
Zookeeper和dubbo-admin的启动doc窗口多点点回车键
启动消费者服务
新建消费者服务
买票服务消费者
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
添加配置
application.propertites
server.port=8002<br>#消费者去哪里拿服务,需要暴露自己的名字<br>dubbo.application.name=consumer-server<br><font color="#c41230">#注册中心地址,可以在任何一台电脑上<br>dubbo.registry.address=zookeeper://127.0.0.1:2181</font><br>
远程引用(指定哪一个服务)
利用pom坐标
定义路径相同的接口名
@Reference<br> TicketService ticketService;
买票服务消费者
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
添加配置
application.propertites
server.port=8002<br>#消费者去哪里拿服务,需要暴露自己的名字<br>dubbo.application.name=consumer-server<br><font color="#c41230">#注册中心地址,可以在任何一台电脑上<br>dubbo.registry.address=zookeeper://127.0.0.1:2181</font><br>
远程引用(指定哪一个服务)
利用pom坐标
直接在consumer中引入provider的依赖
同样利用@Reference注解
定义路径相同的接口名
利用@Reference注解,远程引入提供者接口对象,调用提供者的接口方法
@Reference<br> TicketService ticketService;
在主启动类上加上@EnableDubbo注解
测试
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
提供者的依赖(pom坐标)
添加配置
application.propertites
server.port=8002<br>#消费者去哪里拿服务,需要暴露自己的名字<br>dubbo.application.name=consumer-server<br><font color="#c41230">#注册中心地址,可以在任何一台电脑上<br>dubbo.registry.address=zookeeper://127.0.0.1:2181</font><br>
远程引用(指定哪一个服务)
利用pom坐标
直接在consumer中引入provider的依赖
同样利用@Reference注解
定义路径相同的接口名
利用@Reference注解,远程引入提供者接口对象,调用提供者的接口方法
@Reference<br> TicketService ticketService;
收藏
收藏
0 条评论
下一页