1、Dubbo&Dubbox

        Dubbo是一个开源的分布式服务框架,被我国国内很多互联网公司认可并广泛使用,即使放到国际视野来看也是一个非常全面的SOA(面向服务架构)基础框架,因此成功Apache的开源项目。而Dubbox是当当网根据自身的需求,在Dubbo的基础上实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions)。

下面是Dubbo的RESTful风格的远程调用的应用蓝图。

Dubbo简单介绍&入门例子_Dubbo

2、 Dubbo简介

       Dubbo致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单点来说,Dubbo其实就是一个服务框架,如果没有分布式的话,其实不是必须的。只有在分布式的时候,才有分布式服务框架这样的要求,其实本质功能和WebService是非常相似的,就是远程调用服务而已。但是我们不再需要记住WebService中想当麻烦的WSDL了。我们只用以服务者和消费者的方式在Dubbo上注册即可,并且Dubbo的功能远不止远程调用服务这么简单。

3、Dubbo的用途

      1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单的配置(Spring方式配置),没有任何API侵入。

      2、软负载均衡以及容错机制,可以在内网替代F5等硬件负载均衡器,降低成本,减少单点。

      3、服务自动注册与发现,不再需要写死服务提供方的地址,使用注册中心基于接口名来查询服务提供者,并且能够平滑地增加和删除服务提供者提供的服务。

      4、Dubbo采用全Spring配置方式,透明化地接入应用,对应用没有任何API侵入,只需要用Spring加载Dubbo的配置即可(Dubbo基于Spring的Schema扩展进行加载的)。

4、Dubbo入门例子

      我这里使用的Dubbo版本是2.5.3,所以请大家注意好。最新版本和入门例子可到官网上学习:http://dubbo.io

1、因为我们的注册中心使用Zookeeper的,所以先准备好环境。三台机子192.168.1.111、112、113。此处的Zookeeper的Linux环境准备可自行百度,很多。

2、例子的场景很简单,一个服务提供两个方法,一个sayHell,一个getUserlist。将会创建三个maven项目。其中一个为接口服务,一个为服务提供者,一个为服务消费者,两个都需要依赖于接口服务。

3、创建接口服务的maven工程,默认打包方式为jar包,名字为:User-Service

编写实体类User和服务接口UserService。注意实体类要实现Serializable,不然会报通信错误。

(1)代码结构如下:

Dubbo简单介绍&入门例子_Dubbo_02



(2)UserService定义两个方法:


package hyf.dubbo.service;

import java.util.List;
import hyf.dubbo.entity.User;

public interface UserService {
/**
*
* @Desc 根据名称sayHello
* @author Howinfun
* @date 2018年10月12日
* @param name
*/
public void sayHello(String name);
/**
*
* @Desc 获取User列表
* @author Howinfun
* @date 2018年10月12日
* @return
*/
public List<User> getUserList();
}

(3)实体类User:

package hyf.dubbo.entity;

import java.io.Serializable;
//一定要序列化,不然会报错
public class User implements Serializable{
private String name;
private int age;

public User() {
super();
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}

4、创建服务提供者的Maven项目,打包方式为war,以后的例子继续在这上面做。名字为:Dubbo-provider.

(1)代码结构如下:

Dubbo简单介绍&入门例子_Dubbo_03

(2)pom.xml

a、首先引入接口服务工程依赖

Dubbo简单介绍&入门例子_入门例子_04

 b、引入dubbo依赖

Dubbo简单介绍&入门例子_Dubbo_05

 c、引入zookeeper的客户端zkClient,dubbo会自动使用zkclient去和zookeeper进行连接:

Dubbo简单介绍&入门例子_zookeeper_06

d、当然了,我们dubbo是结合spring的,记得还要引入spring的依赖

Dubbo简单介绍&入门例子_入门例子_07

(3)spring的配置文件sample-provider.xml:

Dubbo简单介绍&入门例子_xml_08


(4)编写实现UserService接口的代码:

package hyf.dubbo.serviceImpl;

import java.util.Arrays;
import java.util.List;

import hyf.dubbo.entity.User;
import hyf.dubbo.service.UserService;

public class UserServiceImpl implements UserService{

public void sayHello(String name) {
System.out.println("欢迎"+name+"来到Dubbo世界~");
}

public List<User> getUserList() {
return Arrays.asList(new User("hyf",24),new User("fy",23));
}

}

(5)测试类代码:

package testSample;
import java.io.IOException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.container.Main;

public class TestSample {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "sample-provider.xml" });
context.start();
System.in.read(); //将主线程阻塞在这里

}
}

5、创建服务提供者的Maven项目,打包方式为war,以后的例子继续在这上面做。名字为:Dubbo-consumer

(1)代码结构如下:

Dubbo简单介绍&入门例子_spring_09

(2)pom.xml引入依赖(和上面引入的依赖一样即可)

      a、首先引入接口服务工程依赖

      b、引入dubbo依赖

      c、引入zookeeper的客户端zkClient,dubbo会自动使用zkclient去和zookeeper进行连接:

      d、当然了,我们dubbo是结合spring的,记得还要引入spring的依赖

(3)spring的配置文件sample-consumer.xml:

Dubbo简单介绍&入门例子_zookeeper_10

(4)测试类代码:

package testSample;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import hyf.dubbo.entity.User;
import hyf.dubbo.service.UserService;

public class TestSample {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:sample-consumer.xml");
UserService userService = (UserService) context.getBean("userService");
userService.sayHello("hyf");
userService.getUserList().stream().forEach((User user)->{
System.out.println(user);
});
}
}

6、启动provider,当后台打印下图的内容,证明服务注册成功了:

Dubbo简单介绍&入门例子_zookeeper_11

这时候我们可以看一下zookeeper的节点是否发生变化:

Dubbo简单介绍&入门例子_zookeeper_12

7、启动consumer并看是否能调用服务:

Dubbo简单介绍&入门例子_Dubbo_13

Dubbo简单介绍&入门例子_Dubbo_14