Apache Dubbo经常作为一个RPC框架来使用,这篇文章主要介绍使用Dubbo配合注册中心来发布和调用服务。


Apache Dubbo和Spring Boot、JDK的版本对应关系。

Dubbo 分支最新版本JDKSpring Boot组件版本详细说明
3.3.x (当前文档)3.3.08, 17, 212.x、3.x详情- 版本变更记录 - 生产可用(推荐,长期维护)! 最新Triple协议升级,内置Metrics、Tracing、GraalVM支持等
3.2.x3.2.108, 172.x、3.x详情- 版本变更记录 - 生产可用(长期维护)!
3.1.x3.1.118, 172.x、3.x详情- 版本变更记录 - 仅修复安全漏洞!
3.0.x3.0.1582.x详情- 版本变更记录 - 停止维护!
2.7.x2.7.2382.x详情- 了解如何升级到Dubbo3 - 停止维护!

博主使用的Spring Boot版本是2.3.4.RELEASE、jdk版本是1.8.0_461,所以采用dubbo的2.7.23版本(因为3.0.x版本不兼容)。

<dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>2.7.23</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

一、创建服务接口

文章只是为了简单介绍一下使用Dubbo来发布和调用服务(RPC接口),所以把所有接口都存放在一个dubbo-api的项目上,服务提供者和服务消费者只需要依赖这个项目即可。

1、创建项目

在Intellij IDEA中创建一个Maven项目,项目名为dubbo-api

2、添加依赖

添加lombok的依赖和Maven的jar包插件。

<?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><version>20250906</version><groupId>cn.edu.sgu.www</groupId><artifactId>dubbo-api</artifactId><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version></plugin></plugins></build>
</project>

3、创建接口

在项目的src/main/java包下创建多级包cn.edu.sgu.www.dubbo.provider

  • 在provider子包下创建entity子包
  • 在provider子包下创建service子包

User.java

在entity包下创建一个类User.java。在User类上使用lombok的@Data注解,实现序列化接口,指定序列化版本号。

package cn.edu.sgu.www.dubbo.provider.entity;import lombok.Data;import java.io.Serializable;/*** @author 沐雨橙风ιε* @version 1.0*/
@Data
public class User implements Serializable {private static final long serialVersionUID = 18L;private String id;/*** 姓名*/private String name;/*** 身高*/private Integer height;/*** 体重*/private Integer weight;
}

UserService.java

在service包下创建user子包,在user包下创建UserService接口,定义两个方法。

package cn.edu.sgu.www.dubbo.provider.service.user;import cn.edu.sgu.www.dubbo.provider.entity.User;import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
public interface UserService {void save(User user);List<String> selectAll();
}

HelloService.java

在service包下创建hello子包,在hello包下创建HelloService接口,定义一个greet()方法。

package cn.edu.sgu.www.dubbo.provider.service.hello;/*** @author 沐雨橙风ιε* @version 1.0*/
public interface HelloService {void greet();
}

4、项目结构预览

完成上面三个步骤之后,项目的目录结构如下。

5、安装项目到本地仓库

在当前项目目录下执行Maven命令mvn install或直接通过Maven插件安装本项目到本地仓库。

成功安装到Maven本地仓库:

二、创建服务提供者

1、创建项目

在Intellij IDEA中创建一个Spring Boot项目,项目名为dubbo-provider

2、添加依赖

添加Apache Dubbo的Spring Boot启动器依赖,这个启动器包含了所有使用Dubbo需要的依赖。

因为还需要通过注册中心暴露服务信息,所以额外引入Dubbo整合nacos的依赖。

<?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.3.4.RELEASE</version></parent><version>20250907</version><artifactId>dubbo-provider</artifactId><description>Apache Dubbo服务提供者项目</description><properties><java.version>1.8</java.version><dubbo.version>2.7.23</dubbo.version><dubbo-registry.version>3.2.10</dubbo-registry.version></properties><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><version>20250906</version><groupId>cn.edu.sgu.www</groupId><artifactId>dubbo-api</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>${dubbo-registry.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version></plugin></plugins></build>
</project>

3、实现接口

在项目src/main/java包下创建cn.edu.sgu.www.dubbo.provider子包,在provider子包下创建service子包。

UserServiceImpl.java

在service包下创建user子包。

在user包下创建UserServiceImpl,实现UserService接口,重写两个方法。

package cn.edu.sgu.www.dubbo.provider.service.user;import cn.edu.sgu.www.dubbo.provider.entity.User;import java.util.ArrayList;
import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
public class UserServiceImpl implements UserService {@Overridepublic void save(User user) {System.out.println("save: " + user);}@Overridepublic List<String> selectAll() {List<String> list = new ArrayList<>();list.add("沐雨橙风");list.add("一叶之秋");list.add("苏沐秋");return list;}}

HelloServiceImpl.java

在service包下创建hello子包。

在user包下创建HelloServiceImpl,实现HelloService接口,重写两个方法。

package cn.edu.sgu.www.dubbo.provider.service.hello;/*** @author 沐雨橙风ιε* @version 1.0*/
public class HelloServiceImpl implements HelloService {@Overridepublic void greet() {System.out.println("Hello,沐雨橙风ιε");}}

完成以上步骤的项目目录结构如下:

  • 启动类类名删除了Dubbo前缀
  • 配置类后缀由.properties修改为了.yml

4、发布服务

使用API发布服务

使用Dubbo原生API发布服务:在provider包下创建ApiProvider.java

package cn.edu.sgu.www.dubbo.provider;import cn.edu.sgu.www.dubbo.provider.service.hello.HelloService;
import cn.edu.sgu.www.dubbo.provider.service.hello.HelloServiceImpl;
import cn.edu.sgu.www.dubbo.provider.service.user.UserService;
import cn.edu.sgu.www.dubbo.provider.service.user.UserServiceImpl;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;import java.io.IOException;/*** @author 沐雨橙风ιε* @version 1.0*/
public class ApiProvider {public static void main(String[] args) throws IOException {// 当前应用配置ApplicationConfig application = new ApplicationConfig();application.setName("dubbo-provider");// 连接注册中心配置RegistryConfig registry = new RegistryConfig();registry.setAddress("nacos://localhost:8848");// 服务提供者协议配置ProtocolConfig protocol = new ProtocolConfig();protocol.setName("dubbo");protocol.setPort(20880);protocol.setThreads(200);// 服务提供者暴露服务配置ServiceConfig<HelloService> helloServiceServiceConfig = new ServiceConfig<>();helloServiceServiceConfig.setApplication(application);helloServiceServiceConfig.setRegistry(registry); // 多个注册中心可以用setRegistries()helloServiceServiceConfig.setProtocol(protocol); // 多个协议可以用setProtocols()helloServiceServiceConfig.setInterface(HelloService.class);helloServiceServiceConfig.setRef(new HelloServiceImpl());helloServiceServiceConfig.setVersion("20250906");// 暴露及注册服务helloServiceServiceConfig.export();ServiceConfig<UserService> userServiceServiceConfig = new ServiceConfig<>();userServiceServiceConfig.setApplication(application);userServiceServiceConfig.setRegistry(registry); // 多个注册中心可以用setRegistries()userServiceServiceConfig.setProtocol(protocol); // 多个协议可以用setProtocols()userServiceServiceConfig.setInterface(UserService.class);userServiceServiceConfig.setRef(new UserServiceImpl());userServiceServiceConfig.setVersion("20250906");// 暴露及注册服务userServiceServiceConfig.export();System.out.println("dubbo-provider is running.");System.in.read();}}

启动nacos服务器、运行ApiProvider,访问nacos的控制台。

可以看到在默认命名空间中多了两个配置文件。

同时,Dubbo往nacos中注册了两个接口级服务。

使用Spring发布服务

基于XML文件

Dubbo支持通过xml配置文件的方式,结合Spring框架来发布服务。

dubbo-provider.xml

在classpath下创建一个xml配置文件,文件名为dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="dubbo-provider"  /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><!-- 使用nacos注册中心暴露服务地址 --><dubbo:registry address="nacos://localhost:8848" /><!-- 声明需要暴露的服务接口 --><dubbo:service interface="cn.edu.sgu.www.dubbo.provider.service.user.UserService" ref="userService" /><dubbo:service interface="cn.edu.sgu.www.dubbo.provider.service.hello.HelloService" ref="helloService" /><!-- 和本地bean一样实现服务 --><bean id="userService" class="cn.edu.sgu.www.dubbo.provider.service.user.UserServiceImpl" /><bean id="helloService" class="cn.edu.sgu.www.dubbo.provider.service.hello.HelloServiceImpl" />
</beans>

SpringProvider.java

在provider包下创建SpringProvider类,通过xml配置文件创建并启动Spring容器。

package cn.edu.sgu.www.dubbo.provider;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;/*** @author 沐雨橙风ιε* @version 1.0*/
public class SpringProvider {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("dubbo-provider.xml");applicationContext.start();System.out.println("dubbo-provider is running.");System.in.read();}}

停止之前运行的ApiProvider,并删除其创建的nacos配置文件。

启动SpringProvider,发现又创建了这两个配置文件

并且这两个服务也注册到了nacos

完成以上步骤的项目目录结构如下:

基于注解

除了基于xml配置文件的方式以外,Spring还支持使用注解的方式发布(暴露)服务。

dubbo-provider.properties

在classpath下创建一个properties配置文件,文件名为dubbo-provider.properties

dubbo.application.name=dubbo-provider
dubbo.registry.address=nacos://localhost:8848
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

ProviderConfig.java

在HelloServiceImpl和UserServiceImpl两个类上使用@DubboService注解,将这两个类定义为Dubbo服务。


在provider包下创建config子包,在config包下创建一个配置类ProviderConfig。

  • 在配置类上使用@EnableDubbo注解,指定扫描service包下的Dubbo服务。
  • 在配置类上使用@PropertySource注解,加载classpath下的配置文件dubbo-provider.properties。
package cn.edu.sgu.www.dubbo.provider.config;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;/*** @author 沐雨橙风ιε* @version 1.0*/
@Configuration
@EnableDubbo(scanBasePackages = "cn.edu.sgu.www.dubbo.provider.service")
@ComponentScan(basePackages = "cn.edu.sgu.www.dubbo.provider.service")
@PropertySource("classpath:/dubbo-provider.properties")
public class ProviderConfig {}

SpringProvider.java

通过配置文件创建并启动Spring容器。

package cn.edu.sgu.www.dubbo.provider;import cn.edu.sgu.www.dubbo.provider.config.ProviderConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.io.IOException;/*** @author 沐雨橙风ιε* @version 1.0*/
public class SpringProvider {public static void main(String[] args) throws IOException {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ProviderConfig.class);applicationContext.start();System.out.println("dubbo-provider is running.");System.in.read();}}

停止运行中的SpringProvider,并删除其创建的nacos配置文件。

再次运行SpringProvider,发现配置文件被重新创建,并且服务也注册到了nacos。


完成以上步骤的项目目录结构如下:

三、创建服务消费者

1、创建项目

在Intellij IDEA中创建一个Spring Boot项目,项目名为dubbo-consumer

2、添加依赖

<?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.3.4.RELEASE</version></parent><version>20250907</version><artifactId>dubbo-consumer</artifactId><description>Apache Dubbo服务消费者项目</description><properties><java.version>1.8</java.version><dubbo.version>2.7.23</dubbo.version><dubbo-registry.version>3.2.10</dubbo-registry.version></properties><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><version>20250906</version><groupId>cn.edu.sgu.www</groupId><artifactId>dubbo-api</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>${dubbo-registry.version}</version></dependency>
<!--        <dependency>-->
<!--            <groupId>org.apache.dubbo</groupId>-->
<!--            <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>-->
<!--            <version>${dubbo-registry.version}</version>-->
<!--        </dependency>--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.4.RELEASE</version></plugin></plugins></build>
</project>

3、调用服务

使用API调用服务

使用Dubbo原生API调用服务:在consumer包下创建ApiConsumer.java

package cn.edu.sgu.www.dubbo.consumer;import cn.edu.sgu.www.dubbo.provider.service.hello.HelloService;
import cn.edu.sgu.www.dubbo.provider.service.user.UserService;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ReferenceConfig;
import org.apache.dubbo.config.RegistryConfig;import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
public class ApiConsumer {public static void main(String[] args) {// 当前应用配置ApplicationConfig application = new ApplicationConfig();application.setName("dubbo-consumer");// 连接注册中心配置RegistryConfig registry = new RegistryConfig();registry.setAddress("nacos://localhost:8848");/** 1、引用HelloService远程服务*/ReferenceConfig<HelloService> helloServiceReferenceConfig = new ReferenceConfig<>();helloServiceReferenceConfig.setApplication(application);helloServiceReferenceConfig.setRegistry(registry); // 多个注册中心可以用setRegistries()helloServiceReferenceConfig.setInterface(HelloService.class);helloServiceReferenceConfig.setVersion("20250906");// 和本地bean一样使用HelloServiceHelloService helloService = helloServiceReferenceConfig.get();helloService.greet();/** 2、引用UserService远程服务*/ReferenceConfig<UserService> userServiceReferenceConfig = new ReferenceConfig<>();userServiceReferenceConfig.setApplication(application);userServiceReferenceConfig.setRegistry(registry); // 多个注册中心可以用setRegistries()userServiceReferenceConfig.setInterface(UserService.class);userServiceReferenceConfig.setVersion("20250906");// 和本地bean一样使用UserServiceServiceUserService userService = userServiceReferenceConfig.get();List<String> list = userService.selectAll();System.out.println(list);}}

启动服务提供者的ApiProvider,然后启动当前项目的ApiConsumer

可以看到控制台打印出来了调用UserService接口的selectAll()方法返回的结果。

使用Spring调用服务

基于XML文件
dubbo-consumer.xml

在classpath下创建一个xml配置文件,文件名为dubbo-consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="dubbo-consumer"  /><!-- 使用nacos注册中心暴露发现服务地址 --><dubbo:registry address="nacos://localhost:8848" /><!-- 生成远程服务代理,可以和本地bean一样使用demoService --><dubbo:reference id="userService" interface="cn.edu.sgu.www.dubbo.provider.service.user.UserService" /><dubbo:reference id="helloService" interface="cn.edu.sgu.www.dubbo.provider.service.hello.HelloService" />
</beans>

SpringConsumer.java

在sonsumer包下创建SpringConsumer类,通过xml配置文件创建并启动Spring容器。

通过Spring容器获取Dubbo引用的Dubbo服务的Bean对象,调用Bean对象的方法。

package cn.edu.sgu.www.dubbo.consumer;import cn.edu.sgu.www.dubbo.provider.service.hello.HelloService;
import cn.edu.sgu.www.dubbo.provider.service.user.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
public class SpringConsumer {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("dubbo-consumer.xml");applicationContext.start();// HelloServiceHelloService helloService = applicationContext.getBean(HelloService.class);helloService.greet();// UserServiceUserService userService = applicationContext.getBean(UserService.class);List<String> list = userService.selectAll();System.out.println(list);}}

基于注解
dubbo-consumer.properties

在classpath下创建一个properties配置文件,文件名为dubbo-provider.properties

dubbo.application.name=dubbo-consumer
dubbo.registry.address=nacos://localhost:8848

HelloController.java

在consumer包下创建controller包,在controller包下创建HelloController类。

通过@DubboReference注解引入Dubbo暴露的接口级服务HelloService

package cn.edu.sgu.www.dubbo.consumer.controller;import cn.edu.sgu.www.dubbo.provider.service.hello.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author 沐雨橙风ιε* @version 1.0*/
@RestController
@RequestMapping(path = "/hello", produces = "application/json;charset=utf-8")
public class HelloController {@DubboReferenceprivate HelloService helloService;@GetMapping("/greet")public void greet() {helloService.greet();}}

UserController.java

在controller包下创建UserController类。

通过@DubboReference注解引入Dubbo暴露的接口级服务UserService

package cn.edu.sgu.www.dubbo.consumer.controller;import cn.edu.sgu.www.dubbo.provider.service.user.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=utf-8")
public class UserController {@DubboReferenceprivate UserService userService;@GetMapping("/selectAll")public List<String> selectAll() {return userService.selectAll();}}

ConsumerConfig.java

在consumer包下创建config子包,在config包下创建一个配置类ConsumerConfig。

  • 在配置类上使用@EnableDubbo注解,指定扫描service包下引用Dubbo服务的类。
  • 在配置类上使用@PropertySource注解,加载classpath下的配置文件dubbo-consumer.properties。
package cn.edu.sgu.www.dubbo.consumer.config;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;/*** @author 沐雨橙风ιε* @version 1.0*/
@Configuration
@EnableDubbo(scanBasePackages = "cn.edu.sgu.www.dubbo.consumer.controller")
@ComponentScan(basePackages = "cn.edu.sgu.www.dubbo.consumer.controller")
@PropertySource("classpath:/dubbo-consumer.properties")
public class ConsumerConfig {}

SpringConsumer.java

通过配置文件创建并启动Spring容器,通过容器获取引用Dubbo服务的控制器Bean对象。

package cn.edu.sgu.www.dubbo.consumer;import cn.edu.sgu.www.dubbo.consumer.config.ConsumerConfig;
import cn.edu.sgu.www.dubbo.consumer.controller.HelloController;
import cn.edu.sgu.www.dubbo.consumer.controller.UserController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.List;/*** @author 沐雨橙风ιε* @version 1.0*/
public class SpringConsumer {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConsumerConfig.class);applicationContext.start();HelloController helloController = applicationContext.getBean(HelloController.class);helloController.greet();UserController userController = applicationContext.getBean(UserController.class);List<String> list = userController.selectAll();System.out.println(list);}}

四、Dubbo生产级应用

Java应用的开发几乎离不开Spring Boot,结合Spring Boot使用Dubbo框架简单许多。

只需要在启动类上使用@EnableDubbo注解即可,前面用到的配置类已经不需要了。

dubbo-provider

注释掉ProviderConfig配置类的@Configuration注解,Spring Boot会自动处理@DubboService注解标注的类,将其暴露为Dubbo服务。

在启动类ProviderApplication上使用@EnableDubbo注解(因为项目没有其他配置类了)

application.yml

在配置文件中配置dubbo

dubbo:scan:base-packages: cn.edu.sgu.www.dubbo.provider.serviceapplication:name: dubbo-providerlogger: slf4jqos-port: 22221qos-enable: trueprotocol:name: dubboport: 20880registry:address: nacos://localhost:8848  # 使用Nnacos注册中心parameters:group: dubboserver:port: 8090spring:application:name: dubbo-provider

dubbo-consumer

注释掉ConsumerConfig配置类的@Configuration注解。

在启动类ConsumerApplication上使用@EnableDubbo注解

application.yml

在配置文件中配置dubbo

dubbo:application:name: dubbo-consumerlogger: slf4jqos-port: 22222qos-enable: trueprotocol:name: triport: 50051registry:address: nacos://localhost:8848?group=dubboserver:port: 8091

最后,依次启动服务提供者dubbo-provider、服务消费者dubbo-consumer,访问两个控制器的接口。


好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~


文章代码已经上传到Gitee,可按需获取:

dubbo-apihttps://gitee.com/muyu-chengfeng/dubbo-api.gitApache Dubbo服务提供者项目https://gitee.com/muyu-chengfeng/dubbo-provider.gitApache Dubbo服务消费者项目https://gitee.com/muyu-chengfeng/dubbo-consumer.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98761.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98761.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98761.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习——字典和文件

前面python的学习中我们已经学习了python的函数和列表元组相关的内容&#xff0c;接下来我们来学习剩下的python语法&#xff1a;字典和文件 相关代码已经上传到作者的个人gitee&#xff1a;楼田莉子/Python 学习喜欢请点个赞谢谢 目录 字典 创建字典 查找key 新增/修改元素 …

swiper插件的使用

官方网址&#xff1a;https://www.swiper.com.cn/ 1、点击导航栏&#xff0c;获取Swiper里边的下载Swiper 2、选择要下载的版本【本次案例版本5.4.5】&#xff0c;然后解压缩文件夹&#xff0c;拿到swiper.min.js和swiper.min.css文件&#xff0c;放到项目对应的css文件和js文…

Vue3+JS 组合式 API 实战:从项目痛点到通用 Hook 封装

Vue3 组合式 API 的实战技巧 —— 组合式 API 帮我解决了不少 Options API 难以应对的问题&#xff0c;尤其是在代码复用和复杂组件维护上。一、为什么放弃 Options API&#xff1f;聊聊三年项目里的真实痛点​刚接触 Vue3 时&#xff0c;我曾因 “惯性” 继续用 Options API 写…

把 AI 塞进「电梯按钮」——基于 64 kB 零样本声纹的离线故障预测按钮

标签&#xff1a;零样本声纹、电梯按钮、离线 AI、TinyML、RISC-V、低功耗、GD32V303、故障预警 ---- 1. 背景&#xff1a;为什么按钮要「听声音」&#xff1f; 全国 700 万台电梯&#xff0c;按钮故障率 0.3 %/年&#xff0c;却常出现&#xff1a; • 机械卡滞、触点氧化&…

清华大学联合项目 论文解读 | MoTo赋能双臂机器人:实现零样本移动操作

研究背景 移动操作是机器人领域的核心挑战&#xff0c;它使机器人能够在各种任务和动态日常环境中为人类提供帮助。传统的移动操作方法由于缺乏大规模训练&#xff0c;往往难以在不同任务和环境中实现泛化。而现有操作基础模型虽在固定基座任务中表现出强泛化性&#xff0c;却无…

go webrtc - 2 webrtc重要概念

webrtc是一套音视频传输技术生态&#xff0c;不是一个协议或一个什么东西。3种模式本文基于 SFU 形式阐述&#xff01;重要概念&#xff1a;sfu 服务负责&#xff1a;信令 服务负责&#xff1a;peerConnection&#xff1a;track&#xff1a;房间&#xff1a;虚拟分组概念用户&a…

“下游任务”概念详解:从定义到应用场景

“下游任务”概念详解&#xff1a;从定义到应用场景 一、什么是“下游任务”&#xff1f; 在机器学习&#xff08;尤其是深度学习&#xff09;中&#xff0c;“下游任务”&#xff08;Downstream Task&#xff09;是相对“上游过程”而言的目标任务——可以理解为&#xff1a;我…

视频怎么做成 GIF?用 oCam 一键录制 GIF 动画超简单

GIF 动图因其生动直观、无需点击播放的特点&#xff0c;越来越受欢迎。你是否也曾看到一段有趣的视频&#xff0c;想把它做成 GIF 发给朋友或用在PPT里&#xff1f;其实&#xff0c;将视频片段转换为 GIF 并不需要复杂的视频剪辑技术&#xff0c;使用一款支持直接录制为 GIF 的…

Vue.config.js中的Webpack配置、优化及多页面应用开发

Vue.config.js中的Webpack配置、优化及多页面应用开发 在Vue CLI 3项目中&#xff0c;vue.config.js文件是工程化配置的核心入口&#xff0c;它通过集成Webpack配置、优化策略和多页面开发支持&#xff0c;为项目构建提供高度可定制化的解决方案。本文将从基础配置、性能优化、…

行业学习【电商】:直播电商的去头部化、矩阵号?

声明&#xff1a;以下部分内容含AI生成这两个词是当前直播电商和MCN领域的核心战略&#xff0c;理解了它们就理解了行业正在发生的深刻变化。一、如何理解“去头部化”&#xff1f;“去头部化” 指的是平台或MCN机构有意识地减少对超头部主播&#xff08;如曾经的李佳琦、薇娅&…

【MFC视图和窗口基础:文档/视图的“双胞胎”魔法 + 单文档程序】

大家好&#xff0c;我是你的MFC编程小伙伴&#xff01;学MFC就像探险古墓&#xff1a;到处是神秘的“房间”&#xff08;窗口&#xff09;和“宝藏”&#xff08;数据&#xff09;。今天咱们聊聊核心概念 – 视图、窗口和文档。这些是MFC的“骨架”&#xff0c;懂了它们&#x…

深度学习(六):代价函数的意义

在深度学习的浩瀚世界中&#xff0c;代价函数&#xff08;Cost Function&#xff09;&#xff0c;又称损失函数&#xff08;Loss Function&#xff09;或目标函数&#xff08;Objective Function&#xff09;&#xff0c;扮演着至关重要的角色&#xff0c;它就像一个导航员&…

Kable使用指南:Android BLE开发的现代化解决方案

概述 Kable&#xff08;com.juul.kable:core&#xff09;是一个专为Android蓝牙低功耗&#xff08;BLE&#xff09;开发设计的Kotlin协程友好库。它通过提供简洁的API和响应式编程模式&#xff0c;极大地简化了BLE设备交互的复杂性。本文将详细介绍Kable的使用方法&#xff0c;…

Android图案解锁绘制

使用到的库是Pattern Locker,根据示例进行了修改,把默认样式和自定义样式进行了合并调整。 设置密码 布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xm…

Kotlin 协程之 Flow 的理解使用及源码解析

前言 在前面的文章中&#xff0c;我们已经讨论了 Channel 的概念和基本使用以及 Channel 的高阶应用。这篇我们来看日常开发中更常用的Flow。 “冷流” 和 “热流” 的本质 先来梳理一下所谓的 “冷流” 和 “热流”。 核心概念 我们已经知道 Channel 是 “热流”&#xff…

简述ajax、node.js、webpack、git

本系列可作为前端学习系列的笔记&#xff0c;HTML、CSS和JavaScript系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查看&#xff01; 点赞关注不迷路&#xff01;您的点赞、关注和收藏是对小编最大的支持和鼓励&#xff01; 系列文章目录 简述ajax、…

经营帮会员经营:全方位助力企业高效发展,解锁商业新可能

在商业竞争愈发激烈的当下&#xff0c;企业若想脱颖而出&#xff0c;高效的经营管理体系至关重要。经营帮的会员经营板块&#xff0c;凭借丰富且实用的功能&#xff0c;为企业打造了一站式的经营助力平台&#xff0c;从多维度赋能企业&#xff0c;让发展之路更顺畅。会员经营与…

Vue 封装Input组件 双向通信

子组件<template><div class"box"><div class"box-left"><input blur"handleBlur" v-model"localInput" class"box-left-input"> </div><div class"box-right"><p style…

伽马(gamma)变换记录

此只记录伽马变换原理及其应用结果&#xff08;文章所有内容基于数字图像处理-冈萨雷斯&#xff09;&#xff0c;和直接用MATLAB代码生成伽马变换代码。一、原理伽马变换的公式很简答 就是一个有规律的幂运算 公式如下&#xff1a;一般在图像中进行应用是 C1 y为不同值时r的输…

电路学习(六)三极管

三极管是一种电流驱动元器件&#xff08;MOS管为电压驱动&#xff09;&#xff0c;在电路中可以充当开关&#xff0c;放大电流等作用。本文章参考了尚硅谷的视频资料。1. 什么是三极管&#xff1f;三极管又被称为晶体三极管&#xff08;Bipolar Junction Transistor&#xff0c…