Apache Dubbo是一款微服务开发框架,提供RPC通信和微服务治理功能两大关键能力。使用了Dubbo开发的微服务,将具备相互之间的远程发现和通信能力,同时利用Dubbo提供的丰富服务治理能力,可以实现诸如服务发现,负载均衡,流量调度等服务治理诉求,
Dubbo提供了从服务定义、服务发现、服务通信到流量管控等几乎所有的服务治理能力,并且尝试从使用上对用户屏蔽底层细节,以提供更好的易用性。
Dubbo中所提到的服务,通常是指RPC粒度的,提供某个具体业务增删改功能的接口和方法。
1.服务定义定义服务在Dubbo中简单且直观,使用某种语言绑定的方式(如Java中可直接定义Interface),也可以使用Protobuf IDL语言中立的方式。
2.服务通信点对点的服务通信是Dubbo提供的另一种基本能力,Dubbo以RPC的方式将请求数据(Request)发送给后端服务,并接收服务端返回的计算结果。RPC 通信对用户来说是完全透明的,使用者无需关心请求是如何发出去的、发到了哪里,每次调用只需要拿到正确的调用结果就行。
3.服务发现让微服务组件之间可以独立演进并任意部署,消费端可以在无需感知对端部署位置与 IP 地址的情况下完成通信。Dubbo 提供的是 Client-Based 的服务发现机制。
- 使用独立的注册中心组件,如 Nacos、Zookeeper、Consul、Etcd 等。
- 将服务的组织与注册交给底层容器平台,如 Kubernetes,这被理解是一种更云原生的方式
Dubbo 提供了包括负载均衡、流量路由、请求超时、流量降级、重试等策略,基于这些基础能力可以轻松的实现更多场景化的路由方案,包括金丝雀发布、A/B测试、权重路由、同区域优先等,更酷的是,Dubbo 支持流控策略在运行态动态生效,无需重新部署。
RPC简介RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数;
RPC基本原理:
步骤解析:
RPC的核心模块:通讯,序列化。
- 启动zookeeper !
- 在IDEA创建一个空模块
- 环境所需依赖的Jar包
com.liang
com.liang
1.0-SNAPSHOT
org.apache.dubbo
dubbo-spring-boot-starter
2.7.3
com.github.sgroschupf
zkclient
0.1
org.apache.curator
curator-framework
2.12.0
org.apache.curator
curator-recipes
2.12.0
org.apache.zookeeper
zookeeper
3.4.14
org.slf4j
slf4j-log4j12
公共接口模块
- 添加一个名叫dubbo-api的maven项目
在类路径下org.liang.service包下创建一个 Ticketservice接口,代码如下
package org.liang.service;
public interface TicketService {
String sayHello();
}
写完后记得安装(maven install),这里不需要导入依赖jar包
服务提供者模块1.添加一个名叫dubbo-provider的项目,选择web模块即可
2.在pom.xml导入上面所说的依赖jar包
3.在类路径下com.liang.provider.service包下创建TicketService接口实现类,代码如下:
package com.liang.provider.service;
import org.apache.dubbo.config.annotation.Service;
import org.liang.service.TicketService;
import org.springframework.stereotype.Component;
@Service
@Component
public class TicketServiceImpl implements TicketService {
@Override
public String sayHello() {
return "hello,dubbo";
}
}
- 编写服务提供者的配置,在全局配置文件中添加:
# 应用名称
spring.application.name=dubbo-provider
# 应用服务 WEB 访问端口
server.port=8081
# 注册中心
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 配置dubbo扫描路径
dubbo.scan.base-packages=com.liang.provider.service
# 配置dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=20080
# 连接日志
dubbo.protocol.accesslog=true
服务消费者模块
1.添加一个名叫dubbo-consumer的项目,选择web模块即可
2.在pom.xml导入上面所说的依赖jar包
3.在类路径下com.liang.consumer.controller包下创建TicketSController控制层类,代码如下:
@EnableDubbo
@Controller
public class TicketController {
@Reference
TicketService ticketService;
@RequestMapping("/hello")
@ResponseBody
public String hello()
{
return ticketService.sayHello();
}
}
- 编写服务消费者的配置,在全局配置文件中添加:
# 应用名称
spring.application.name=dubbo-consumer
# 应用服务 WEB 访问端口
server.port=8080
# 注册中心配置
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 包扫描
dubbo.scan.base-packages=com.liang.consumer.controller
# dubbo配置
dubbo.protocol.name=dubbo
dubbo.protocol.host=127.0.0.1
测试
先启动服务提供者,再启动服务消费者
测试结果
- 打开dubbo admin查看是否有服务添加
- 看是否能取到服务
输入localhost:8080/hello
可以访问到,说明dubbo已经实现了定义,发现,通信。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)