一、介绍

1.1、什么是 nacos

  • Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

  • Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

1.2、nacos 特性

  • 服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 RPC 的服务发现。
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。

  • 动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。

  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

1.3、什么是 dubbo

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
在云原生时代,Dubbo 相继衍生出了 Dubbo3、Proxyless Mesh 等架构与解决方案,在易用性、超大规模微服务实践、云原生基础设施适配、安全性等几大方向上进行了全面升级。

Dubbo 的开源故事

Apache Dubbo 最初是为了解决阿里巴巴内部的微服务架构问题而设计并开发的,在十多年的时间里,它在阿里巴巴公司内部的很多业务系统得到了非常广泛的应用。最早在 2008 年,阿里巴巴就将 Dubbo 捐献到开源社区,它很快成为了国内开源服务框架选型的事实标准框架,得到了业界更广泛的应用。在 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目,开始了一段新的征程。

1.4、dubbo 能做什么

  • 微服务编程范式和工具
    Dubbo 支持基于 IDL 或语言特定方式的服务定义,提供多种形式的服务调用形式(如同步、异步、流式等)
  • 高性能的 RPC 通信
    Dubbo 帮助解决微服务组件之间的通信问题,提供了基于 HTTP、HTTP/2、TCP 等的多种高性能通信协议实现,并支持序列化协议扩展,在实现上解决网络连接管理、数据传输等基础问题。
  • 微服务监控与治理
    Dubbo 官方提供的服务发现、动态配置、负载均衡、流量路由等基础组件可以很好的帮助解决微服务基础实践的问题。除此之外,您还可以用 Admin 控制台监控微服务状态,通过周边生态完成限流降级、数据一致性、链路追踪等能力。
  • 部署在多种环境
    Dubbo 服务可以直接部署在容器、Kubernetes、Service Mesh等多种架构下。
    (以上介绍均来自官方文档)

二、项目搭建

2.1、模块总体介绍

注意:在这里,我们搭建的项目只体现了 dubbo 用 nacos 做注册中心时,如何实现服务间调用,其他特性可自己探索
在这里插入图片描述

解释:

  • consumer(消费者) 其实就是一个spring boot 项目,在这里命名为消费者,是因为它调用 provider 的方法
  • provder (提供者) 其实也是一个spring boot 项目,在这里命名为提供者,是因为它提供了consumer需要调用的方法
    注意: 消费者和提供者是相对的,在以后的开发中也可能互相调用哦
  • dubbo-service 其实就是 consumer 和 provder 所共用的接口(通过 maven 坐标引入到 consumer 和 provider 中)

2.2、模块介绍

2.2.1 父工程介绍

父工程 pom:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.siyu</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>

    <modules>
        <module>consumer</module>
        <module>provider</module>
        <module>dubbo-service</module>
    </modules>

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

    <dependencies>
        
        <!--spring boot web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.0.2</version>
        </dependency>

        <!--nacos config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2022.0.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2022.0.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--nacos client-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.3.2</version>
        </dependency>

        <!--dubbo spring boot 整合-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
    </dependencies>
</project>
2.2.2 consumer 介绍

在这里我先贴两张nacos的截图(nacos是有服务端的,需要部署),红色圈出的地方需要注意,下面配置中会用到

配置:
在这里插入图片描述
服务:

在这里插入图片描述
命名空间:
在这里插入图片描述

包结构:

在这里插入图片描述

pom:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.siyu</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>consumer</artifactId>

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

    <dependencies>
     <!-- dubbo service 是共用接口 -->
        <dependency>
            <groupId>com.siyu</groupId>
            <artifactId>dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
              <!--这里需要加上这个依赖,不然 bootstrap.yml 可能不生效 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.2</version>
        </dependency>

    </dependencies>
</project>

bootstrap.yml :

server:
  port: 8080
spring:
  application:
    name: consumer
  cloud:
    nacos:
      config:
        server-addr: ip:8848   #nacos地址
        extension-configs:
          - data-id: consumer # nacos 中创建配置文件时配的 data-id
            group: DEFAULT_GROUP #组
            refresh: true
        namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2 # nacos 命名空间 id
      discovery:
        server-addr: ip:8848 #nacos地址
        namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2  # nacos 命名空间 id
dubbo:
  application:
    name: consumer	#配置应用名是为了加以区分不同的服务提供者
  protocol:
    name: dubbo
    port: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口
  registry:
    id: nacos-registry
    address: nacos://ip:8848	# 在此配置nacos服务的IP地址及端口

UserController (这里应该写成orderController)代码中有些不合适但不影响

@RestController
public class UserController {

    @Autowired
    protected OrderService orderService;


    @RequestMapping("user")
    public String getUser() {
        return orderService.getUser();
    }
}

OrderService

@RefreshScope   // 动态刷新(nacos中的配置改变时,要动态改变需要加这个注解,就是下面的 aa 变量)
@Service
public class OrderService {

    @Value("${aa}")  //此配置在nacos中,为了测试 nacos 的动态配置
    private String aa;

    @DubboReference(version = "1.0")  // 这个注解说明这是一个dubbo的远程调用,并不是本地调用
    private UserService userService;

    public String getUser(){
        return userService.getUser() + aa;
    }

}

Application

@EnableDiscoveryClient  //启动服务发现(nacos)
@SpringBootApplication
@EnableDubbo  //启用dubbo
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.2.3 dubbo-service 介绍

结构图:

在这里插入图片描述
这里只有单纯的接口,没有其他的(当然后续可能会有实体什么的),pom目前也是空的

2.2.4 provider 介绍

结构图:

在这里插入图片描述
pom:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.siyu</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>provider</artifactId>

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

    <dependencies>
        <dependency>
            <groupId>com.siyu</groupId>
            <artifactId>dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.2</version>
        </dependency>
    </dependencies>
</project>

没有什么其他依赖

bootstrap.yml

server:
  port: 8081

spring:
  application:
    name: provider
  cloud:
    nacos:
      config:
        server-addr: ip:8848
        extension-configs:
          - data-id: provider
            group: DEFAULT_GROUP
            refresh: true
        namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2
      discovery:
        server-addr: ip:8848
        namespace: 26c0b883-68c6-4f1d-9ab6-aa4e7e1f70d2


dubbo:
  application:
    name: provider	#配置应用名是为了加以区分不同的服务提供者
  protocol:
    name: dubbo
    port: -1 # 端口设置为-1 是让dubbo自动在[20880, 65535]之间找一个可用的端口
  registry:
    id: nacos-registry
    address: nacos://ip:8848	# 在此配置nacos服务的IP地址及端口

这些配置在 consumer 中都有详细介绍,在这里 UserController 并没有实质性的作用,和 Dubbo 调用无关,接下来直接看 UserServiceImpl

UserServiceImpl

@DubboService(version = "1.0")  // 这个注解就说明这是一个dubbo服务
public class UserServiceImpl implements UserService {

    @Override
    public String getUser() {
        return "siyu";
    }
}

ProviderApplication

@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

到这里,简单的 demo 搭建就完毕了(搭建时需要注意版本,避免冲突)

祝您遇见更好的自己

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐