本文记录Dubbo整合Spring Boot项目开发过程
项目结构
- dubbodemo1 普通maven项目
- demo1-common 普通maven项目,存放公共的实体类和接口
- demo1-consumer spring boot 的web项目,服务的消费者
- demo1-provider spring boot 项目, 服务的提供者
1.demo1-common结构
该项目无需添加任何依赖,因为此项目会打成jar包提供给消费者和提供者。
User.java
package com.zto.wy.dto;
public class User implements java.io.Serializable{
private Integer id;
private String username;
private String password;
public User() {
super();
}
public User(Integer id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
User实体应实现java.io.Serializable,既声明User实体可以被序列化、
LoginService
package com.zto.wy.service;
import com.zto.wy.dto.User;
import java.util.List;
public interface LoginService {
public List<User> list();
}
UserService
package com.zto.wy.service;
import com.zto.wy.dto.User;
import java.util.List;
public interface UserService {
public User getUserById(String id);
public List<User> list();
}
2.demo1-provider创建与配置
先贴一下pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
</parent>
<groupId>com.zto.wy</groupId>
<artifactId>demo1-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo1-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.zto.wy</groupId>
<artifactId>demo1-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意依赖demo1-common的jar包
UserServiceImpl是UserService的实现类
package com.zto.wy.demo1provider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.zto.wy.dto.User;
import com.zto.wy.service.UserService;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Service
@org.springframework.stereotype.Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(String id) {
User user = new User(1, "getUserById", "123456");
return user;
}
@Override
public List<User> list() {
User user1 = new User(1, "list1", "123456");
User user2 = new User(1, "list2", "123456");
return Arrays.asList(user1,user2);
}
}
方法是博主随便写的,主要在于整个架构能通
application.properties
dubbo.application.name=demo1-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.monitor.protocol=registry
使用过dubbo的同学应该明白,这里就是把dubbo框架的xml配置改写过来,把层级关系用"."来表示。此处的配置文件很容易看出没有Service的配置,此处是因为dubbo与spring boot 整合中,暴露服务的操作使用注解来进行。观察UserServiceImpl.java,接口的实现类上面注解了两个@Service,分别是org.springframework.stereotype.Service、com.alibaba.dubbo.config.annotation.Service,前者是spring的注解,后者是dubbo的注解,而暴露服务的操作是后者实现的。
启动前别忘记在启动类上写上@EnableDubbo,表示开启Dubbo注解
3.demo1-consumer
先看依赖,pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zto.wy</groupId>
<artifactId>demo1-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo1-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.zto.wy</groupId>
<artifactId>demo1-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
跟demo1-provider差不多,不过这是个spring boot 的 web工程
LoginServiceImpl.java是LoginService的实现类
package com.zto.wy.demo1consumer.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zto.wy.dto.User;
import com.zto.wy.service.LoginService;
import com.zto.wy.service.UserService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class LoginServiceImpl implements LoginService {
@Reference
UserService userService;
@Override
public List<User> list() {
List<User> userList = userService.list();
return userList;
}
}
特别注意:注意该实现类上的@Service注解为spring的org.springframework.stereotype.Service,此处并不是dubbo中的注解,因为这里不是需要暴露服务,这个服务是消费者内部自己使用。
切记,若此处@Service注解不写,则会造成控制器LoginController中使用注解@Autowired自动装载LoginService出错!!!!!
LoginColler.java
package com.zto.wy.demo1consumer.controller;
import com.zto.wy.dto.User;
import com.zto.wy.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class LoginController {
@Autowired
private LoginService loginService;
@ResponseBody
@RequestMapping("/login")
public List<User> list() {
List<User> userList = loginService.list();
return userList;
}
}
application.properties
server.port=8085
dubbo.application.name=demo1-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry