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调用

 

posted @ 2020-10-12 16:35  劈天造陆  阅读(3626)  评论(0编辑  收藏  举报