概述:
Dubbo是阿里开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。同时Dubbo更是SOA服务治理的一种方案。
我们常常使用RestFul接口,以HTTP+JSON的形式暴露接口,但如果这样的接口很大,也是一种麻烦,所以有一种SOA的治理方案,这样可以暴露Dubbo服务接口,提供给Dubbo消费者使用RPC调用。
准备:
要使用dubbo,需要先安装zookeeper,当然也可以配合使用redis, memcache,zookeeper可以形象的理解为动物园,dubbo就是动物园的动物。
Zookeeper单机安装:
在这里:http://mirror.bit.edu.cn/apache/zookeeper/下载zookeeper,本人使用是zookeeper-3.4.13版本
下载后上传到自己的linux服务器,解压
目录结构如下:
在这个目录下新建 data, dataLog目录
进入conf目录,执行下面命名,配置zookeeper配置文件:
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg
在zoo.cfg文件中,新增如下两条指令:
这样就可以运行zookeeper了,运行命令如下:
在zookeeper/bin目录下,有个zkServer.sh文件
./zkServer.sh start
查看zookeeper运行状态:
./zkServer.sh status
zookeeper的默认端口是 2181,可以在conf/zoo.cfg文件中配置,使用时需要注意防火墙关闭 端口打开问题
Springboot集成Dubbo:
新建一个springboot工程:
在pom.xml中添加dubbo依赖,我这里使用的是dubbo-spring-boot-starter
<!-- https://mvnrepository.com/artifact/com.alibaba.spring.boot/dubbo-spring-boot-starter -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
添加dubbo-common, dubbo-provider, dubbo-consume模块,目录结构如下:
在dubbo-common模块中新建接口类,以及要传输的对象:
注意要传输对象必需实现Serializable类,以便序列化/反序列化
public class Student implements Serializable{
private static final long serialVersionUID = 2870421919462807431L;
private Long id;
private String name;
private Long age;
public Student(Long id, String name, Long age) {
this.id = id;
this.name = name;
this.age = age;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getAge() {
return age;
}
public void setAge(Long age) {
this.age = age;
}
}
public interface StudentDubboService {
Student findInfoByName(String name);
}
dubbo-common目录结构如下:
在dubbo-provider实现dubbo接口:
@Service(version = "1.0.0", interfaceClass = StudentDubboService.class)
@Component
public class StudentDubboServiceImpl implements StudentDubboService, Serializable {
private static final long serialVersionUID = 1780842571227587761L;
@Override
public Student findInfoByName(String name) {
return new Student(1L, "Jack", 18L);
}
}
在Main函数中打开Dubble:
@SpringBootApplication
@EnableDubboConfiguration //使用dubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
在application.properties中配置dubbo:
server.port=8082
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.server=true
spring.dubbo.registry.address=zookeeper://192.168.61.196:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.eric.common.service
说明:
1、spring.dubbo.registry.address是我刚才安装zookeeper的服务器地址,2181就是刚才zookeeper的默认端口
2、spring.dubbo.scan扫描的是dubbo-common模块中的接口
配置dubbo-consume:
使用dubbo注册好的接口类:
@Component
public class StudentDubboConsumeImpl {
@Reference(version = "1.0.0")
StudentDubboService studentDubboService;
public void printCity(){
String cityName = "HZCity";
Student student = studentDubboService.findInfoByName(cityName);
System.out.println(student.toString());
}
}
在Main函数中打开 Dubbo:
@SpringBootApplication
@EnableDubboConfiguration
public class ConsumeApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumeApplication.class, args);
}
}
配置application.properties:
## 避免和 server 工程端口冲突
server.port=8081
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://192.168.61.196:2181
spring.dubbo.scan=com.eric.common.service
在dubbo-consume中写一个测试controller,具体如下:
@RestController
public class TestController {
@Reference(version = "1.0.0")
private StudentDubboService studentDubboService;
@GetMapping("test")
public String test(){
Student student = studentDubboService.findInfoByName("Jack");
System.out.println(student.getName() + " " + student.getAge());
return "end";
}
}
测试使用:
分开启动dubbo-provider, dubbo-consume模块,运行后可以看到这些日志
在浏览器中输入测试controller url:
可以看到输出:
这样一个springboot集成dubbo的工程就可以了,我们可以看到8082端口的服务器 可以调用8081端口的服务器 接口。
可以在这里进行下载:
https://download.csdn.net/download/herojuice/10932507
说明:
这里只是对dubbo集成做下介绍,后续会讲原理以及源码解析