springboot+dubbo+nacos开发实战

本文来写个详细的例子来说下dubbo+nacos+springboot开发实战。本文不会讲述太多的理论的知识,会写一个最简单的例子来说明dubbo如何与nacos整合。快速搭建开发环境。

文章目录

  • 环境准备
    • dubbo简介
    • Nacos环境准备
    • Nacos与dubbo整合
  • 项目管理规范
  • dubbo整合nacos案例
    • 创建公共接口模块
    • 创建服务提供者模块
    • 创建服务消费者模块
    • 服务调用测试
  • 本文小结


环境准备

dubbo简介

dubbo核心节点之间的调用关系

springboot+dubbo+nacos开发实战_第1张图片

节点说明

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器

调用关系说明

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Nacos环境准备

启动nacos,本文使用的是nacos1.4.3版本

springboot+dubbo+nacos开发实战_第2张图片

打开nacos的控制面板

springboot+dubbo+nacos开发实战_第3张图片


Nacos与dubbo整合

为了方便大家理解,这里写出对应的生产方、消费方 Demo 代码,以及使用的注册中心。

springboot+dubbo+nacos开发实战_第4张图片


项目管理规范

springboot,netflix和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下

springboot+dubbo+nacos开发实战_第5张图片

dubbo和cloud alibaba之间有版本之间的对应关系,本文选择的版本如下

springboot+dubbo+nacos开发实战_第6张图片

为了后续方便使用SpringCloud Alibaba进行开发, 首先创建一个pom类型的父项目, 主要用于项目技术栈版本管理, 创建一个maven项目,名称为spring-cloud-alibaba-example, 去除src文件, 修改pom文件


<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.0modelVersion>

    <groupId>ah.widethgroupId>
    <artifactId>spring-cloud-alibaba-exampleartifactId>
    <version>1.0-SNAPSHOTversion>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.3.12.RELEASEversion>
        <relativePath/> 
    parent>

    <packaging>pompackaging>

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <java.version>1.8java.version>
        <spring-cloud.version>Hoxton.SR12spring-cloud.version>
        <com-alibaba-cloud.version>2.2.7.RELEASEcom-alibaba-cloud.version>
    properties>

    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>

            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${com-alibaba-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
project>

后续创建的项目都放到此目录下, 只需要声明groupId和artifactId, 会自动引用父项目spring-cloud-alibaba-example的版本。与其说是父项目, 不如说是根项目: 因为下面每学习一个新的技术, 就会新建一个真正的父项目, 而在对应的父项目下面又会创建许多的子项目

springboot+dubbo+nacos开发实战_第7张图片


dubbo整合nacos案例

本文的案例是在上文nacos开发实例的基础之上继续编写的。下面开始创建我们的项目,贴上我的目录结构。

springboot+dubbo+nacos开发实战_第8张图片

模块说明

  • public-api公共接口模块(接口),供服务消费者和服务提供者调用。
  • dubbo-provider服务提供者模块(接口实现类),引入了public-api模块
  • dubbo-consumer服务消费者模块(controller),引入了public-api模块
  • 消费者和提供者通过公共接口模块进行rpc远程调用

父工程pom文件


<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.0modelVersion>

    <parent>
        <artifactId>spring-cloud-alibaba-exampleartifactId>
        <groupId>ah.widethgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

    <modules>
        <module>public-apimodule>
        <module>dubbo-providermodule>
        <module>dubbo-consumermodule>
    modules>

    <artifactId>dubbo-nacos-exampleartifactId>
    <name>dubbo-nacos-examplename>
    <description>duboo与nacos整合的父工程description>
    <packaging>pompackaging>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>utf-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <dubbo.version>2.7.13dubbo.version>
        <nacos.version>1.4.1nacos.version>
    properties>


    <dependencies>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            
            <exclusions>
                <exclusion>
                    <artifactId>nacos-clientartifactId>
                    <groupId>com.alibaba.nacosgroupId>
                exclusion>
            exclusions>
        dependency>


        
        <dependency>
            <groupId>org.apache.dubbogroupId>
            <artifactId>dubbo-spring-boot-starterartifactId>
            <version>${dubbo.version}version>
        dependency>

        <dependency>
            <groupId>org.apache.dubbogroupId>
            <artifactId>dubbo-registry-nacosartifactId>
            <version>${dubbo.version}version>
        dependency>

        <dependency>
            <groupId>com.alibaba.nacosgroupId>
            <artifactId>nacos-clientartifactId>
            <version>${nacos.version}version>
        dependency>

        
        <dependency>
            <groupId>com.alibaba.springgroupId>
            <artifactId>spring-context-supportartifactId>
            <version>1.0.11version>
        dependency>

        <dependency>
            <groupId>org.apache.dubbogroupId>
            <artifactId>dubboartifactId>
            <version>${dubbo.version}version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframeworkgroupId>
                    <artifactId>springartifactId>
                exclusion>
                <exclusion>
                    <groupId>javax.servletgroupId>
                    <artifactId>servlet-apiartifactId>
                exclusion>
                <exclusion>
                    <groupId>log4jgroupId>
                    <artifactId>log4jartifactId>
                exclusion>
            exclusions>
        dependency>
        
    dependencies>

project>

springboot+dubbo+nacos开发实战_第9张图片


创建公共接口模块

pom文件


<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.0modelVersion>

    <parent>
        <artifactId>dubbo-nacos-exampleartifactId>
        <groupId>ah.widethgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

    <artifactId>public-apiartifactId>
    <name>public-apiname>
    <description>api公用接口description>
    <packaging>jarpackaging>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>utf-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

springboot+dubbo+nacos开发实战_第10张图片

公共接口模块里面只有一个接口,没有配置文件,打jar包

package ah.wideth.api;

/**
 * 让生产者和服务消
 * 费者来使用这个接口
 */
public interface InfoService {

    String getInfo();
}

springboot+dubbo+nacos开发实战_第11张图片


创建服务提供者模块

pom文件


<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.0modelVersion>

    <parent>
        <artifactId>dubbo-nacos-exampleartifactId>
        <groupId>ah.widethgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

    <artifactId>dubbo-providerartifactId>
    <name>dubbo-providername>
    <description>dubbo的服务提供者模块description>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>utf-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        
        <dependency>
            <groupId>${project.groupId}groupId>
            <artifactId>public-apiartifactId>
            <version>${project.version}version>
        dependency>

    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

application.yml配置文件

server:
  port: 8180

spring:
  application:
    name: dubbo-provider

dubbo:
  registry:
    address: nacos://127.0.0.1:8848 #注册地址
  application:
    name: dubbo-provider #应用名
  protocol:
    name: dubbo #dubbo协议
    port: 20880 #协议端口
  scan:
    base-packages: ah.wideth.impl #扫包范围
  provider:
    timeout: 30000 #超时时间

接口实现类,该类实现了上面我们在公共接口模块创建的接口

package ah.wideth.impl;

import ah.wideth.api.InfoService;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Component;


// dubbo提供的Service注解,用于声明对外暴露服务
// Service引入的是org.apache.dubbo.config.annotation.Service包
@Component
@DubboService
public class InfoServiceImpl implements InfoService {

    @Override
    public String getInfo() {

        return "hello,这里是dubbo-provider模块!";
    }
}

服务提供者启动类

package ah.wideth;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDubbo
@EnableDiscoveryClient
@SpringBootApplication
public class DubboProviderApplication {

    public static void main(String[] args) {

        SpringApplication.run(DubboProviderApplication.class, args);
        System.out.println("dubbo服务提供者8180启动了");
    }

}

创建服务消费者模块

pom文件


<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.0modelVersion>

    <parent>
        <artifactId>dubbo-nacos-exampleartifactId>
        <groupId>ah.widethgroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

    <artifactId>dubbo-consumerartifactId>
    <name>dubbo-consumername>
    <description>dubbo的服务消费者模块description>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>utf-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
    properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        
        <dependency>
            <groupId>${project.groupId}groupId>
            <artifactId>public-apiartifactId>
            <version>${project.version}version>
        dependency>

    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>

    build>
project>

application.yml配置文件

server:
  port: 8181

spring:
  application:
    name: dubbo-consumer

dubbo:
  registry:
    address: nacos://127.0.0.1:8848 #注册地址
  application:
    name: dubbo-consumer #应用名
  consumer:
    timeout: 30000 #超时时间

controller,调用公共接口模块创建的接口

package ah.wideth.controller;

import ah.wideth.api.InfoService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class InfoController {

    //dumbo提供的Reference注解,用于调用远程服务
    @DubboReference(check = false)
    private InfoService infoService;

    @GetMapping("/getInfo")
    public String getInfo(){

        return infoService.getInfo();
    }
}

服务消费者启动类

package ah.wideth;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDubbo
@EnableDiscoveryClient
@SpringBootApplication
public class DubboConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(DubboConsumerApplication.class, args);
        System.out.println("dubbo服务消费者8181启动了");
    }

}

服务调用测试

打开Nacos控制面板查看注册中心中的服务

springboot+dubbo+nacos开发实战_第12张图片

启动nacos,启动服务提供者和服务消费者,调用服务消费者的getInfo方法,服务提供者会返回结果

springboot+dubbo+nacos开发实战_第13张图片


本文小结

本文编写了一个例子来对dubbo整合nacos进行服务调用的例子,不过要注意jar包的冲突问题。

你可能感兴趣的:(微服务开发实战,dubbo,后端,java)