关联文章
SpringBoot整合dubbo系列(一) -- Docker安装ZooKeeper
SpringBoot整合dubbo系列(二) -- Docker安装dubbo管理控制台 dubbo admin
GitHub Demo地址
https://github.com/oldwang666666/springboot-dubbo-demo.git
工程目录结构
新建maven工程,输入信息后,点击Finish
pom文件内容
<?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>
<groupId>com.springboot.demo</groupId>
<artifactId>springboot-dubbo-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>base-api</module>
<module>consumer-service</module>
<module>provider-service</module>
</modules>
</project>
新建base-api工程
1、New Module,新建base-api公共包
2、pom文件内容
<?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">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.springboot.demo</groupId>
<artifactId>base-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<java.version>1.8</java.version>
<dubbo.version>2.6.5</dubbo.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework
zookeeper客户端连接,我的zookeeper是3.4.14版本-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
</dependencies>
</project>
3、新建UserInfoService接口
package com.demo.base.api;
import com.demo.base.pojo.UserInfoDTO;
import com.demo.base.pojo.UserInfoVO;
public interface UserInfoService {
UserInfoVO getUserInfo(UserInfoDTO dto);
UserInfoVO getUserInfoById(Long id);
}
4、新建POJO UserInfoDTO和UserInfoVO
package com.demo.base.pojo;
import java.io.Serializable;
public class UserInfoDTO implements Serializable {
/**
* id
*/
private Long id;
/**
* 名字
*/
private String name;
/**
* 性别
*/
private int 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;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
package com.demo.base.pojo;
import java.io.Serializable;
public class UserInfoVO implements Serializable {
/**
* id
*/
private Long id;
/**
* 名字
*/
private String name;
/**
* 性别
*/
private int age;
/**
* 地址
*/
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
新建provider-service工程
1、New Module,新建provider-service ,dubbo提供者
pom文件内容
<?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 https://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.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springboot.demo</groupId>
<artifactId>provider-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-service</name>
<description>Provider Service Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.springboot.demo</groupId>
<artifactId>base-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、application.properties
server.port=8081
# dubbo
dubbo.application.name=provider-service-01
# zookeeper 填写自己的zookeeper ip
dubbo.registry.address=your zookeeper ip:port
dubbo.registry.protocol=zookeeper
# 可以不配置monitor
# dubbo.monitor.protocol=registry
3、ProviderServiceApplication需要添加@EnableDubbo注解
package com.springboot.demo.provider;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ProviderServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServiceApplication.class, args);
}
}
4、UserInfoServiceImpl 接口实现类的@Service要注意,这个是dubbo的注解类,要和spring的区分
package com.springboot.demo.provider.user;
import com.alibaba.dubbo.config.annotation.Service;
import com.demo.base.api.UserInfoService;
import com.demo.base.pojo.UserInfoDTO;
import com.demo.base.pojo.UserInfoVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Service
@Component
public class UserInfoServiceImpl implements UserInfoService {
private static final Logger logger = LoggerFactory.getLogger(UserInfoServiceImpl.class);
@Override
public UserInfoVO getUserInfo(UserInfoDTO dto) {
UserInfoVO vo = new UserInfoVO();
vo.setId(dto.getId());
vo.setAge(dto.getAge());
vo.setName(dto.getName());
vo.setAddress("清华大学");
return vo;
}
@Override
public UserInfoVO getUserInfoById(Long id) {
UserInfoVO vo = new UserInfoVO();
vo.setId(id);
vo.setAge(20);
vo.setName("小明");
vo.setAddress("北京大学");
return vo;
}
}
新建consumer-service工程
1、New Module,新建consumer-service,dubbo消费者
2、pom文件内容
<?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 https://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.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springboot.demo</groupId>
<artifactId>consumer-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-service</name>
<description>Consumer Service Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.springboot.demo</groupId>
<artifactId>base-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、application.properties
server.port=8082
# dubbo
dubbo.application.name=consumer-service-01
# zookeeper 填写自己的zookeeper ip
dubbo.registry.address=your zookeeper ip:port
dubbo.registry.protocol=zookeeper
# 可以不配置monitor
# dubbo.monitor.protocol=registry
3、ConsumerServiceApplication需要添加@EnableDubbo注解
package com.springboot.demo.consumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ConsumerServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class, args);
}
}
4、POJO 客户信息入参UserInfoParam
package com.springboot.demo.consumer.pojo;
import java.io.Serializable;
/**
* @Description 客户信息入参
* @Author lz.wang
* @Since 1.0
* @Date 2019/11/19
*/
public class UserInfoParam implements Serializable {
/**
* id
*/
private Long id;
/**
* 名字
*/
private String name;
/**
* 性别
*/
private int 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;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
5、客户信息控制层 UserInfoController,使用@Reference注解时,需要注意其属性,比如配置@Reference(retries = 0, timeout = 10000),为默认不重试,超时时间为10秒。
package com.springboot.demo.consumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.demo.base.api.UserInfoService;
import com.demo.base.pojo.UserInfoDTO;
import com.demo.base.pojo.UserInfoVO;
import com.springboot.demo.consumer.pojo.UserInfoParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description 客户信息控制层
* @Author lz.wang
* @Since 1.0
* @Date 2019/11/19
*/
@RestController
public class UserInfoController {
//忽略启动校验,与@Service配合
@Reference(check=false)
private UserInfoService userInfoService;
@RequestMapping("/getUserInfoById")
public UserInfoVO getUserInfoById(Long id){
return userInfoService.getUserInfoById(id);
}
@RequestMapping("/getUserInfo")
public UserInfoVO getUserInfo(UserInfoParam userInfoParam){
UserInfoDTO dto = new UserInfoDTO();
dto.setId(userInfoParam.getId());
dto.setName(userInfoParam.getName());
dto.setAge(userInfoParam.getAge());
return userInfoService.getUserInfo(dto);
}
}
启动项目
1、先启动提供者,再启动消费者
2、查看dubbo admin,服务是否注册成功
3、在浏览器上输入请求地址:http://localhost:8082/getUserInfo?id=2&name=喵喵&age=15,结果如下图,则调用成功。