天天看點

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

一、nacos server下載下傳安裝

1.下載下傳

https://github.com/alibaba/nacos/tags

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用
springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

2.安裝 

我就在windows上示範一下單機版。這裡下載下傳的.zip檔案

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用
cmd startup.cmd -m standalone
           
springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

通路界面:http://localhost:8848/nacos

預設賬号密碼都是nacos

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

此時說明啟動成功 

二、nacos作為注冊中心的使用

把整個demo項目一起貼出來

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sid</groupId>
    <artifactId>springboot-dubbo-sentinel-nacos</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>business</module>
        <module>storage</module>
        <module>order</module>
        <module>account</module>
        <module>api</module>
    </modules>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.1.9.RELEASE</spring-boot.version>
        <dubbo.version>2.7.3</dubbo.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Apache Dubbo  -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Dubbo Spring Boot Starter -->
            <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</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>
    </dependencyManagement>

    <repositories>
        <repository>
            <id>apache.snapshots.https</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.1.RELEASE</version>
            </plugin>
        </plugins>
    </build>

</project>
           

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>springboot-dubbo-sentinel-nacos</artifactId>
        <groupId>com.sid</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>api</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>
           
springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用
package com.sid.rpc.service.service;

public interface AccountServiceApi {

    String debit(String userId, Double money);

    String insert(String userId, Double money);

    String setMoney(String userId, Double money);

    String deleteAccount(String userId);

}
           
package com.sid.rpc.service.service;

import com.sid.rpc.service.model.Order;

public interface OrderServiceApi {
    Order create(String userId, String commodityCode, Integer orderCount);
}
           
package com.sid.rpc.service.service;

public interface StorageServiceApi {

    String deduct(String commodityCode, int count);
}
           
package com.sid.rpc.service.model;

import java.io.Serializable;

public class Account implements Serializable {
    private String userId;

    private Double money;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId == null ? null : userId.trim();
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }
}
           
package com.sid.rpc.service.model;


import java.io.Serializable;

public class Order implements Serializable {
    private Long orderId;

    private String userId;

    private String commodityCode;

    private Integer orderCount;

    private Double orderMoney;

    private String msg;


    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId == null ? null : userId.trim();
    }

    public String getCommodityCode() {
        return commodityCode;
    }

    public void setCommodityCode(String commodityCode) {
        this.commodityCode = commodityCode == null ? null : commodityCode.trim();
    }

    public Integer getOrderCount() {
        return orderCount;
    }

    public void setOrderCount(Integer orderCount) {
        this.orderCount = orderCount;
    }

    public Double getOrderMoney() {
        return orderMoney;
    }

    public void setOrderMoney(Double orderMoney) {
        this.orderMoney = orderMoney;
    }


    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
           

account項目

 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>springboot-dubbo-sentinel-nacos</artifactId>
        <groupId>com.sid</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>account</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!-- 排除自帶的logback依賴 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!--<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Dubbo Registry Nacos -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sid</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
            <scope>runtime</scope>
        </dependency>

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

        <!-- alibaba的druid資料庫連接配接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>apache.snapshots.https</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
<!--                <version>2.0.1.RELEASE</version>-->
            </plugin>
            <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- 這樣就不用再generatorConfig.xml裡面配置本地的mysql-connector-java位置了-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
           

目錄

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

application.yml

dubbo相關參數:可以在DubboConfigurationProperties類中檢視

server:
  port: 8084

###起個名字作為服務名稱(該服務注冊到eureka注冊中心的名稱,比如訂單服務)
spring:
  application:
    name: app-account
  datasource:
    url: jdbc:mysql://localhost:3306/test-account
    username: root
    password: root
    # 使用druid資料源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver

# nacos address
nacos:
  server-address: localhost
  port: 8848

# Dubbo Application
dubbo:
  # Dubbo Protocol
  protocol:
    name: dubbo
    ## Random port
    port: -1
  ## Dubbo Registry
  registry:
    address: nacos://${nacos.server-address}:${nacos.port}
  application:
    name: ${spring.application.name}
  scan:
    base-packages: com.sid.api.service

## 該配置節點為獨立的節點,不是在在spring的節點下
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml檔案的所在路徑
  type-aliases-package: com.sid.model  # 注意:對應實體類的路徑
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #控制台列印sql

           

啟動類

package com.sid;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.sid.com.mapper")
@EnableDubbo
public class AccountApp {
    public static void main(String[] args) {
        SpringApplication.run(AccountApp.class, args);
    }
}
           

 RPCimpl

package com.sid.rpc.service;

import com.sid.rpc.service.service.AccountServiceApi;
import com.sid.service.AccountService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;


@Service(group = "account-provider", version = "1.0.0")
public class AccountServiceRpcImpl implements AccountServiceApi {

    @Autowired
    private AccountService accountService;

    /**
     * 扣錢
     * */
    @Override
    public String debit(String userId, Double money) {
        return accountService.debit(userId,money);
    }

    @Override
    public String insert(String userId, Double money){
        return accountService.insert(userId,money);
    }

    @Override
    public String setMoney(String userId, Double money){
        return accountService.setMoney(userId,money);
    }

    @Override
    public String deleteAccount(String userId){
        return accountService.deleteAccount(userId);
    }

}
           

業務邏輯service

package com.sid.service;

import com.sid.mapper.AccountMapper;
import com.sid.model.Account;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class AccountServiceImpl implements AccountService{
    @Resource
    private AccountMapper accountMapper;

    @Override
    @Transactional
    public String debit(String userId, Double money) {
        Account account = accountMapper.selectByPrimaryKey(userId);
        Double money1 = account.getMoney();
        account.setMoney(money1-money);
        int i = accountMapper.updateByPrimaryKey(account);
        if(i == 1){
            return "success";
        }
        return "fail";
    }

    @Override
    @Transactional
    public String insert(String userId, Double money){
        Account account = new Account();
        account.setUserId(userId);
        account.setMoney(money);
        int i = accountMapper.insert(account);
        if(i == 1){
            return "success";
        }
        return "fail";
    }

    @Override
    @Transactional
    public String setMoney(String userId, Double money){
        Account account = new Account();
        account.setUserId(userId);
        account.setMoney(money);
        int i = accountMapper.updateByPrimaryKey(account);
        if(i == 1){
            return "success";
        }
        return "fail";
    }

    @Override
    @Transactional
    public String deleteAccount(String userId){
        int i = accountMapper.deleteByPrimaryKey(userId);
        if(i == 1){
            return "success";
        }
        return "fail";
    }
}
           

 mapper和mapping和model是用mybatis的插件直接生成的

storage項目

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>springboot-dubbo-sentinel-nacos</artifactId>
        <groupId>com.sid</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>storage</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!-- 排除自帶的logback依賴 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <!--<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Dubbo Registry Nacos -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sid</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
            <scope>runtime</scope>
        </dependency>

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

        <!-- alibaba的druid資料庫連接配接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>apache.snapshots.https</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.0.1.RELEASE</version>
            </plugin>
            <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- 這樣就不用再generatorConfig.xml裡面配置本地的mysql-connector-java位置了-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
           

項目目錄

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

啟動類

package com.sid;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.sid.mapper")
@EnableDubbo
public class StorageApp {
    public static void main(String[] args) {
        SpringApplication.run(StorageApp.class, args);
    }
}
           

 application.yml

server:
  port: 8083

###起個名字作為服務名稱(該服務注冊到eureka注冊中心的名稱,比如訂單服務)
spring:
  application:
    name: app-storage
  datasource:
    url: jdbc:mysql://localhost:3306/test-storage
    username: root
    password: root
    # 使用druid資料源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver

# nacos address
nacos:
  server-address: localhost
  port: 8848

# Dubbo Application
dubbo:
  # Dubbo Protocol
  protocol:
    name: dubbo
    ## Random port
    port: -1
  ## Dubbo Registry
  registry:
    address: nacos://${nacos.server-address}:${nacos.port}
  application:
    name: ${spring.application.name}
  scan:
    base-packages: com.sid.api.service

## 該配置節點為獨立的節點,不是在在spring的節點下
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml檔案的所在路徑
  type-aliases-package: com.sid.model  # 注意:對應實體類的路徑
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #控制台列印sql
           

RPC實作類

package com.sid.rpc.service;


import com.sid.rpc.service.service.StorageServiceApi;
import com.sid.service.StorageService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service(group = "storage-provider", version = "1.0.0")
public class StorageServiceRpcImpl implements StorageServiceApi {

    @Autowired
    private StorageService StorageService;

    /**
     * 商品扣庫存
     * */
    @Override
    public String deduct(String commodityCode, int count) {

        return StorageService.deduct(commodityCode,count);
    }
}
           

 業務service

package com.sid.service;

import com.sid.mapper.StorageMapper;
import com.sid.model.Storage;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class StorageServiceImpl implements StorageService {

    @Resource
    private StorageMapper storageMapper;

    /**
     * 商品扣庫存
     * */
    @Override
    @Transactional
    public String deduct(String commodityCode, int count) {
        Storage storage = storageMapper.selectByPrimaryKey(commodityCode);
        Integer storageCount = storage.getStorageCount();
        storage.setStorageCount(storageCount - count);
        int i = storageMapper.updateByPrimaryKey(storage);
        //int ii = 1/0;
        if(i == 1){
            return "success";
        }
        return "fail";
    }
}
           

order項目

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>springboot-dubbo-sentinel-nacos</artifactId>
        <groupId>com.sid</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <!--            <exclusions>-->
            <!--                &lt;!&ndash; 排除自帶的logback依賴 &ndash;&gt;-->
            <!--                <exclusion>-->
            <!--                    <groupId>org.springframework.boot</groupId>-->
            <!--                    <artifactId>spring-boot-starter-logging</artifactId>-->
            <!--                </exclusion>-->
            <!--            </exclusions>-->
        </dependency>
        <!--        <dependency>-->
        <!--            <groupId>org.springframework.boot</groupId>-->
        <!--            <artifactId>spring-boot-starter-log4j2</artifactId>-->
        <!--        </dependency>-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Dubbo -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Dubbo Registry Nacos -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

        <dependency>
            <groupId>com.sid</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
            <scope>runtime</scope>
        </dependency>

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

        <!-- alibaba的druid資料庫連接配接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
    <repositories>
        <repository>
            <id>apache.snapshots.https</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- 這樣就不用再generatorConfig.xml裡面配置本地的mysql-connector-java位置了-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
           

 目錄

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

application.yml

server:
  port: 8082

###起個名字作為服務名稱(該服務注冊到eureka注冊中心的名稱,比如訂單服務)
spring:
  application:
    name: app-order
  datasource:
    url: jdbc:mysql://localhost:3306/test-order
    username: root
    password: root
    # 使用druid資料源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver

# nacos address
nacos:
  server-address: localhost
  port: 8848

# Dubbo Application
dubbo:
  # Dubbo Protocol
  protocol:
    name: dubbo
    ## Random port
    port: -1
  ## Dubbo Registry
  registry:
    address: nacos://${nacos.server-address}:${nacos.port}
  application:
    name: ${spring.application.name}
  scan:
    base-packages: com.sid.api.service

## 該配置節點為獨立的節點,不是在在spring的節點下
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml檔案的所在路徑
  type-aliases-package: com.sid.model  # 注意:對應實體類的路徑
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #控制台列印sql


# log config
logging:
  config: classpath:logback-spring.xml
           

啟動類

package com.sid;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@MapperScan("com.sid.mapper")
@SpringBootApplication
@EnableDubbo
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class, args);
    }

}
           

 RPC服務實作

package com.sid.rpc.service;


import com.sid.rpc.service.model.Order;
import com.sid.rpc.service.service.OrderServiceApi;
import com.sid.service.OrderService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service(group = "order-provider", version = "1.0.0")
public class OrderServiceRpcImpl implements OrderServiceApi {

    @Autowired
    private OrderService orderService;

    /**
     * 建立訂單
     */
    @Override
    public Order create(String userId, String commodityCode, Integer orderCount) {
        com.sid.model.Order order = orderService.create(userId, commodityCode, orderCount);
        Order o = new Order();
        o.setOrderCount(order.getOrderCount());
        o.setCommodityCode(order.getCommodityCode());
        o.setUserId(o.getUserId());
        o.setOrderMoney(order.getOrderMoney());
        o.setOrderId(order.getOrderId());
        o.setMsg(order.getMsg());
        return o;
    }
}
           

業務service中RPC調用account服務

package com.sid.service;

import com.sid.mapper.OrderMapper;
import com.sid.model.Order;
import com.sid.rpc.service.service.AccountServiceApi;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service
public class OrderServiceImpl implements OrderService{

    @Reference(check = false,group = "account-provider", version = "1.0.0")
    private AccountServiceApi accountServiceApi;

    @Resource
    private OrderMapper orderMapper;

    /**
     * 建立訂單
     */
    @Override
    @Transactional
    public Order create(String userId, String commodityCode, Integer orderCount) {
        Double orderMoney = Double.valueOf(orderCount);
        Order order = new Order();
        order.setUserId(userId);
        order.setCommodityCode(commodityCode);
        order.setOrderCount(orderCount);
        order.setOrderMoney(orderMoney);

        orderMapper.insertSelective(order);

        /**
         * 這裡的RPC調用是同步的
         * todo 需要寫個異步的例子  這個可能需要用dubbo來寫哦  feign都是同步個嘛
         * */
        String accountDebitResult = accountServiceApi.debit(userId, orderMoney);

        if (!accountDebitResult.equals("success")) {
            System.out.println("result account service :"+accountDebitResult);
            throw new RuntimeException("OrderService create method rpc request accountService debit fail. accountDebitResult:"+accountDebitResult);
        }

        order.setMsg("success");
        return order;
    }
}
           

business項目

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>springboot-dubbo-sentinel-nacos</artifactId>
        <groupId>com.sid</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>business</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
            <scope>runtime</scope>
        </dependency>

        <!-- alibaba的druid資料庫連接配接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.9</version>
        </dependency>

        <dependency>
            <groupId>com.sid</groupId>
            <artifactId>api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <!-- 排除自帶的logback依賴 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>

        <!-- Dubbo Registry Nacos -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.3</version>
        </dependency>
        
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>apache.snapshots.https</id>
            <name>Apache Development Snapshot Repository</name>
            <url>https://repository.apache.org/content/repositories/snapshots</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

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

            <!-- mybatis generator 自動生成代碼插件 -->
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.7</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <!-- 這樣就不用再generatorConfig.xml裡面配置本地的mysql-connector-java位置了-->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                        <scope>runtime</scope>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>
</project>
           

項目目錄

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

application.yml

server:
  port: 8085


###起個名字作為服務名稱(該服務注冊到eureka注冊中心的名稱,比如訂單服務)
spring:
  application:
    name: app-business
  datasource:
    url: jdbc:mysql://localhost:3306/test-business
    username: root
    password: root
    # 使用druid資料源
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
# nacos address
nacos:
  server-address: localhost
  port: 8848

# Dubbo Application
dubbo:
  # Dubbo Protocol
  protocol:
    name: dubbo
    ## Random port
    port: -1
  ## Dubbo Registry
  registry:
    address: nacos://${nacos.server-address}:${nacos.port}
  application:
    name: ${spring.application.name}
  scan:
    base-packages: com.sid.api.service

## 該配置節點為獨立的節點,不是在在spring的節點下
mybatis:
  mapper-locations: classpath:mapping/*.xml  #注意:一定要對應mapper映射xml檔案的所在路徑
  type-aliases-package: com.sid.model  # 注意:對應實體類的路徑
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #控制台列印sql

# log config
logging:
  config: classpath:logback-spring.xml

           

啟動類

package com.sid;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
@EnableDubbo
@MapperScan("com.sid.mapper")
public class BusinessApp {
    public static void main(String[] args) {
        SpringApplication.run(BusinessApp.class, args);
    }

}
           

業務service,RPC調用order服務和storage服務

package com.sid.service;

import com.sid.mapper.BusinessMapper;
import com.sid.model.Business;
import com.sid.rpc.service.model.Order;
import com.sid.rpc.service.service.OrderServiceApi;
import com.sid.rpc.service.service.StorageServiceApi;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class BusinessServiceImpl implements BusinessService{

    @Reference(check = false,group = "order-provider", version = "1.0.0")
    OrderServiceApi orderServiceApi;

    @Reference(check = false,group = "storage-provider", version = "1.0.0")
    StorageServiceApi storageServiceApi;

    @Resource
    BusinessMapper businessMapper;

    /**
     * 采購
     */
    @Transactional
    @Override
    public void purchase(String userId, String commodityCode, int orderCount) {

        Business b = new Business();
        b.setUserId(userId);
        b.setCommodityCode(commodityCode);
        b.setOrderCount(orderCount);

        int i = businessMapper.insertSelective(b);

        String storageDeductResult = storageServiceApi.deduct(commodityCode, orderCount);
        System.out.println(storageDeductResult);

        Order order = orderServiceApi.create(userId, commodityCode, orderCount);

        String orderCreateResult = order.getMsg();


        if(!storageDeductResult.equals("success") || !orderCreateResult.equals("success")){
            System.out.println("resutl storage service :"+storageDeductResult);

            System.out.println("resutl order service :"+orderCreateResult);

            throw new RuntimeException("BusinessServiceImpl purchase fail");
        }

    }

    @Override
    public Business selectByBusiness(Long businessId){
        Business business = businessMapper.selectByPrimaryKey(businessId);
        return business;
    }

    @Override
    public List<Business> selectByCommodityCode(String CommodityCode){
        List<Business> list = businessMapper.selectByCommodityCode(CommodityCode);
        return list;
    }

    @Override
    @Transactional
    public String updateOrderCountByBusinessId(Long businessId, Integer orderCount){
        Business business = new Business();
        business.setBusinessId(businessId);
        business.setOrderCount(orderCount);
        int i = businessMapper.updateByPrimaryKeySelective(business);
        if(i == 1){
            return "success";
        }
        return "fail";
    }

    @Override
    @Transactional
    public String delete(Long businessId){
        int i = businessMapper.deleteByPrimaryKey(businessId);
        if(i == 1){
            return "success";
        }
        return "fail";
    }


}
           

 三、nacos作為配置中心使用

nacos open api 

以上面那個business項目為例子,在此基礎之上做修改

pom.xml中加入一個依賴

<dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>0.2.3</version>
        </dependency>
           

application.yml加入

nacos:
  server-address: localhost
  port: 8848
  config:
    server-addr: ${nacos.server-address}:${nacos.port}
           

nacos配置類

package com.sid.config;

import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.context.annotation.Configuration;

//@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "localhost:8848"))
@NacosPropertySource(dataId = "app-business", type = ConfigType.PROPERTIES, autoRefreshed = true)
@Configuration
public class NacosConfig {

    @NacosValue(value = "${business.testConfig}", autoRefreshed = true)
    private String businessTestConfig;

    public String getBusinessTestConfig() {
        return businessTestConfig;
    }

    public void setBusinessTestConfig(String businessTestConfig) {
        this.businessTestConfig = businessTestConfig;
    }
}
           

使用nacos中的配置

package com.sid.controller;

//import com.sid.config.NacosConfig;
import com.sid.config.NacosConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
//import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

//@RefreshScope
@RestController
public class BusinessController {

    @Autowired
    NacosConfig nacosConfig;

//    @Value(value = "${business.testConfig:1}")
//    private String businessTestConfig;

    @RequestMapping(value = "business/config",method = RequestMethod.GET)
    public String config() {
//        return businessTestConfig;
        return nacosConfig.getBusinessTestConfig();
    }
}
           

在nacos管理界面建立配置檔案

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用
springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

參數說明

Data Id

Data Id的預設值為${nacos.config.prefix}-${spring.profile.active}.${nacos.config.file-extension}

nacos.config.prefix的預設值為${spring.application.name}

nacos.config.file-extension的預設值為properties

當spring.profiles.active未配置時,則比對${spring.application.name}.properties

若設定了spring.profiles.active而Nacos中存在${spring.application.name}.properties時,若還存在${spring.application.name}-${spring.profiles.active}.properties,則預設比對後者,若不存在,則會自動比對前者

由于Nacos建議且預設用spring.application.name作為Data Id的字首

Group

這是一個很靈活的配置項,并沒有固定的規定,可以用作多環境、多子產品、多版本之間區配置設定置

Namespace

推薦使用命名空間來區分不同環境的配置,因為使用

profiles

group

會是不同環境的配置展示到一個頁面,而Nacos控制台對不同的

Namespace

做了Tab欄分組展示

如果需要不同環境用不同的配置,則建立一個命名空間比如叫dev

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

在該命名空間下建立配置檔案app-business

springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用
springboot+duubo+nacos搭建一、nacos server下載下傳安裝二、nacos作為注冊中心的使用 三、nacos作為配置中心使用

然後在項目的yml中配上命名空間的ID

# nacos address
nacos:
  server-address: localhost
  port: 8848
  config:
    server-addr: ${nacos.server-address}:${nacos.port}
    namespace: 48acfc39-0299-4c3e-af1a-ecb8b24ad524  # 命名空間ID 不是命名空間名稱 以此區分dev sit pro環境
           

 這樣讀到的就是dev下面的app-business檔案的配置了

繼續閱讀