Maison  >  Article  >  Java  >  Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Java后端技术全栈
Java后端技术全栈avant
2023-08-15 16:49:14938parcourir
Cet article écrira un exemple détaillé pour expliquer le développement réel de dubbo+nacos+Spring Boot. Cet article ne couvrira pas trop de connaissances théoriques, mais écrira l'exemple le plus simple pour illustrer comment dubbo peut être intégré à nacos pour créer rapidement un environnement de développement.

Répertoire d'articles

  • Préparation de l'environnement
    • introduction dubbo
    • Préparation de l'environnement Nacos
    • Na Intégration des spécifications de gestion de projet cos et dubbo
  • Cas nacos d'intégration Dubbo
    • Créer un module d'interface publique
    • Créer un module de fournisseur de services
    • Créer un module de consommateur de service
    • Test d'appel de service
  • Résumé de cet article

Préparation de l'environnement

introduction à Dubbo

La relation d'appel entre les nœuds principaux de Dubbo

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Description du nœud

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Description de la relation d'appel

  • Le conteneur de services est responsable du démarrage, du chargement et de l'exécution du fournisseur de services.
  • Lorsque le prestataire démarre, il enregistre les services qu'il fournit auprès du centre d'enregistrement.
  • Les consommateurs de services s'abonnent au centre d'inscription pour les services dont ils ont besoin lors du démarrage.
  • Le centre d'enregistrement renvoie la liste d'adresses du fournisseur de services au consommateur en cas de changement, le centre d'enregistrement transmettra les données de modification au consommateur en fonction de la longue connexion.
  • Le consommateur du service sélectionne un fournisseur à appeler dans la liste d'adresses du fournisseur en fonction de l'algorithme d'équilibrage de charge logiciel. Si l'appel échoue, il sélectionne un autre fournisseur à appeler.
  • Les consommateurs et fournisseurs de services accumulent le nombre d'appels et la durée des appels dans la mémoire et envoient régulièrement des données statistiques au centre de surveillance toutes les minutes.

Préparation de l'environnement Nacos

Démarrer Nacos version 1.4.3

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Ouvrir le panneau de configuration Nacos

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Nacos intégrés à dubbo

Pour faciliter la compréhension de chacun, voici les codes Démo producteur et consommateur correspondants, ainsi que le centre d'inscription utilisé.

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Spécifications de gestion de projet

Il existe une correspondance entre les versions entre springboot, netflix et cloud alibaba. Les versions sélectionnées pour cet article sont les suivantes

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Il existe des versions entre dubbo et. cloud alibaba La relation correspondante entre eux, la version sélectionnée dans cet article est la suivante

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Pour faciliter une utilisation ultérieureSpringCloud Alibaba pour le développement, créez d'abord un projet parent de type pom, principalement utilisé pour la gestion des versions de la pile technologique du projet, créez un projet maven nommé spring-cloud -alibaba-example, supprimez le fichier src, modifiez le fichier pom <code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(228, 105, 24);background-color: rgb(239, 239, 239);font-size: 0.875em;line-height: 1.6 !important;">SpringCloud Alibaba进行开发,首先创建一个pom类型的父项目,主要用于项目技术栈版本管理,创建一个maven项目,名称为spring-cloud-alibaba-example,去除src文件,修改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>ah.wideth</groupId>
    <artifactId>spring-cloud-alibaba-example</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <com-alibaba-cloud.version>2.2.7.RELEASE</com-alibaba-cloud.version>
    </properties>

    <!--对项目版本进行管理-->
    <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>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${com-alibaba-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

后续创建的项目都放到此目录下,只需要声明groupId和artifactId,会自动引用父项目spring-cloud-alibaba-example

<?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>
        <artifactId>spring-cloud-alibaba-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modules>
        <module>public-api</module>
        <module>dubbo-provider</module>
        <module>dubbo-consumer</module>
    </modules>

    <artifactId>dubbo-nacos-example</artifactId>
    <name>dubbo-nacos-example</name>
    <description>duboo与nacos整合的父工程</description>
    <packaging>pom</packaging>

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


    <dependencies>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--解决nacos-client2.0报错的问题-->
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--dubbo相关-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>${nacos.version}</version>
        </dependency>

        <!-- 解决dubbo2.7.13jar包冲突问题-->
        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
    </dependencies>

</project>

Les projets créés par la suite seront placés dans ce répertoire Il vous suffit de déclarer le groupId et l'artefactId, et le projet parent sera automatiquement référencé <. code style="padding : 2px 4px; border-radius : 4px;margin-right: 2px;margin-left: 2px;font-family : 'Operator Mono', Consolas, Monaco, Menlo, monospace;word-break: break- tout;couleur : rgb(228, 105, 24) ;couleur d'arrière-plan : rgb(239, 239, 239);taille de police : 0,875em;hauteur de ligne : 1,6 !important;">exemple-spring-cloud-alibaba version. Il ne s'agit pas tant d'un projet parent que d'un projet racine : chaque fois que vous apprenez une nouvelle technologie, un véritable projet parent sera créé, et de nombreux sous-projets seront créés sous le projet parent correspondant🎜
Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Cas nacos intégré dubbo

Le cas dans cet article est écrit sur la base de l'exemple de développement nacos ci-dessus. Commençons par créer notre projet et collons ma structure de répertoires.

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

Description du module

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

父工程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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>spring-cloud-alibaba-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <modules>
        <module>public-api</module>
        <module>dubbo-provider</module>
        <module>dubbo-consumer</module>
    </modules>

    <artifactId>dubbo-nacos-example</artifactId>
    <name>dubbo-nacos-example</name>
    <description>duboo与nacos整合的父工程</description>
    <packaging>pom</packaging>

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


    <dependencies>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--解决nacos-client2.0报错的问题-->
            <exclusions>
                <exclusion>
                    <artifactId>nacos-client</artifactId>
                    <groupId>com.alibaba.nacos</groupId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--dubbo相关-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>${nacos.version}</version>
        </dependency>

        <!-- 解决dubbo2.7.13jar包冲突问题-->
        <dependency>
            <groupId>com.alibaba.spring</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>1.0.11</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
    </dependencies>

</project>
Tutoriel pratique de développement SpringBoot+Dubbo+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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>dubbo-nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>public-api</artifactId>
    <name>public-api</name>
    <description>api公用接口</description>
    <packaging>jar</packaging>

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

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

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

</project>
Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

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

package ah.wideth.api;

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

    String getInfo();
}
Tutoriel pratique de développement SpringBoot+Dubbo+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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>dubbo-nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-provider</artifactId>
    <name>dubbo-provider</name>
    <description>dubbo的服务提供者模块</description>

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

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入公共接口模块-->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>public-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </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文件

<?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>
        <artifactId>dubbo-nacos-example</artifactId>
        <groupId>ah.wideth</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-consumer</artifactId>
    <name>dubbo-consumer</name>
    <description>dubbo的服务消费者模块</description>

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

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--引入公共接口模块-->
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>public-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </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控制面板查看注册中心中的服务

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

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

Tutoriel pratique de développement SpringBoot+Dubbo+Nacos

本文小结

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer