一、nacos server下載下傳安裝
1.下載下傳
https://github.com/alibaba/nacos/tags
2.安裝
我就在windows上示範一下單機版。這裡下載下傳的.zip檔案
cmd startup.cmd -m standalone
通路界面:http://localhost:8848/nacos
預設賬号密碼都是nacos
此時說明啟動成功
二、nacos作為注冊中心的使用
把整個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 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>
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>
目錄
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>
項目目錄
啟動類
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>-->
<!-- <!– 排除自帶的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>
<!-- 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>
目錄
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>
項目目錄
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管理界面建立配置檔案
參數說明
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
在該命名空間下建立配置檔案app-business
然後在項目的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檔案的配置了