spring cloud Alibaba——01 Nacos

一、安装使用

1、下载

官方下载地址

下载源码: 这是源码!这是源码!

在这里插入图片描述
下载客户端Nacos: 这个才是nacos安装包

点击上面的版本,下拉到后面就可以看到安装包
在这里插入图片描述

2、安装

将nacos-server-2.0.3.zip解压。
在这里插入图片描述
进入bin目录:
在这里插入图片描述
上面这种方式可能会报错!!!
我们使用cmd进入终端使用命令进行启动:

#启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone

如果中途卡住可以按回车
在这里插入图片描述
成功启动:
在这里插入图片描述
访问:http://localhost:8848/nacos/

  • linux启动
# 进入bin目录下
sh startup.sh -m standalone

登录账号密码,默认都为nacos

在这里插入图片描述
到此nacos安装完毕。

二、nacos入门

官方手册
spring cloud alibaba官方文档

(一)生产者

1、导入pom依赖

注意版本问题,否则会出错

可以参考:spring cloud alibaba 版本说明

  1. spring boot与spring clud的版本关系
    在这里插入图片描述

  2. spring cloud与spring cloud alibaba
    在这里插入图片描述
    在我们项目顶层(root、父项目)的POM文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

  • 父pom依赖
<dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • nacos子工程依赖
    注意:创建普通的maven项目,不要直接创建spring boot项目
<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

2、改yml配置

server.port=8001
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3、开启服务注册与发现功能

package com.lihua;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 主启动类
 * <b>@EnableDiscoveryClient:开启服务注册与发现功能</b>
 * @author 15594
 */
@SpringBootApplication
@EnableDiscoveryClient
public class Provider8001 {
    public static void main(String[] args) {
        SpringApplication.run(Provider8001.class,args);
    }
}

4、测试类

package com.lihua.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 模拟生产者(服务提供者)
 * @author 15594
 */
@RestController
public class Provider8001Controller {
    @RequestMapping("/provider")
    public String provider8001(){
        System.out.println("调用业务层成功");
        return "生产者提供服务";
    }
}

在这里插入图片描述

(二)消费者

1、导入pom依赖

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

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

        <!--这个可以不导入,因为nacos-discovery中继承了ribbon-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>-->
<!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
<!--        </dependency>-->

    </dependencies>

2、改yml配置

server.port=81
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#这个为自定义属性,指定需要调用的服务
service-url.nacos-user-service=http://service-provider

3、开启服务注册与发现

package com.lihua;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * 主启动类
 * @author 15594
 */
@SpringBootApplication
//开启服务注册与发现
@EnableDiscoveryClient
public class Consumer81 {
    public static void main(String[] args) {
        SpringApplication.run(Consumer81.class,args);
    }
}

4、配置负载均衡

package com.lihua.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 负载均衡
 * @author 15594
 */
@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced  //开启负载均衡,让消费者知道调用注册中心的那个服务(这个服务的功能一致,但在不同的服务器上)
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

5、测试类

package com.lihua.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 消费者(调用微服务)
 * @author 15594
 */
@RestController
public class Consumer81Controller {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String PAYMENT_URL;

    @RequestMapping("/consumer81")
    public String consumer81(){
        String provider = restTemplate.getForObject(PAYMENT_URL + "/provider", String.class);
        return "消费者81,消费:"+provider;
    }
}

注意:为了方便测试负载均衡,可以在新建一个生产者8002。

分别启动: 消费81、生产者8001、生产者8002
在这里插入图片描述
nacos注册中心:
在这里插入图片描述
测试:
在这里插入图片描述

(三)配置中心

1、导入pom依赖

在之前的基础上增加一个依赖

 <!--nacos-config-->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

2、改yml配置

新建一个配置文件:bootstrap.properties(名称必须为bootstrap,扩展名可以是yml、properties)

在bootstrap.properties中配置nacos config相关的配置,其他配置可以放在application.properties(重要!!!)

  • application.properties
server.port=8001
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  • bootstrap.properties(这里面的配置,后面详细讲) 。推荐先看后面的详解,再回来改yml配置
nacos 配置中心的配置可以分为两种: 一种是根据公式进行配置,一种是自定义的方式配置。

公式的方式

# nacos配置
server:
  port: 8001

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: Test_GROUP # 在nacos server用户界面中获取 
        namespace: aedc232d-98ac-4fef-ac63-46b048228751  # 在nacos server用户界面中获取, 默认的命名空间是pubic(pubic没有 命名空间id)

# 这个公式用来确定 Data ID的值  
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 根据application、bootstrap 着两个配置文件的内容得:
# spring.application.name = nacos-config-client 
# spring.profile.active = dev
# spring.cloud.nacos.config.file-extension = yaml

# data id = nacos-config-client-dev.yaml  

自定义的方式

# 配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=d597b12a-a05a-4d39-9145-d93f8e482024
# 自定义data id和分组(data id必须带扩展名,名字随意。不指定分组默认为:DEFAULT_GROUP)
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[0].group=GLOBALE_GROUP
# 是否支持动态刷新,当自定义data id 时默认不支持
spring.cloud.nacos.config.ext-config[0].refresh=true

3、主启动类不用变

/**
 * 主启动类
 * <b>@EnableDiscoveryClient:开启服务注册与发现功能</b>
 *
 * @author 15594
 */
@SpringBootApplication
@EnableDiscoveryClient
public class Provider8002 {
    public static void main(String[] args) {
        SpringApplication.run(Provider8002.class,args);
    }
}

4、核心代码

核心注解:@RefreshScope 。有了这个注解才能使用远程动态刷新配置。

package lihua.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 配置中心测试
 *
 * // @RefreshScope 支持nacos的动态刷新功能 ,只要绑定了配置中心的配置文件,就会跟随配置中心的配置文件改变而改变
 * @author 15594
 */
@RestController
@RefreshScope
public class ConfigClientController {

    /**
     * 这个属性从nacos配置中心绑定的配置文件中注入。
     * 这样就能实现远程动态刷新配置
     * */
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return "8002:"+configInfo;
    }
}

5、测试

浏览器打开:http://localhost:8001/config/info
在这里插入图片描述
当修改远程配置文件的内容:
在这里插入图片描述
再次访问,发现@Value("${config.info}")注入的配置已经发生变化:
在这里插入图片描述

6、bootstrap.properties中nacos config配置

我将nacos config的配置分为两大类。

  • 一种是根据公式创建远程配置文件。
    公式:${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
  • 一种是自定义创建远程配文件。

6.0、在解释配置前先熟悉nacos用户界面。

  1. 创建新的命名空间
    命名空间可以先理解为是用来分类的,方便我们对配置文件分类管理(可以当作:一级分类)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 创建远程配置文件:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.1、根据公式创建远程配置文件。

  1. 首先我们先来配置两个yml

在这里插入图片描述
application.yml

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: info # 表示生产环境

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: Test_GROUP # 在nacos server用户界面中获取 
        namespace: aedc232d-98ac-4fef-ac63-46b048228751  # 在nacos server用户界面中获取, 默认的命名空间是pubic(pubic没有 命名空间id)

# 这个公式用来确定 Data ID的值  
# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# 根据application、bootstrap 着两个配置文件的内容得:
# spring.application.name = nacos-config-client 
# spring.profile.active = dev
# spring.cloud.nacos.config.file-extension = yaml

# data id = nacos-config-client-dev.yaml  得到这个data id 后我们就可以去创建远程配置文件了

获得了data id后 创建远程配置文件
在这里插入图片描述
核对命名空间、组在bootstrap.yml中是否一致在这里插入图片描述

6.2、自定义的方式创建远程配置文件。

  1. 先去nacos server用户界面创建一个远程配置文件。
    在这里插入图片描述
    在这里插入图片描述

  2. 根据创建的配置文件修改bootstrap.yml

# 注意:配置中心相关的配置,必须配置在bootstrap.properties里

# 配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 指定命名空间
spring.cloud.nacos.config.namespace=aedc232d-98ac-4fef-ac63-46b048228751
# 自定义data id和分组(data id必须带扩展名,名字随意。不指定分组默认为:DEFAULT_GROUP)
spring.cloud.nacos.config.ext-config[0].data-id=my-data-id.yaml
# 指定组 ,如果不知道默认为:DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].group=Test_GROUP
# 是否支持动态刷新,当自定义data id 时默认不支持
spring.cloud.nacos.config.ext-config[0].refresh=true

# 注意:ext-config[0] 中的数字表示注册中心的配置优先级,越大优先级越高

7、nacos config(配置中心)实现远程动态更改数据源

我们通过远程配置文件修改数据源的连接信息,以更改数据库为例。

7.1、建库建表

  1. 创建两个数据库test、test1
  2. 创建一个分别创建一个一样的user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

分别在test、test1 的user表插入数据
test

INSERT INTO `user` VALUES (1, '李华', 18);
INSERT INTO `user` VALUES (2, '小明', 20);
INSERT INTO `user` VALUES (3, 'test数据库', 20);

SET FOREIGN_KEY_CHECKS = 1;

test1

INSERT INTO `user` VALUES (1, 'test1数据库', 18);

SET FOREIGN_KEY_CHECKS = 1;

7.2、导入pom依赖

<dependencies>
    <!--nacos-config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--nacos-discovery-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--web + actuator-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!--导入mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--数据源-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.9</version>
    </dependency>
</dependencies>

7.3、修改yml配置

application.yml

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: info # 表示生产环境
#  main:
#    allow-bean-definition-overriding: true # 有相同bean时覆盖

mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.lihua.config.pojo    # 所有pojo别名类所在包
  configuration:
    map-underscore-to-camel-case: true   # 驼峰命名自动映射

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: Test_GROUP
        namespace: aedc232d-98ac-4fef-ac63-46b048228751 # 默认的命名空间是pubic(pubic没有 命名空间id)

# 这个公式用来确定 Data ID的值  ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

nacos远程配置文件的内容:
在这里插入图片描述

7.4、主启动类

注意:排除spring boot自动装配的DruidDataSource bean。使用远程配置文件中的数据源配置

/**
 *
 * 主启动类
 * exclude = DataSourceAutoConfiguration.class 排除spring boot 自动帮我们配置的DruidDataSource bean,使用我们自己的
 * @author 15594
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class ConfigMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(ConfigMain3377.class,args);
    }
}

7.5、配置数据源

package com.lihua.config.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * 数据源,通过nacos远程配置文件配置
 * @author 15594
 */
@Configuration
@RefreshScope
public class DruidConfiguration {
    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    /**
     * @Primary 优先选择这个bean
     * */
    @Bean
    @RefreshScope
    public DruidDataSource dataSource(){
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        return datasource;
    }
}

7.6、常规的数据层、业务层、控制层代码

user实体类:

public class User {

  private long id;
  private String name;
  private long age;


  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }


  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }


  public long getAge() {
    return age;
  }

  public void setAge(long age) {
    this.age = age;
  }

  @Override
  public String toString() {
    return "User{" +
            "id=" + id +
            ", name='" + name + '\'' +
            ", age=" + age +
            '}';
  }
}

控制层:

/**
 * 控制层
 * @author 15594
 */
@RestController
public class UserController {

    @Autowired
    @Qualifier("UserService")
    private UserService userService;
    
    @RequestMapping("/queryUser")
    public @ResponseBody List<User> queryUser() {
        List<User> users = userService.queryUsers();
        return users;
    }
}

数据层:

/**
 * 数据层,操作用户表
 * @author 15594
 */
@Mapper
@Repository
public interface UserMapper {
    /**
     * 查询所有用户
     *
     * @return 返回所有用户的集合
     * */
    @Select("select * from user")
    List<User> queryUsers();
}

业务层:

//接口:
/**
 * 业务层
 * @author 15594
 */
public interface UserService {
    /**
     * 查询所有用户
     * @return 返回所有用户的集合
     * */
    List<User> queryUsers();
}

/**
 *
 * 业务层
 * @author 15594
 */
@Service("UserService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    public List<User> queryUsers() {
        return userMapper.queryUsers();
    }
}

7.7、测试

  1. 访问:http://localhost:3377/queryUser
    在这里插入图片描述

  2. 到nacos配置中心,修改远程配置文件
    在这里插入图片描述

  3. 再次访问:http://localhost:3377/queryUser
    在这里插入图片描述


版权声明:本文为a123123sdf原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。