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(优先级:方法级优先,接口级次之,全局配置再次之)
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远程调用服务
记得开启@EnableDubbo(或者配置Dubbo.scan.base.packages)
记得开启@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
服务降级
当服务器压力剧增的情况下,根据实际业务情况及流量,对一些服务和页面有策略的不处理,
或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作
或换种简单的方式处理,从而释放服务器资源以保证核心交易正常运作或高效运作
两种屏蔽方式
强制返回null
moke=force:return+null
在dubbo-header可视化界面,直接点击屏蔽掉消费者的服务调用请求
调用失败后返回null
moke=fail:return+null
点击可视化界面中消费者列表的容错,进行服务屏蔽,它会调用,失败便返回null
集群容错
提供者和消费者都导入Hystrix框架支持
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
主启动类上添加@EnableHystrix
提供方的方法上加上@HystrixCommand注解,声明该方法被Hystrix代理,Hystrix可对该方法进行容错处理
在消费者对提供者方法进行调用的方法上,也添加@HystrixCommand注解(添加fallbackMethod属性,可定义调用失败后的回调函数)
Dubbo原理
相关
RPC原理
一次完整的RPC调用(U型环):RPC就是将2-8步进行封装
1、服务消费方(client)以本地方式调用服务(即接口)
2、client stub(服务代理)接收到调用后将方法,参数等组装成能够进行网络传输的消息体(如序列化)
3、client stub找到服务地址,并将消息发送到服务端
4、server stub接收到消息体后进行解码
5、server stub根据解码结果调用本地的服务
6、本地服务执行并将结果返回给serverstub
7、server stub将返回结果打包成消息并发送至消费方
8、client stub接收到消息,并进行解码
9、服务消费方得到最终结果
1、服务消费方(client)以本地方式调用服务(即接口)
2、client stub(服务代理)接收到调用后将方法,参数等组装成能够进行网络传输的消息体(如序列化)
3、client stub找到服务地址,并将消息发送到服务端
4、server stub接收到消息体后进行解码
5、server stub根据解码结果调用本地的服务
6、本地服务执行并将结果返回给serverstub
7、server stub将返回结果打包成消息并发送至消费方
8、client stub接收到消息,并进行解码
9、服务消费方得到最终结果
netty通信原理
Netty 是一个基于NIO(Non-Blocking IO)的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,
例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程
例如实现了某种协议的客户、服务端应用。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网络通信框架(就是一个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前添加pause语句,便可查看报错情况
error提示找不到conf下的zoo.cfg文件,此时将zoo_sample.cfg文件复制一份,改名为zoo.cfg即可
实战
新建提供者服务
卖票服务提供者
添加依赖
Dubbo依赖
<!-- dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.5</version>
</dependency>
Zookeeper客户端
<!-- zkclient客户端 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
zookeeper服务端
<!--日志会冲突-->
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!--服务端-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!--服务端-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
添加配置
application.propertites
# 服务端口
server.port=8001
# 注册应用名字
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪个包内的服务要被注册
dubbo.scan.base-packages=com.kk.service
server.port=8001
# 注册应用名字
dubbo.application.name=provider-server
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 哪个包内的服务要被注册
dubbo.scan.base-packages=com.kk.service
在服务的类上加上org.springframework.stereotype.Service包下的@Service注解
在主启动类上加上@EnableDubbo注解
启动Zookeeper注册中心
管理员身份启动zkServer.cmd
cmd页面启动dubbo-admin.jar
访问localhost:7001
如出现端口被占用的情况
netstat -ano|findstr "7001",查看到pid
终止该进程,重启
启动卖票服务
dubbo-admin页面查看服务(一启动就自动将服务注册进Zookeeper中)
Zookeeper和dubbo-admin的启动doc窗口多点点回车键
Zookeeper和dubbo-admin的启动doc窗口多点点回车键
启动消费者服务
新建消费者服务
买票服务消费者
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
添加配置
application.propertites
server.port=8002
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
远程引用(指定哪一个服务)
利用pom坐标
定义路径相同的接口名
@Reference
TicketService ticketService;
TicketService ticketService;
买票服务消费者
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
添加配置
application.propertites
server.port=8002
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
远程引用(指定哪一个服务)
利用pom坐标
直接在consumer中引入provider的依赖
同样利用@Reference注解
定义路径相同的接口名
利用@Reference注解,远程引入提供者接口对象,调用提供者的接口方法
@Reference
TicketService ticketService;
TicketService ticketService;
在主启动类上加上@EnableDubbo注解
测试
添加依赖
Dubbo依赖
Zookeeper客户端
zookeeper服务端
提供者的依赖(pom坐标)
添加配置
application.propertites
server.port=8002
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址,可以在任何一台电脑上
dubbo.registry.address=zookeeper://127.0.0.1:2181
远程引用(指定哪一个服务)
利用pom坐标
直接在consumer中引入provider的依赖
同样利用@Reference注解
定义路径相同的接口名
利用@Reference注解,远程引入提供者接口对象,调用提供者的接口方法
@Reference
TicketService ticketService;
TicketService ticketService;
收藏
收藏
0 条评论
下一页