外贸建站行业好做吗百度一下百度主页官网
快速入手:基于SpringBoot的Dubbo应用融合Nacos成为注册中心
- 前言
- 创建应用
- 添加配置
- 提供服务接口
- 启动类添加注解
- 服务调用
- Dubbo 调用 Spring Cloud
- Spring Cloud 调用 Dubbo
- Dubbo 与 Spring Cloud 的关系
前言
Dubbo 是阿里巴巴开源的一个高性能、轻量级的分布式服务框架,在分布式系统开发领域应用广泛。它提供了远程调用、服务注册与发现、负载均衡、集群容错等一系列核心功能,适用于各种大型分布式系统和微服务架构。
创建应用
参考官网的版本说明,如图所示:
我们使用当前Dubbo最新的版本,依赖文件如下:
Spring Boot Version | Dubbo | Nacos Version |
---|---|---|
3.3.9 | 3.3.0 | 2.5.1 |
<?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>3.3.9</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.dubbo.nacos.product</groupId><artifactId>dubbo-nacos-product</artifactId><version>0.0.1-SNAPSHOT</version><name>dubbo-nacos-product</name><description>dubbo-nacos-product</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- dubbo依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.3.0</version></dependency><!-- Nacos注册中心 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-nacos-spring-boot-starter</artifactId><version>3.3.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
另一种更灵活的方式是使用官方项目脚手架工具 - start.dubbo.apache.org 在线服务。它可以帮助开发者创建 Spring Boot 结构应用,根据用户的选择自动管理 dubbo-spring-boot-starter
等依赖和必要配置。
请确保后台已经启动 Nacos 服务,在Nacos融合SpringCloud成为注册配置中心文章中有讲解Nacos的安装或参考 Nacos 快速入门。
添加配置
Dubbo Spring 外部化配置是由 Dubbo 2.5.8
引入的新特性,可通过 Spring Environment 属性自动地生成并绑定 Dubbo 配置 Bean,实现配置简化,并且降低微服务开发门槛。
Dubbo 相关配置信息都存放在 application.yml
配置文件中,示例代码如下:
dubbo:application:name: dubbo-nacos-productregistry:address: nacos://127.0.0.1:8848# 新用户请设置此值,表示启用应用级服务发现,可选值 interface(接口)、instance(服务实例)、all(所有),默认值为 all,未来版本将切换默认值为 instanceregister-mode: all
基于以下配置,Dubbo 进程将在 50051 端口监听 triple 协议请求,同时,实例的 ip:port
信息将会被注册到 Nacos server。
dubbo:application:name: dubbo-nacos-productregistry:address: nacos://127.0.0.1:8848protocol:name: triport: 50051
提供服务接口
和以往SpringCloud项目不同,需要提供服务后才可注册,以下是基于 Java Interface 的标准 Dubbo 服务定义。
public interface DemoService {String sayHi(String str);
}
@DubboService
//@DubboService(registry="nacos-registry")
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHi(String str) {return "hello "+ str;}
}
如果要设置服务参数,@DubboService
也提供了常用参数的设置方式。
@DubboService(version = "1.0.0", group = "dev", timeout = 5000)
public class DemoServiceImpl implements DemoService {}
@Service
注解从 3.0 版本开始就已经废弃,改用@DubboService
,以区别于 Spring 的@Service
注解
在DemoServiceImpl 类中添加了 @DubboService
注解,通过这个配置可以基于 Spring Boot 去发布 Dubbo 服务,后续服务端发布的服务,消费端订阅的服务都是围绕着 DemoService 接口展开的。
启动类添加注解
启动类增加@EnableDubbo
注解用来加载和启动 Dubbo 相关组件,将所有标注 @DubboService
的服务接口实现类暴露为 Spring Bean,随即被导出 Dubbo 服务。示例代码如下:
@SpringBootApplication
@EnableDubbo
public class DubboNacosProductApplication {public static void main(String[] args) {SpringApplication.run(DubboNacosProductApplication.class, args);}
}
Spring Boot 注解默认只会扫描 main 类所在的
package
,如果服务定义在其它package
中,需要增加配置@EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})
启动成功后,如图所示:
再检查服务在Nacos上是否注册成功,如图所示:
我们会发现创建了两个服务实例和配置文件。这是因为Dubbo3 默认采用 “应用级服务发现 + 接口级服务发现” 的双注册模式,详细可以参考官网介绍,应用级服务发现的 “服务名” 为应用名。
Dubbo3 默认采用 “应用级服务发现 + 接口级服务发现” 的双注册模式,因此会发现应用级服务(应用名)和接口级服务(接口名)同时出现在 Nacos 控制台,可以通过配置
dubbo.registry.register-mode=instance/interface/all
来改变注册行为。
服务调用
创建consumer
包,用于模拟发起对dubbo-nacos-product
服务的远程调用。示例代码如下:
@Component
public class Consumer implements CommandLineRunner {@DubboReferenceprivate DemoService demoService;@Overridepublic void run(String... args) throws Exception {String result = demoService.sayHi("world");System.out.println("Receive result ======> " + result);}
}
@DubboReference
注解将自动注入为 Dubbo 服务代理实例,使用 demoService 即可发起远程服务调用执行结果如图所示:
@Reference
注解从 3.0 版本开始就已经废弃,改用@DubboReference
,以区别于 Spring 的@Reference
注解
通常远程调用是跨进程的,所以创建一个独立的 Consumer(客户端),以便发起对 Dubbo 服务的远程调用。
参考前面的示例创建一个消费方项目,比如:dubbo-nacos-consumer
。
因为没有提供服务接口,所以消费者不会再Nacos上注册。官方描述如下:
Dubbo 3.0.0 版本以后,增加了是否注册消费者的参数,如果需要将消费者注册到 nacos 注册中心上,需要将参数(
register-consumer-url
)设置为true,默认是false。
配置文件中示例如下:
dubbo:application:name: dubbo-nacos-consumerregistry:address: nacos://127.0.0.1:8848parameters:register-consumer-url: true # 是否注册消费者
另外还有个重要的@DubboReference
注解,注入Dubbo 服务代理实例,根据官网解释如下:
@DubboService
与@DubboReference
用于标记 Dubbo 服务,@EnableDubbo
启动 Dubbo 相关配置并指定 Spring Boot 扫描包路径。
将之前的Consumer代码挪到消费者代码中,然后启动项目,执行结果如图:
如图所示,服务名前缀为 providers:
的信息为服务提供者的元信息,consumers:
则代表服务消费者的元信息。
- 扩展注解配置
虽然可以通过 @DubboService
和 @DubboReference
调整配置参数(如下代码片段所示),但总体来说注解是为易用性设计的,其提供的仅仅是 80% 场景下常用的配置项。在这种情况下,如果有更复杂的参数设置需求,可以使用 Java Config 或 dubbo.properties
两种方式。
@DubboService(version = "1.0.0", group = "dev", timeout = 5000)
@DubboReference(version = "1.0.0", group = "dev", timeout = 5000)
注意,Java Config 是 @DubboService
和 @DubboReference
的替代方式,对于有复杂配置需求的服务建议使用这种方式。
@Configuration
public class ProviderConfiguration {@Beanpublic ServiceBean demoService() {ServiceBean service = new ServiceBean();service.setInterface(DemoService.class);service.setRef(new DemoServiceImpl());service.setGroup("dev");service.setVersion("1.0.0");Map<String, String> parameters = new HashMap<>();service.setParameters(parameters);return service;}
}
另一种,可以通过在项目 resources 目录下增加 dubbo.properties
文件作为配置补充
dubbo.service.org.apache.dubbo.springboot.demo.DemoService.timeout=5000
dubbo.service.org.apache.dubbo.springboot.demo.DemoService.parameters=[{myKey:myValue},{anotherKey:anotherValue}]
dubbo.reference.org.apache.dubbo.springboot.demo.DemoService.timeout=6000
properties
格式配置目前结构性不太强,比如体现在 key 字段冗余较多,后续会考虑提供对于yaml
格式的支持。
Dubbo 调用 Spring Cloud
Dubbo 应用作为消费方要调用到 Spring Cloud 发布的 HTTP 接口。可以借助 Dubbo3 内置的 REST 编程范式支持实现,假设你已有一套Spring Cloud 微服务体系(可以参考《Nacos融合SpringCloud成为注册配置中心》文章或者官方《Nacos 快速入门》文章)。
在SpringCloud中发布一个Http接口,示例代码如下:
@RestController
public class AppController {@GetMapping("/echo/{str}")public String rest(@PathVariable(value = "str") String str){return "hello "+ str;}
}
我们启动SpringCloud项目后调用该接口,确保接口能正常请求。
然后再Dubbo项目中引入OpenFeign的依赖(我们需要将Dubbo3.3.x改为Dubbo3.2.x,经过测试发现最新版不支持OpenFeign调用,希望官方尽快修改该问题把),依赖文件如下:
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.2.17</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.11.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.3</version></dependency>
对应配置文件如下:
dubbo:application:name: dubbo-nacos-consumerregistry:address: nacos://127.0.0.1:8848parameters:register-consumer-url: true # 是否注册消费者
我们需要定义一个与SpringCloud一样的OpenFeign接口,示例代码如下:
@FeignClient(name = "sc-nacos-product")
public interface EchoService {@GetMapping(value = "/echo/{str}")String echo(@PathVariable(value = "str") String str);
}
通过 @DubboReference
注解将 EchoService 接口注册为 Dubbo 服务,示例代码如下:
@Component
public class Consumer implements CommandLineRunner {@DubboReference(providedBy = "sc-nacos-product",check = false)private EchoService echoService;@Overridepublic void run(String... args) throws Exception {String result = echoService.echo("world");System.out.println("Receive result ======> " + result);}
}
启动Dubbo应用后,会自动调用 Spring Cloud 服务,执行结果如图:
Spring Cloud 调用 Dubbo
接下来将展示如何将 Dubbo server 发布的服务开放给 Spring Cloud client 调用。
从 Dubbo 3.3 版本开始,Triple 协议重用已有的 HTTP 协议栈,实现了全面的 REST 风格服务导出能力。无需使用泛化或网关层协议转换,无需配置,用户即可通过 HTTP 协议去中心化直接访问后端的 Triple 协议服务。
相比于普通的 Dubbo 服务定义,我们要先引入SpringWeb相关依赖(Dubbo依赖使用最新版本即可),依赖文件如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.9</version></dependency>
然后在接口上添加标准Spring MVC注解,使用 @DubboService
注解发布服务即可示例代码如下:
@RestController
@RequestMapping
public interface DemoService {@GetMapping(value = "/sayHi")String sayHi(String name);
}
@DubboService
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHi(String name) {return "hello " + name;}
}
在服务配置上,特别注意我们需要将服务的协议进行配置如果版本是3.3.x就要设置protocol: tri
,3.2.x版本设置protocol: rest
,前面说过Dubbo 3.3
已经去掉了 Rest 协议,配置信息如下:
dubbo:application:name: dubbo-nacos-productqos-enable: falseregistry:address: nacos://127.0.0.1:8848# 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instanceregister-mode: instanceprotocol:port: 8090# 3.3.x设置为 tri,3.2.x设置为 restname: tri
启动Dubbo应用,确认接口访问成功。
然后再SpringCloud的消费方项目中定义一个OpenFeign接口,用于调用上面发布的 Dubbo rest 服务。示例代码如下:
@FeignClient(name = "dubbo-nacos-product")
public interface DemoService {@GetMapping(value = "/sayHi/{name}")String sayHi(@PathVariable String name);
}
再创建一个Controller进行调用测试OpenFeign接口,示例代码如下:
@RestController
@RequestMapping(value = "/demo")
public class DemoController {@Autowiredprivate DemoService demoService;@RequestMapping(value = "/sayHi/{name}", method = RequestMethod.GET)public String sayHi(@PathVariable String name) {return "hello "+ name;}
}
然后检查下Nacos服务是否都注册成功,如图所示:
测试接口是否请求成功,如图所示:
另外,我们可以利用 Dubbo 的多协议发布机制,为一些服务配置多协议发布。
dubbo:protocols:- id: triname: triport: 8090- id: dubboname: dubboport: 20880
同时,服务注解中也配置为多协议发布(也可以分别配置),示例代码如下:
@DubboService(protocol="tri,dubbo")
public class UserServiceImpl implements UserService {}
对于消费端而言,直接在声明引用的时候指定要调用的协议关键字就可以了,示例代码如下:
@DubboReference(protocol="dubbo")
private DemoService demoService;
@DubboReference(protocol="tri")
private GreetingService greetingService;
或者在 application.yml
配置文件中指定全局默认值:
dubbo:consumer:protocol: tri
Dubbo 与 Spring Cloud 的关系
Dubbo 与 Spring Cloud 是两套平行的微服务开发与解决方案,两者都提供了微服务定义、发布、治理的相关能力,对于微服务开发者来说,我们建议在开发之初就确定好 Apache Dubbo 与 Spring Cloud 之间的选型,尽量避免两个不同体系在同一集群中出现,以降低集群维护复杂度。