Dubbo是一个开源的分布式服务框架,被我国国内很多互联网公司认可并广泛使用,即使放到国际视野来看也是一个非常全面的SOA(面向服务架构)基础框架,因此成功Apache的开源项目。而Dubbox是当当网根据自身的需求,在Dubbo的基础上实现了一些新的功能,并将其命名为Dubbox(即Dubbo eXtensions)。
下面是Dubbo的RESTful风格的远程调用的应用蓝图。
Dubbo致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单点来说,Dubbo其实就是一个服务框架,如果没有分布式的话,其实不是必须的。只有在分布式的时候,才有分布式服务框架这样的要求,其实本质功能和WebService是非常相似的,就是远程调用服务而已。但是我们不再需要记住WebService中想当麻烦的WSDL了。我们只用以服务者和消费者的方式在Dubbo上注册即可,并且Dubbo的功能远不止远程调用服务这么简单。
1、透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单的配置(Spring方式配置),没有任何API侵入。
2、软负载均衡以及容错机制,可以在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3、服务自动注册与发现,不再需要写死服务提供方的地址,使用注册中心基于接口名来查询服务提供者,并且能够平滑地增加和删除服务提供者提供的服务。
4、Dubbo采用全Spring配置方式,透明化地接入应用,对应用没有任何API侵入,只需要用Spring加载Dubbo的配置即可(Dubbo基于Spring的Schema扩展进行加载的)。
我这里使用的Dubbo版本是2.5.3,所以请大家注意好。最新版本和入门例子可到官网上学习:http://dubbo.io
编写实体类User和服务接口UserService。注意实体类要实现Serializable,不然会报通信错误。
(1)代码结构如下:
(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 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 + "]";
}
}
(1)代码结构如下:
(2)pom.xml
a、首先引入接口服务工程依赖
b、引入dubbo依赖
c、引入zookeeper的客户端zkClient,dubbo会自动使用zkclient去和zookeeper进行连接:
d、当然了,我们dubbo是结合spring的,记得还要引入spring的依赖
(3)spring的配置文件sample-provider.xml:
(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 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(); //将主线程阻塞在这里
}
}
(1)代码结构如下:
(2)pom.xml引入依赖(和上面引入的依赖一样即可)
a、首先引入接口服务工程依赖
b、引入dubbo依赖
c、引入zookeeper的客户端zkClient,dubbo会自动使用zkclient去和zookeeper进行连接:
d、当然了,我们dubbo是结合spring的,记得还要引入spring的依赖
(3)spring的配置文件sample-consumer.xml:
(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);
});
}
}
这时候我们可以看一下zookeeper的节点是否发生变化: