首先先介绍一下Dubbo,Dubbo是阿里巴巴公司开源的一个高性能优秀的服务治理框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。其在github上的网址为https://github.com/alibaba/dubbo-spring-boot-starter。Dubbo的主要架构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nHTneC3-1574038593894)(D:\TinkingCat\dubbo\assets\20190314211042225.png)]
其中Provider是服务的提供方,Consumer是服务的消费方,Registry是服务的注册中心,Monitor是服务的监控中心,Container则是服务运行的容器。这次的springboot与dubbo整合主要分为三个模块,分别是dubbo-demo-api(接口),dubbo-demo-provider(提供者),dubbo-demo-consumer(消费者),具体讲解如下。
dubbo-demo-api
首先我们在IDEA中新建一个Maven项目,得到的项目目录如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Rp3m9rg-1574038593895)(D:\TinkingCat\dubbo\assets\20190314212335976.png)]
因为是提供接口,所以pom.xml不需要提供配置,我们新建两个包,分别是model和service,model用于存放实体类User的信息,service用于写服务接口UserService,源码如下:
User实体类
package com.chen.model;
import java.io.Serializable;
/**
* 用户实体类,此处必须要序列化
*/
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
public User(Integer id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
UserService接口类
package com.chen.service;
import com.chen.model.User;
import java.util.List;
/**
* 用户服务接口类,仅定义方法
*/
public interface UserService {
List<User> findUsers();
String sayHi(String name);
}
写好代码之后我们在IDEA右侧找到Maven Projects,在Lifecycle下面找到install并双击,直到出现Build Success。这么做是为了生成jar包给提供者和消费者进行调用。具体截图如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKcEBPIq-1574038593897)(D:\TinkingCat\dubbo\assets\20190314214903842.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEhMzN1W-1574038593897)(D:\TinkingCat\dubbo\assets\20190314215105993.png)]
dubbo-demo-provider
我们在IDEA中新建一个Spring Boot项目,项目结构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eoXQeglu-1574038593898)(D:\TinkingCat\dubbo\assets\20190314222221465.png)]
我们建了继承接口类UserServiceImpl,然后在pom.xml添加一些配置依赖,具体代码如下:
<!-- dubbo接口项目的jar包依赖 -->
<dependency>
<groupId>com.chen</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- springboot集成dubbo的起步依赖 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper的客户端jar依赖包 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
在application.properties添加dubbo的配置信息以及Web端口,代码如下:
spring.application.name=dubbo-spring-boot-starter
spring.dubbo.server=true
spring.dubbo.registry=N/A
#web端口
server.port=8081
UserServiceImpl接口实现类
package com.chen.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.chen.model.User;
import com.chen.service.UserService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Service(interfaceClass = UserService.class)//dubbo的注解
public class UserServiceImpl implements UserService {
@Override
public List<User> findUsers() {
List<User> userList = new ArrayList<>();
userList.add(new User(1,"孙尚香",20));
userList.add(new User(2,"黄忠",30));
userList.add(new User(3,"后羿",25));
return userList;
}
@Override
public String sayHi(String name) {
return "hello,dubbo!";
}
}
这里我们没有用到数据库,所以在UserServiceImpl中我们直接把数据添加进去了。
接着,大家不要忘记,在Application启动类中加入@EnableDubboConfiguration注解,这表示添加dubbo依赖,具体代码如下:
package com.chen;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboDemoProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboDemoProviderApplication.class, args);
}
}
好了,到了这一步相信大家也有点着急了吧,我们这时候可以运行一下了,出现下面运行截图则表示配置正确,如果出错了,检查一下你之前的dubbo-demo-api是否已经install过。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJh91bBk-1574038593900)(D:\TinkingCat\dubbo\assets\20190314224542906.png)]
dubbo-demo-consumer
仍然是新建一个Spring Boot项目,选择Web应用,该项目结构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZX9sIsp9-1574038593901)(D:\TinkingCat\dubbo\assets\20190314225127708.png)]
其中pom.xml添加如下配置文件(与provider中一样):
<!-- dubbo接口项目的jar包依赖 -->
<dependency>
<groupId>com.chen</groupId>
<artifactId>dubbo-demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- springboot集成dubbo的起步依赖 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zookeeper的客户端jar依赖包 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
application.properties文件添加如下配置信息:
#内嵌的Tomcat端口
server.port=8080
spring.application.name=dubbo-consumer-starter
新建一个控制类UserController,代码如下:
package com.chen.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.chen.model.User;
import com.chen.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
//此处如果注明版本version,一直会报错,去掉了就没有报错
@Reference(url="dubbo://127.0.0.1:20880")
private UserService userService;
@RequestMapping("/hello")
public Object sayHi(String name){
return userService.sayHi("cpx");
}
@RequestMapping("/findUsers")
public List<User> findUsers(){
return userService.findUsers();
}
}
同样的,大家不要忘记在Application中添加@EnableDubboConfiguration注解,代码如下:
package com.chen;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DubboDemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboDemoConsumerApplication.class, args);
}
}
注意,必须先运行provider,才能再运行consumer,否则会报错。
运行截图如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXRi2B8A-1574038593902)(D:\TinkingCat\dubbo\assets\20190314230356871.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKjlQ9Hg-1574038593903)(D:\TinkingCat\dubbo\assets\20190314230434735.png)]
另外大家注意一点,就是在consumer中UserController的Reference不要加上version=***,直接加上url=“dubbo://127.0.0.1:20880”
即可,若加上version属性,则会出现如下错误
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVuCa9tA-1574038593903)(D:\TinkingCat\dubbo\assets\20190314231126418.png)]