Springboot整合dubbo:搭建一个springboot + dubbo的微服务

本文详细介绍了如何在SpringBoot项目中集成Dubbo,包括设置Zookeeper注册中心、配置Maven依赖、创建接口和服务、发布服务及消费者调用。一步步教你实现服务暴露与消费,适合初学者快速上手。
摘要由CSDN通过智能技术生成

Apache Dubbo 是一款高性能、轻量级的开源服务框架,提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。是一款国内使用较多的SOA架构开发的中间件,其主要由三个部分组成:生产者,消费者,注册中心。注册中心一般使用的是zookeeper。
现在从头来捋一捋如何搭建一个springboot+dubbo项目。
首先,使用创建一个springboot项目,我这里使用的是SpringToolSuite4,这也是Eclipse工具不过整合了Springboot的常用的一些插件,跟IDEA类似。
由于dubbo的注册中心是用的zookeeper,所以首先需要去官网下载一个,这里用的是zookeeper-3.4.13,下载好了需要解压该文件,然后进入conf目录,将zoo_sample.cfg文件复制并重命名为zoo.cfg,在进入bin目录双击zkServer.cmd

在这里插入图片描述

在这里插入图片描述
第二步:构建Springboot项目,由于dubbo的生产者和消费者都会引用类的接口,为了方便会把接口抽成一个公用的模块,所以这里我用创建的是Maven project。结构图如下
在这里插入图片描述
第三步:引入Springboot集成dubbo的依赖,生产者和消费者模块都用引用

// 父级pom
<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>
  <groupId>com.zhouhx.dubbo</groupId>
  <artifactId>dubbo-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>dubbo-demo</name>
  <description>入门</description>
	 
	 <properties>
	 	<dubbo.version>0.2.0</dubbo.version>
	 	<hutool.version>5.7.9</hutool.version>
	 	<spring-boot.version>2.5.3</spring-boot.version>
	 	<project.version>0.0.1-SNAPSHOT</project.version>
	 	<java.version>1.8</java.version>
	 	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	 </properties>
  <dependencyManagement>
  	<dependencies>
  	 <!-- SpringBoot 依赖配置 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>${spring-boot.version}</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
         <dependency>
            <groupId>cn.hutool</groupId>
		    <artifactId>hutool-all</artifactId>
		    <version>${hutool.version}</version>
		    
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <dependency>
  			<groupId>com.zhouhx.dubbo</groupId>
  			<artifactId>dubbo-common</artifactId>
  			<version>${project.version}</version>
  		</dependency>
  	</dependencies>
  </dependencyManagement>
  
  <packaging>pom</packaging>
  <modules>
  	<module>dubbo-common</module>
  	<module>dubbo-producer</module>
  	<module>dubbo-consumer</module>
  </modules>
  
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
// 生产者
<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>com.zhouhx.dubbo</groupId>
   <artifactId>dubbo-demo</artifactId>
   <version>0.0.1-SNAPSHOT</version>
 </parent>
 <artifactId>dubbo-producer</artifactId>
 <name>producer</name>
 <description>生产者</description>
 <dependencies>
 		<dependency>
 			<groupId>com.zhouhx.dubbo</groupId>
 			<artifactId>dubbo-common</artifactId>
 		</dependency>
 		 <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

       <dependency>
           <groupId>com.alibaba.boot</groupId>
           <artifactId>dubbo-spring-boot-starter</artifactId>
       </dependency>
 </dependencies>
 <build>
   <plugins>
       <plugin>
           <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
   </plugins>
   </build>
</project>
var foo = 'bar';
// 消费者
<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>com.zhouhx.dubbo</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>dubbo-consumer</artifactId>
  <name>consumer</name>
  <description>消费者</description>
  <dependencies>
  	<dependency>
  			<groupId>com.zhouhx.dubbo</groupId>
  			<artifactId>dubbo-common</artifactId>
  		</dependency>
  		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
 
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
  </dependencies>
</project>
第四步:创建公用的接口和实体类
// 公用接口
public interface UserService {
	/**
	 * 获取用户信息
	 * @return
	 */
	public User getUserInfo();
}
//实体类
public class User implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -3304178237669079610L;
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 年龄
	 */
	private int age;
	/**
	 * 性别
	 */
	private String sex;
	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 getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public User(String name, int age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public User() {
		super();
	}

第五步:实现其接口并发布服务

//实现接口并发布
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Service;
import com.zhouhx.api.UserService;
import com.zhouhx.entity.User;

@Service
@Component
public class UserServiceImpl implements UserService {
	
	private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

	public User getUserInfo() {
		logger.info("正在开始调用Dubbo服务。。。。。");
		return new User("张三",15,"男");
	}

注意:注解不是用spring的service注解,是 com.alibaba.dubbo.config.annotation.Service

// 在springboot程序入口出启用dubbo服务
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;

@SpringBootApplication
@EnableDubbo
public class DubboApplication {

	public static void main(String[] args) {
		SpringApplication.run(DubboApplication.class, args);
	}

}

第六步:修改application.properties配置文件,添加dubbo配置

server.port=8001
#应用名
dubbo.application.name=dubbo-producer
#zookeeper地址
dubbo.registry.address=127.0.0.1:2181
#指定注册中心类型
dubbo.registry.protocol=zookeeper
#传入协议的名称
dubbo.protocol.name=dubbo
#dubbo服务暴露的端口,可自定义
dubbo.protocol.port=20888

这里生产者模块就是实现完成,启动springboot,就能提供一个UserService的接口
第七步:消费者模块调用已经发布的服务

import org.springframework.stereotype.Service;

import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zhouhx.api.UserService;
import com.zhouhx.demo.service.ConsumerService;
import com.zhouhx.entity.User;

@Service
public class ConsumerServiceImpl implements ConsumerService {
	private static Logger logger = LoggerFactory.getLogger(ConsumerServiceImpl.class);
	/**远程调用*/
	@Reference
	UserService userService;
	@Override
	public String getUserInfo() {
		logger.debug("dubbo远程调用开始。。。。");
		User userInfo = userService.getUserInfo();
		logger.debug("dubbo远程调用结束,res="+userInfo.toString());
		return "当前用户信息"+userInfo == null ? "空":userInfo.toString();
	}	

dubbo的远程调用是用的@Reference注解,不是spring的@Autowired
第八步:测试
为了方便测试,这里我用了springboot的web的模块

@RestController
public class Publish {
	@Autowired
	ConsumerService consumerService;

	@GetMapping("/demo")
	public String getUserInfo() {
		return consumerService.getUserInfo();
	}
}

页面上输入http://127.0.0.1:8002/demo,页面上显示User [name=张三, age=15, sex=男]
在这里插入图片描述
再看消费者模块打印的日志
在这里插入图片描述
说明接口已经远程调用成功!
dubbo还提供了一个dubbo-admin控制台,将项目用maven打包成jar包
启用后如下图
在这里插入图片描述
项目gitee地址:dubbo-demo
打包好的dubbo-admin-0.4,开箱即用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值