Dubbo 快速入门,记录下
概要:
- Dubbo 快速入门
- Dubbo 常规配置说明
一、Dubbo 快速入门
Dubbo核心功能解释
dubbo 阿里开源的一个SOA服务治理框架,从目前来看把它称作是一个RPC远程调用框架更为贴切。单从RPC框架来说,功能较完善,支持多种传输和序列化方案。所以想必大家已经知道他的核心功能了:就是远程调用
。
快速演示Dubbo的远程调用
实现步骤
- 创建服务端项目
- 引入dubbo 依赖
- 编写服务端代码
- 创建客户端项目
- 引入dubbo 依赖
- 编写客户端调用代码
dubbo 引入:【注解模式好像需要2.7】
com.alibaba
dubbo
2.6.2
dubbo 默认依懒:
客户端代码:
/**
* @author huey China.
* @Description : spring 整合 dubbo multicast
* @Date Created in 2018/11/26 下午23:02
*/
public class YoungClient {
// 基于 URL构建远程服务
public UserService buildRemoteService(String remoteUrl) {
//引用配置
ReferenceConfig referenceConfig = new ReferenceConfig();
referenceConfig.setInterface(UserService.class);
referenceConfig.setRegistry(new RegistryConfig("multicast://224.1.2.3:11111"));
referenceConfig.setUrl(remoteUrl);
//应用
referenceConfig.setApplication(new ApplicationConfig("young-app"));
referenceConfig.setLoadbalance("roundrobin");
return referenceConfig.get();
}
public static void main(String[] args) throws IOException {
YoungClient client = new YoungClient();
UserService service = client.buildRemoteService(null);
int count = 0;
String cmd;
while (!"exist".equals(cmd = read())) {
System.out.println(
// 测试
service.getUser(1111)
);
}
}
private static String read() throws IOException {
byte[] b = new byte[1024];
LineNumberReader lineNumber = new LineNumberReader(
new InputStreamReader(System.in));
return lineNumber.readLine();
}
}
服务端代码:
/**
* @author huey China.
* @Description : spring 整合 dubbo multicast
* @Date Created in 2018/11/26 下午23:02
*/
public class SimpleServer {
public void openService(int port)throws Exception {
// 服务配置
ServiceConfig serviceConfig = new ServiceConfig();
// 设置服务接口
serviceConfig.setInterface(UserService.class);
// 设置开放的协议
serviceConfig.setProtocol(new ProtocolConfig("dubbo", port));
// 设置一个空的注册中心
serviceConfig.setRegistry(new RegistryConfig("multicast://224.1.2.3:11111")); //网卡需要支持 走过虚拟网卡不支持的坑 设置host 本机名称和物理ip映射
// 设置服务当前所在应用
serviceConfig.setApplication(new ApplicationConfig("simple-app"));
// 设置服务实现对象
UserServiceImpl ref = new UserServiceImpl(); serviceConfig.setRef(ref);
// 暴露服务
serviceConfig.export();
List list = serviceConfig.getExportedUrls();
ref.setPort(list.get(0).getPort());
System.out.println("服务已开启 :" + list.get(0).getPort());
}
// 20880 20881
public static void main(String[] args) throws Exception {
new SimpleServer().openService(-1);
System.in.read();
}
}
运行验证截图
基于Dubbo实现服务集群:
在上一个例子中如多个服务的集群?即当有多个服务同时提供的时候,客户端该调用哪个?以什么方式进行调用以实现负载均衡?
一个简单的办法是将多个服务的URL同时设置到客户端并初始化对应的服务实例,然后以轮询的方式进行调用。
但如果访问增大,需要扩容服务器数量,那么就必须增加配置重启客户端实例。显然这不是我们愿意看到的。Dubbo引入了服务注册中的概念,可以解决动态扩容的问题。
演示基于注册中心实现服集群:
- 修改服务端代码,添加multicast 注册中心。
- 修改客户端代码,添加multicast 注册中心。
- 观察 多个服务时,客户端如何调用。
- 观察 动态增减服务,客户端的调用。
# 服务端连接注册中心
serviceConfig.setRegistry(new RegistryConfig("multicast://224.1.1.1:2222"));
# 客户端连接注册中心
referenceConfig.setRegistry(new RegistryConfig("multicast://224.1.1.1:2222"));
查看 基于**UDP** 占用的2222 端口
netstat -ano|findstr 2222
基于spring IOC维护Dubbo 实例
在前面两个例子中 出现了,ApplicationConfig、ReferenceConfig、RegistryConfig、com.alibaba.dubbo.config.ServiceConfig等实例 ,很显然不需要每次调用的时候都去创建该实例那就需要一个IOC 容器去管理这些实例,spring 是一个很好的选择。
提供者配置----------------------------------
提供者服务暴露代码:
ApplicationContext context = new ClassPathXmlApplicationContext("/spring-provide.xml");
((ClassPathXmlApplicationContext) context).start();
System.in.read();
消费者配置---------------------------------------
消费者调用代码:
ApplicationContext context = new ClassPathXmlApplicationContext("/spring-consumer.xml");
UserService userService = context.getBean(UserService.class);
UserVo u = userService.getUser(1111);
System.out.println(u);
运行验证截图
二、Dubbo常规配置说明
Dubbo配置的整体说明:
| 标签 | 用途 | 解释 |
|:----|:----|
|
|
|
|
|
|
|
|
|
配置关系图:
配置分类
所有配置项分为三大类。
- 服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方。
- 服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
- 性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。
dubbo 配置的一些套路:
先来看一个简单配置
通过字面了解 timeout即服务的执行超时时间。但当服务执行真正超时的时候 报的错跟timeout并没有半毛钱的关系,其异常堆栈如下:
可以看到错误表达的意思是 因为Channel 关闭导致 无法返回 Response 消息。
出现这情况的原因在于 虽然timeout 配置在服务端去是用在客户端,其表示的是客户端调用超时间,而非服务端方法的执行超时。当我们去看客户端的日志时候就能看到timeout异常了
类似这种配在服务端用在客户端的配置还有很多,如retries/riː'traɪ/(重试次数)、async/əˈsɪŋk/(是否异步)、loadbalance(负载均衡)。。。等。
套路一:服务端配置客户端来使用。
注:其参数传递机制是 服务端所有配置都会封装到URL参数,在通过注册中心传递到客户端
如果需要暴露多个服务的时候,每个服务都要设置其超时时间,貌似有点繁琐。Dubbo中可以通过
#相当于每个服务提供者设置了超时时间 和重试次数
同样客户端也有缺省配置标签:
、
套路二:
在服务端配置timeout 之后 所有客户端都会采用该方超时时间,其客户端可以自定义超时时间吗?通过
小提示:通过DefaultFuture的get 方法就可观测到实际的超时设置。
com.alibaba.dubbo.remoting.exchange.support.DefaultFuture
套路三:同一属性到处配置,优先级要小心。
总结
如果本地有虚拟网卡 注意本地虚拟网卡的坑,可根据Dubbo源代码追踪,设置本地物理Ip和本机名称(如hueydeMackBook.local)做映射
参考
官网:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
GitBook:https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html