SpringCloudAlibaba+Dubbo


本文主要用來實現SpringCloud如何利用Dubbo(RPC框架)的高性能服務調用。

Dubbo的注冊中心采用的是Zookeeper,而起初微服務的注冊中心並不支持Zookeeper,那么怎么才能讓SpringCloud支持Dubbo呢?

SpringCloudAlibaba出現了,它使用Nacos作為注冊中心,具體使用參照:SpringBoot整合Nacos

下面說一下Nacos+Dubbo的實現(文末有項目Gitee地址)

首先啟動nacos,具體參照:Windows安裝Nacos單機&集群

創建maven父工程

nacos-dubbo-demo,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>
    <groupId>com.qjc.demo</groupId>
    <artifactId>nacos-dubbo-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-dubbo-demo</name>
    <description>Demo project for Spring Boot</description>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

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

    <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>
        <java.version>1.8</java.version>

        <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-dubbo</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

</project>

創建api接口管理工程

nacos-dubbo-api,不需要導入依賴,創建接口

package com.qjc.demo.service;

import java.util.List;
import java.util.Map;

public interface HelloProvider {

    String hello(String name);

    List<Map<String, String>> testMapList(Map<String, String> map);

}

創建服務提供者

nacos-dubbo-provider,導入依賴

<dependencies>
        <dependency>
            <groupId>com.qjc.demo</groupId>
            <artifactId>nacos-dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

創建配置文件bootstrap.yml

spring:
  application:
    name: nacos-dubbo-provider
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        enabled: true
        register-enabled: true
        server-addr: 127.0.0.1:8848

創建配置文件application.yml

server:
  port: 8801
dubbo:
  # Dubbo 服務注冊中心配置
  registry:
    # 其中子屬性 address 的值 "spring-cloud://localhost",說明掛載到 Spring Cloud 注冊中心
    address: spring-cloud://localhost
  application:
    # qos=Quality of Service 是Dubbo的在線運維命令,可以對服務進行動態的配置、控制(上下線)及查詢,具體參考:https://blog.csdn.net/u012988901/article/details/84503672
    qos:
      enable: false
  # Dubbo 服務暴露的協議配置
  protocol:
    # 協議名稱
    name: dubbo
    # 協議端口( -1 表示自增端口,從 20880 開始)
    port: -1
  # 指定 Dubbo 服務實現類的掃描基准包
  scan:
    base-packages: com.qjc.demo.service.impl

啟動類加上@EnableDiscoveryClient

創建HelloProvider的實現類,並將其通過注解注冊到注冊中心

package com.qjc.demo.service.impl;

import com.qjc.demo.service.HelloProvider;
import org.apache.dubbo.config.annotation.Service; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Service public class HelloProviderImpl implements HelloProvider {


    @Override
    public String hello(String name) {
        return "hello! " + name;
    }

    @Override
    public List<Map<String, String>> testMapList(Map<String, String> map) {
        List<Map<String, String>> list = new ArrayList<Map<String, String>>();
        list.add(map);
        Map<String, String> map2 = new HashMap<String, String>();
        map2.put("key1", "value1");
        map2.put("key2", "value2");
        list.add(map2);
        return list;
    }
}

創建服務消費者

nacos-dubbo-consumer,導入依賴

<dependencies>
        <dependency>
            <groupId>com.qjc.demo</groupId>
            <artifactId>nacos-dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

創建配置文件bootstrap.yml

spring:
  application:
    name: nacos-dubboe-consumer
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        enabled: true
        register-enabled: true
        server-addr: 127.0.0.1:8848

創建配置文件application.yml

server:
  port: 8802
dubbo:
  # Dubbo 服務注冊中心配置
  registry:
    # 其中子屬性 address 的值 "spring-cloud://localhost",說明掛載到 Spring Cloud 注冊中心
    address: spring-cloud://localhost
  application:
    # qos=Quality of Service 是Dubbo的在線運維命令,可以對服務進行動態的配置、控制(上下線)及查詢,具體參考:https://blog.csdn.net/u012988901/article/details/84503672
    qos:
      enable: false
  cloud:
    # 要訂閱服務的服務名:及服務提供方的 spring.application.name的值,也就是服務提供方的應用名。
    subscribed-services: nacos-dubbo-provider

啟動類加上@EnableDiscoveryClient

引用Dubbo服務

package com.qjc.demo.controller;

import com.qjc.demo.service.HelloProvider;
import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class HelloController {

    @Reference
    HelloProvider helloProvider;

    @GetMapping(value = "/api/hello")
    @ResponseBody
    public String index(@RequestParam("name") String name) {
        return helloProvider.hello(name);
    }

    @GetMapping(value = "/api/testMapList")
    @ResponseBody
    public List<Map<String, String>> testMapList() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("hello", "nacos-dubbo");
        return helloProvider.testMapList(map);
    }

}

Gitee項目地址:https://gitee.com/xiaorenwu_dashije/nacos-dubbo-demo.git

 啟動服務提供者和服務消費者,並查看注冊中心:

 

 然后測試消費者

 

 響應如下:

 

 表示整合成功,同時該接口也可以通過feign和ribbon調用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM