Spring Cloud Alibaba 整合Nacos和Dubbo
- 作者:
 - 淡白
 - 创建时间:
 - 2020-06-04 16:18:25
 - Spring Cloud Alibaba nacos dubbo
 
摘要:Spring Cloud Alibaba是一个提供微服务开发解决方案的项目,包含了分布式应用微服务开发所需要的组件。它基于Spring Cloud编程模型,通过添加一些注解和配置,可以将Spring Cloud应用接入阿里微服务解决方案,快速搭建分布式应用系统。其中,Nacos是一种服务发现、配置和管理的工具,而Apache Dubbo是一款高性能的Java RPC框架。在搭建项目时,需要创建多个模块,包括API模块、服务提供者模块和消费者模块。具体的配置包括根POM.xml配置、Nacos依赖配置、Dubbo依赖配置、起始依赖(spring-cloud-alibaba-starter)配置,以及各个模块的POM.xml和配置文件的配置。使用Nacos作为配置中心,可以在Nacos的配置列表中上传配置文件,并在消费者和提供者模块中添加bootstrap.yaml文件进行配置。可以通过访问http://localhost:8002/demo来测试项目的功能。
Spring Cloud Alibaba
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
Nacos
什么是 Nacos?
服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。
Nacos官网
Apache Dubbo
Apache Dubbo™ 是一款高性能Java RPC框架。
Apache Dubbo
搭建项目
项目结构
├─ demo
│   ├─ demo-api #api
│   ├─ demo-consumer #消费者
│   ├─ demo-provider #提供者
│   └─ pom.xml
├─ dubbo 
│   └─ pom.xml #dubbo依赖
├─ nacos
│   └─ pom.xml #nacos依赖
├─ spring-cloud-alibaba-starter 起始依赖
│   └─ pom.xml
└─ pom.xml
根POM.xml
基于spring-boot 2.3.0RELEASE﹑spring-cloud-alibaba2.2.1.RELEASE
<?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>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>cn.p00q</groupId>
    <artifactId>spring-cloud-alibaba-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>spring-cloud-alibaba-parent</name>
    <description>微服务结构项目</description>
    <properties>
        <java.version>1.8</java.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-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
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">
    <parent>
        <artifactId>spring-cloud-alibaba-parent</artifactId>
        <groupId>cn.p00q</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>nacos</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>
Dubbo依赖
<?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">
    <parent>
        <artifactId>spring-cloud-alibaba-parent</artifactId>
        <groupId>cn.p00q</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>dubbo</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>
</project>
起始依赖(spring-cloud-alibaba-starter)
<?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">
    <parent>
        <artifactId>spring-cloud-alibaba-parent</artifactId>
        <groupId>cn.p00q</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-cloud-alibaba-starter</artifactId>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>dubbo</artifactId>
            <version>${parent.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>nacos</artifactId>
            <version>${parent.version}</version>
        </dependency>
    </dependencies>
</project>
正式Demo项目开始
Api
package cn.p00q.cloud.demo.api;
/**
 * @program: AlibabaCloud
 * @description: 例子Api
 * @author: DanBai
 * @create: 2020-06-02 20:09
 **/
public interface DemoService {
    /**
     * 返回信息
     * @param name
     * @return
     */
    String echo(String name);
}
服务提供者
pom.xml
<?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">
    <parent>
        <artifactId>demo</artifactId>
        <groupId>cn.p00q</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>demo-provider</artifactId>
    <dependencies>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>spring-cloud-alibaba-starter</artifactId>
            <version>${parent.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>demo-api</artifactId>
            <version>${parent.version}</version>
        </dependency>
    </dependencies>
</project>
实现接口
Service接口是org.apache.dubbo.config.annotation.Service包下的
package cn.p00q.cloud.demo.service.impl;
import cn.p00q.cloud.demo.api.DemoService;
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.rpc.RpcContext;
/**
 * @program: AlibabaCloud
 * @description: DemoService实现
 * @author: DanBai
 * @create: 2020-06-02 20:39
 **/
@Service
public class DemoServiceImpl implements DemoService {
    @Override
    public String echo(String name) {
        RpcContext rpcContext = RpcContext.getContext();
        return String.format("Service [name :%s , port : %d] %s(\"%s\") : Hello,%s",
                "demo",
                rpcContext.getLocalPort(),
                rpcContext.getMethodName(),
                name,
                name);
    }
}
启动类
package cn.p00q.cloud.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * @program: AlibabaCloud
 * @description: demo提供应用
 * @author: DanBai
 * @create: 2020-06-02 20:35
 **/
@EnableDiscoveryClient
@SpringBootApplication
public class DemoProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoProviderApplication.class, args);
    }
}
配置
dubbo:
  protocol:
    name: dubbo #通信协议 
    port: -1 #端口自增
  registry:
    address: nacos://127.0.0.1:8848 #nacos服务器地址
  scan:
    base-packages: cn.p00q.cloud.demo.service.impl #扫描服务包路径
server:
  port: 8001
spring:
  application:
    name: demo-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #nacos服务器地址
消费者
pom.xml
<?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">
    <parent>
        <artifactId>demo</artifactId>
        <groupId>cn.p00q</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>demo-consumer</artifactId>
    <dependencies>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>spring-cloud-alibaba-starter</artifactId>
            <version>${parent.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.p00q</groupId>
            <artifactId>demo-api</artifactId>
            <version>${parent.version}</version>
        </dependency>
    </dependencies>
</project>
调用服务
package cn.p00q.cloud.demo.controller;
import cn.p00q.cloud.demo.api.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @program: AlibabaCloud
 * @description: Demo
 * @author: DanBai
 * @create: 2020-06-03 10:18
 **/
@RestController
public class DemoController {
    @Reference
    DemoService demoService;
    @GetMapping("/demo")
    public String getDemo(){
        return demoService.echo("danbai");
    }
}
启动类
package cn.p00q.cloud.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * @program: AlibabaCloud
 * @description: demo消费者启动类
 * @author: DanBai
 * @create: 2020-06-03 10:13
 **/
@EnableDiscoveryClient
@SpringBootApplication
public class DemoConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoConsumerApplication.class, args);
    }
}
配置
dubbo:
  cloud:
    subscribed-services: demo-provider
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://127.0.0.1:8848
server:
  port: 8002
spring:
  application:
    name: demo-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
启动两个提供者 一个消费者
访问http://localhost:8002/demo
Service [name :demo , port : 20880] echo("danbai") : Hello,danbai
刷新
Service [name :demo , port : 20881] echo("danbai") : Hello,danbai
dubbo均衡负载
Nacos配置中心
在Nacos项目下的pom.xml增加依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
上传配置
登录nacos后台,进入配置列表在public命名空间下添加配置。
Data ID分别为demo-provider-dev.yaml和demo-consumer-dev.yaml。
组默认DEFAULT_GROUP
把各自的application.yaml添加进去
配置修改
在消费者和提供者resources目录下添加bootstrap.yaml文件
spring:
  application:
    name: demo-provider #消费者为demo-consumer
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  profiles:
    active: dev
完成配置