专栏目录:*
Dubbo基础: https://blog.csdn.net/qq_38310244/article/details/125891802
Dubbo实战: https://blog.csdn.net/qq_38310244/article/details/125892120
手写一套简单的dubbo(含注册中心)之编程思想: https://blog.csdn.net/qq_38310244/article/details/125892641
手写一套简单的dubbo(含注册中心)之核心代码: https://blog.csdn.net/qq_38310244/article/details/125892849
上一篇:Dubbo基础已经介绍了Dubbo的一些理论知识,现在开始代码实战。
定义一个公共接口的模块dubbo-api

User类
package com.mywork.dubboapi.bean;
import lombok.Data;
import java.io.Serializable;
/**
* @Author: huangjun
* @Date: 2022/6/22 16:52
* @Version 1.0
*/
@Data
public class User implements Serializable {
private Integer id;
private String name;
}
公共接口UserService类,相当于服务提供者和服务消费者之间的桥梁
package com.mywork.dubboapi.service;
import com.mywork.dubboapi.bean.User;
/**
* @Author: huangjun
* @Date: 2022/6/22 16:53
* @Version 1.0
*/
public interface UserService {
User getUser();
}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zktRiQBi-1658299535301)(E:\study\dubbo\image\image-20220707173804843.png)]](https://1000bd.com/contentImg/2022/07/25/151028609.png)
pom.xml文件引用主要依赖
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
<dependency>
<groupId>com.myworkgroupId>
<artifactId>dubbo-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
定义dubbo的配置信息,DubboConfiguration类
package com.mywork.dubboprovider.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: huangjun
* @Date: 2022/7/7 15:20
* @Version 1.0
*/
@Configuration
public class DubboConfiguration {
/**
* 定义应用名称
*/
@Bean
public ApplicationConfig applicationConfig(){
return new ApplicationConfig("mywork-provider");
}
/**
* 注册中心地址
*/
@Bean
public RegistryConfig registryConfig(){
return new RegistryConfig("zookeeper://127.0.0.1:2181");
}
/**
* 定义dubbo协议和监听端口
*/
@Bean
public ProtocolConfig protocolConfig(){
return new ProtocolConfig("dubbo",20888);
}
}
实现公共接口
package com.mywork.dubboprovider.serviceImpl;
import com.alibaba.dubbo.config.annotation.Service;
import com.mywork.dubboapi.bean.User;
import com.mywork.dubboapi.service.UserService;
/**
* @Author: huangjun
* @Date: 2022/6/22 17:03
* @Version 1.0
*/
//*******注意,这里的service注解用的不是spring的注解,而是com.alibaba.dubbo.config.annotation.Service;****
@Service
@org.springframework.stereotype.Service("userServer")
public class UserServiceImpl implements UserService {
@Override
public User getUser() {
User user = new User();
user.setId(1);
user.setName("基于【注解】文件");
return user;
}
}
启动类添加dubbo需要扫描的包
package com.mywork.dubboprovider;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@DubboComponentScan(basePackages = "com.mywork.dubboprovider.serviceImpl") //扫描接口实现类
public class DubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProviderApplication.class, args);
}
}
至此,完成服务提供者的开发。

pom.xml主要依赖
!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.47version>
dependency>
<dependency>
<groupId>com.myworkgroupId>
<artifactId>dubbo-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
定义dubbo配置信息
package com.mywork.dubboconsumer.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: huangjun
* @Date: 2022/7/7 15:27
* @Version 1.0
*/
@Configuration
public class DubboConfiguration {
/**
* 定义应用名称
*/
@Bean
public ApplicationConfig applicationConfig(){
return new ApplicationConfig("mywork-consumer");
}
/**
* 设置消费者超时时间
*/
@Bean
public ConsumerConfig consumerConfig(){
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setTimeout(3000);
return consumerConfig;
}
/**
* 注册中心地址
*/
@Bean
public RegistryConfig registryConfig(){
return new RegistryConfig("zookeeper://127.0.0.1:2181");
}
}
引用代理类实现业务
package com.mywork.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.mywork.dubboapi.bean.User;
import com.mywork.dubboapi.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: huangjun
* @Date: 2022/6/22 17:08
* @Version 1.0
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
@GetMapping("/getUser")
public User getUser(){
return userService.getUser();
}
启动类添加dubbo注解
package com.mywork.dubboconsumer;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo //开启dubbo
public class DubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboConsumerApplication.class, args);
}
}
启动zookeeper,启动服务提供者,启动服务消费者
管理界面查看
dubbo-admin管理界面:


可以看到我们的服务已经在注册中心进行了发布和订阅
接口测试

调用成功

pom.xml核心依赖
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
<dependency>
<groupId>com.myworkgroupId>
<artifactId>dubbo-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
在resource目录下新建dubbo-provider.xml配置文件进行dubbo信息的配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<dubbo:application name="mywork-file-provide"/>
<dubbo:registry id="local" address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20881"/>
<dubbo:service registry="local" interface="com.mywork.dubboapi.service.UserService" ref="userServer"/>
beans>
定义公共接口的实现
package com.mywork.dubbofileprovider.serverImpl;
import com.mywork.dubboapi.bean.User;
import com.mywork.dubboapi.service.UserService;
import org.springframework.stereotype.Service;
/**
* @Author: huangjun
* @Date: 2022/6/22 17:03
* @Version 1.0
*/
@Service("userServer")
public class UserServiceImpl implements UserService {
@Override
public User getUser() {
User user = new User();
user.setId(1);
user.setName("基于【配置】文件");
return user;
}
}
启动类引入dubbo依赖
package com.mywork.dubbofileprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:dubbo-provider.xml") //引入dubbo的配置
public class DubboFileProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DubboFileProviderApplication.class, args);
}
}
至此,完成服务提供者的开发。

pom.xml核心依赖
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.47version>
dependency>
<dependency>
<groupId>com.myworkgroupId>
<artifactId>dubbo-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
在resource下新建dubbo-consumer.xml进行dubbo信息的配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="mywork-file-consumer"/>
<dubbo:registry id="local" address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo"/>
<dubbo:reference registry="local" id="userService" interface="com.mywork.dubboapi.service.UserService"/>
beans>
引用公共接口实现业务
package com.mywork.dubbofileconsumer.controller;
import com.mywork.dubboapi.bean.User;
import com.mywork.dubboapi.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: huangjun
* @Date: 2022/6/22 17:08
* @Version 1.0
*/
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 跟springboot一样,正常引用容器里的对象即可
*/
@Resource
private UserService userService;
@GetMapping("/getUser")
public User getUser(){
return userService.getUser();
}
}
启动类引入dubbo配置
package com.mywork.dubbofileconsumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class DubboFileConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboFileConsumerApplication.class, args);
}
}
至此,完成服务消费者的开发
启动zookeeper,启动服务提供者,启动服务消费者
管理界面查看
dubbo-admin管理界面:


可以看到我们的服务已经在注册中心进行了发布和订阅
接口测试

调用成功

为了方便引入jar和对jar包的管理,这里使用Maven来管理依赖
pom.xml核心依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.47version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.5version>
dependency>
<dependency>
<groupId>com.myworkgroupId>
<artifactId>dubbo-apiartifactId>
<version>0.0.1-SNAPSHOTversion>
dependency>
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>0.1.0version>
dependency>
<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.10version>
dependency>
在resource下新建dubbo-consumer.xml进行dubbo信息的配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="mywork-jdk-consumer"/>
<dubbo:registry id="register" address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo"/>
<dubbo:reference registry="register" id="userService" interface="com.mywork.dubboapi.service.UserService"/>
beans>
主方法调用服务提供者接口
package com.mywork;
import com.alibaba.fastjson.JSON;
import com.mywork.dubboapi.bean.User;
import com.mywork.dubboapi.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author: huangjun
* @Date: 2022/7/7 18:32
* @Version 1.0
*/
public class Main {
public static void main(String[] args) {
//获取配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
//装载配置文件
context.start();
System.out.println("consumer start");
//从配置文件中获取到bean
UserService userService = context.getBean(UserService.class);
//调用服务生产者的代理的接口
User user = userService.getUser();
System.out.println("执行结果===>" + JSON.toJSONString(user));
}
}
启动zookeeper,启动服务提供者,启动主方法
调用结果: