1. Dubbo是什么?
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
2. 为什么使用Dubbo
3. zookeeper和nacos区别
- 存储方式 zookeeper以树形节点的方式进行存储。当有节点效性,出错以事件的方式通知消费端,nacos 以数据库进行存储,
- CAP方式 Zookeeper保证CP当向注册中心查询服务列表时,我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。但是zk会出现这样一种情况,当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30 ~ 120s, 且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得zk集群失去master节点是较大概率会发生的事,虽然服务能够最终恢复,但是漫长的选举时间导致的注册长期不可用是不能容忍的。 nacos保持了AP+CP nacos支持持久化和非持久化存储即有点 AP和CP 分布式一致性的概念,nacos的CP-持久化更像贴合zk的模式(过半机制),默认非持久化采用内存存储速度更快,而且分片存储,不利点就是某个服务节点挂掉,可能出现部分时间调用失败。因为服务调用本身就是实时的,持久化存储起来应该意义不大,及时变化才是真理。
4. 安装zookeeper注册中心
http://mirrors.hust.edu.cn/apache/zookeeper/
解压使用:
- 修改conf目录下zoo.sample.cfg 重名为zoo.cfg
- 启动bin目录下 zkServer.cmd
5. Dubbo的流程
1.服务容器负责启动,加载,运行服务提供者。
2.服务提供者在启动时,向注册中心注册自己提供的服务。
3.服务消费者在启动时,向注册中心订阅自己所需的服务。
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册
中心将基于长连接推送变更数据给消费者。
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一
台提供者进行调用,如果调用失败,再选另一台调用。
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时
每分钟发送一次统计数据到监控中心。
6. 提供者的代码
6.1 创建一个提供者工程
6.2 引入相关的jar文件。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterparent</artifactId><version>2.3.3.RELEASE</version></parent><dependencies><dependency><groupId>com.ykq</groupId><artifactId>springboot-dubbo-common115</artifactId><version>1.0-SNAPSHOT</version></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterweb</artifactId></dependency><!--引入dubbo和springboot整合的依赖 xx-springboot-starter--><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-bootstarter</artifactId><version>0.2.0</version></dependency><!--zookeeper的 依赖--><!-- 引入zookeeper,去除其中的log4j,否则会因为日
志原因导致堆栈溢出 --><dependency><groupId>org.apache.zookeeper</groupId>6.3 配置文件
6.4 主启动类
<artifactId>zookeeper</artifactId><version>3.4.10</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4jlog4j12</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.9</version></dependency></dependencies>
6.3 配置文件
server.port=8001
# 服务名称 spring.application.name
dubbo.application.name=springboot-dubbo-provider115
# 该提供者注册的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 使用的什么协议来访问该服务。 dubbo http ftp jdbc amqp
dubbo.protocol.name=dubbo
# 暴漏的端口号
dubbo.protocol.port=20880
# 服务端
dubbo.protocol.status=server
6.4 主启动类
@SpringBootApplication@EnableDubbo//开启dubbo注解publicclassAppProviderBeryL{publicstaticvoidmain(String[] args){SpringApplication.run(AppProviderBeryL.class,args);}}
6.5 业务工程
@Service//dubbo的注解@Component// 由spring帮你创建对象publicclassProviderServiceImplimplementsProviderService{@OverridepublicStringsayHello(){return"hello dubbo 8001";}}
6.6 启动
我们可以通过dubbo 提供了一个UI界面
进入解压目录
进入dubbo-admin/target目录
7. 消费的代码
7.1 依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterparent</artifactId><version>2.3.3.RELEASE</version></parent><dependencies><dependency><groupId>com.ykq</groupId><artifactId>springboot-dubbo-common115</artifactId><version>1.0-SNAPSHOT</version></dependency><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starterweb</artifactId></dependency><!--引入dubbo和springboot整合的依赖 xx-springboot-starter--><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-bootstarter</artifactId><version>0.2.0</version></dependency><!--zookeeper的 依赖--><!-- 引入zookeeper,去除其中的log4j,否则会因为日
志原因导致堆栈溢出 --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4jlog4j12</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.9</version></dependency></dependencies>
7.2 配置文件
ubbo.application.name=springboot-dubbo-consumer115
server.port=9001
dubbo.registry.address=zookeeper://127.0.0.1:2181
7.3 主启动类
@SpringBootApplication@EnableDubbopublicclassAppConsumerBeryL{publicstaticvoidmain(String[] args){SpringApplication.run(AppConsumerBeryL.class,args);}}
7.4 controller代码
@RestController@RequestMapping("consumer")publicclassConsumerController{@Reference(interfaceName ="springboot-dubbo-provider-BeryL")privateProviderService providerService;@GetMapping("show")publicStringshow(){return providerService.sayHello();}}
7.5 测试
8. dubbo的负载均衡
版权归原作者 小新爱编程 所有, 如有侵权,请联系我们删除。