首页 > 其他分享 >微服务:构建Spring Boot与Dubbo集成:以Nacos为注册中心

微服务:构建Spring Boot与Dubbo集成:以Nacos为注册中心

时间:2024-05-24 18:25:43浏览次数:12  
标签:Dubbo dubbo spring demo Boot nacos Spring cloud

一、前言

  Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架,用于构建分布式服务架构。Dubbo提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡,以及服务自动注册和发现。

二、Dubbo的特点

  面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

  智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

  服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。

  高度可扩展能力:遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。

  运行期流量调度:内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布、同机房优先等功能。

  可视化的服务治理与运维:提供丰富服务治理、运维工具,随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。

三、Dubbo框架的应用场景

  微服务架构:Dubbo框架提供了服务治理、集群容错、负载均衡等功能,适用于构建大规模微服务架构。

  RPC远程调用:Dubbo框架基于RPC协议进行远程调用,适用于构建分布式系统中不同服务之间的通信。

  分布式服务治理:Dubbo框架提供了服务注册、发现、动态路由等功能,适用于管理分布式系统中的服务。

  服务监控:Dubbo框架提供了丰富的监控功能,可以监控服务的运行状态、性能指标等。

四、实战案例

  关于Nacos的解释与下载安装,请参考我的文章《微服务:Nacos简介以及安装部署》

项目整体结构
在这里插入图片描述

在这里插入图片描述

dubbo-api: 该模块只定义了接口

dubbo-provider: 该模块实现了interface模块的具体接口;接口服务提供者

dubbo-consumer: 该模块接口服务的消费者,通过dubbo远程调用provider服务。

1. 父工程依赖管理

  我们构建一个父子工程项目

	<groupId>com.demo</groupId>
    <artifactId>demo-dubbo-nacos</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <modules>
        <module>demo-dubbo-nacos-api</module>
        <module>demo-dubbo-nacos-provider</module>
        <module>demo-dubbo-nacos-consumer</module>
    </modules>

2. dubbo-api接口定义

2.1 依赖管理

    <parent>
        <artifactId>demo-dubbo-nacos</artifactId>
        <groupId>com.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-dubbo-nacos-api</artifactId>

2.2 定义服务接口

  只定义接口,不需要实现接口

public interface ServiceA {

    String greet(String name);

}

3. 服务提供者dubbo-provider

3.1 依赖管理

<parent>
        <artifactId>demo-dubbo-nacos</artifactId>
        <groupId>com.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-dubbo-nacos-provider</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
            <version>2.1.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>demo-dubbo-nacos-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-context</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.2 实现api中的接口

@Service(
        version = "1.0.0",
        interfaceClass = ServiceA.class,
        loadbalance = "roundrobin"
)
public class ServiceAImpl implements ServiceA {

    public String greet(String name) {
    	// 具体业务实现
        return "hello, " + name;
    }
}

3.3 配置文件

server.port=8081
spring.application.name=demo-dubbo-nacos-provider
dubbo.scan.base-packages=com.demo.dubbo.nacos
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=spring-cloud://localhost
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

4. 服务消费者dubbo-consumer

4.1 依赖管理

<parent>
        <artifactId>demo-dubbo-nacos</artifactId>
        <groupId>com.demo</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-dubbo-nacos-consumer</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.demo</groupId>
            <artifactId>demo-dubbo-nacos-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-context</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-context</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.5</version>
        </dependency>
    </dependencies>

4.2 配置文件

server.port=8082
spring.application.name=demo-dubbo-nacos-consumer
dubbo.cloud.subscribed-services=demo-dubbo-nacos-provider
dubbo.scan.base-packages=com.demo.dubbo.nacos
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

4.3 测试controller

package com.demo.dubbo.nacos;

import com.demo.dubbo.nacos.api.ServiceA;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Reference(version = "1.0.0",
            interfaceClass = ServiceA.class)
    private ServiceA serviceA;

    @GetMapping("/greet")
    public String greet(String name) {
        return serviceA.greet(name);
    }

}

5. 运行结果

5.1 启动Nacos

在这里插入图片描述

5.2 启动服务提供者provider与服务消费者consumer

在这里插入图片描述

5.3 在浏览输入地址

调用成功

在这里插入图片描述

五、说明

  在Spring Boot中,即使不添加@EnableDubbo注解,也可以使用Dubbo,这主要是因为Dubbo官方提供了一个DubboAutoConfiguration自动配置类。这个自动配置类会在Spring Boot启动时自动扫描项目中与Dubbo相关的类,并将它们注册到Dubbo容器中,使得Dubbo能够正常工作。

  具体来说,DubboAutoConfiguration会自动判断当前应用是否引入了Dubbo的相关依赖。如果引入了,那么就会自动配置Dubbo的相关组件;如果没有引入,那么就不会进行任何操作。因此,在Spring Boot项目中,即使没有显式地使用@EnableDubbo注解,只要引入了Dubbo的依赖,并且配置了相应的Dubbo属性(如服务提供者的地址、服务消费者的引用等),就可以使用Dubbo进行远程服务调用。

此外,Spring Boot与Dubbo的整合还有多种方式,比如:

  ①. 导入dubbo-starter,在application.properties配置属性,使用@Service(暴露服务)和@Reference(引用服务)。这种方式可以显式地使用Dubbo的注解,但不需要添加@EnableDubbo注解。

  ②. 保留Dubbo的XML配置文件,导入dubbo-starter,并使用@ImportResource导入Dubbo的配置文件。这种方式可以使用XML来配置Dubbo的服务,同样不需要添加@EnableDubbo注解。

  总的来说,在Spring Boot中使用Dubbo时,是否添加@EnableDubbo注解并不是必须的,可以通过其他方式来配置和使用Dubbo。

  以上就是一个完整的springboot整合dubbo以Nacos为注册中心的入门案例,希望本文对你有所帮助。

标签:Dubbo,dubbo,spring,demo,Boot,nacos,Spring,cloud
From: https://blog.csdn.net/A79800/article/details/139130651

相关文章

  • SpringBoot中设置静态资源映射路径
    这里写目录标题一、系统默认静态资源路径二、静态资源不在默认目录,需要配置1.方法一:通过配置类设置(java代码实现)2.方法二:application.yml配置3.方法三:application.properties配置一、系统默认静态资源路径默认情况下,SpringBoot会从以下位置自动serve静态资源:c......
  • springcloud和dubbo分别调用controller层和service层是两种微服务架构的最大区别?
    许多讨论微服务架构中springcloud和dubbo区别的文章中,主要强调dubbo只是springcloud的子集,只是服务治理工具,不是完整解决方案。但是看了一下两者,感觉完全无法兼容,理念完全不同啊。springboot开发的典型应用目录如下:分Controller、service接口、Serviceimpl实现、dao等层次。1、s......
  • 为什么要使用springCloud直接使用RestTemplate不行吗?
    虽然RestTemplate本身是一个强大的工具,用于在Spring应用程序中发送HTTP请求,但在复杂的微服务架构中,直接使用RestTemplate可能不足以满足所有需求。SpringCloud提供了更高级别的功能,使得在微服务环境中构建、部署和管理应用程序变得更加容易。以下是一些使用SpringCloud而不是直......
  • Springboot Tomcat 架构及参数优化
    1.SpringbootTomcat架构及参数优化1.1.版本说明1.2.SpringBootTomcat架构分析1.2.1.Tomcat核心组件类图1.2.2.Tomcat核心组件架构图1.3.SpringBootTomcat工作流程1.3.1.SpringBoot初始化Tomcat流程1.3.2.Tomcat启动流程1.3.2.1.初始化Server......
  • springboot集成kafka解决集群模式下分组ID不同问题
    背景:在集群模式下,每个实例需要分组ID不同,共同消费某个topic,集群下的实例是动态扩展的,无法确认实例的个数,每次项目启动的时候,需要动态的给定kakfa的分组ID,但是分组ID整体是一样的,不能改变。方式1:CURRENT_INSTANCE_GROUP_ID=KafkaConstant.SSE_GROUP.concat(String.valueOf(Sys......
  • 京东面试:SpringBoot同时可以处理多少请求?
    SpringBoot作为Java开发中必备的框架,它为开发者提供了高效且易用的开发工具,所以和它相关的面试题自然也很重要,咱们今天就来看这道经典的面试题:SpringBoot同时可以处理多少个请求?准确的来说,SpringBoot同时可以处理多少个请求,并不取决于SpringBoot框架本身,而是取决于其内......
  • 麒麟系统下springboot程序开机自启动
    1、编写脚本放置到/etc/systemed/system目录下例如display.service[Unit]Description=display#Documentation=http://www.baidu.com#Requires=network.targetAfter=network.targetelasticsearch.serviceredis.servicemysql.server.service[Service]Type=forkingEn......
  • Java基于saas模式云MES制造执行系统源码Spring Boot + Hibernate Validation什么是MES
    Java基于saas模式云MES制造执行系统源码SpringBoot+HibernateValidation什么是MES系统?MES制造执行系统,通过互联网技术实现从订单下达到产品完成的整个生产过程进行优化管理。能有效地对生产现场的流程进行智能控制,防错防呆防漏,自动化集成各种制造信息,使管理者准确掌控工......
  • 社区医院|基于SprinBoot+vue的社区医院管理服务系统(源码+数据库+文档)
    社区医院管理服务系统目录基于SprinBoot+vue的社区医院管理服务系统一、前言二、系统设计三、系统功能设计 1系统功能模块2管理员功能模块3用户功能模块4医生功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博......
  • 家政服务|基于SprinBoot+vue的家政服务管理平台(源码+数据库+文档)
    家政服务管理平台目录基于SprinBoot+vue的家政服务管理平台一、前言二、系统设计三、系统功能设计 1前台模块设计2后台功能模块5.2.1管理员功能模块5.2.2用户功能模块5.2.3服务人员功能模块四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推......