xmtrock
发布于 2021-06-28 / 222 阅读
0

Nacos

快速入门

依赖:

<dependencies>
    <dependency>
        <groupId>com.alibaba.nacos</groupId>
        <artifactId>nacos-client</artifactId>
        <version>1.4.2</version>
    </dependency>
</dependencies>

主类:

public class SimpleDemoMain {
    public static void main(String[] args) throws NacosException, InterruptedException {
        //nacos地址
        String serverAddr = "localhost:8848";
        //Data Id
        String dataId = "nacos-simple-demo.yaml";
        //Group
        String group = "DEFAULT_GROUP";
        //命名空间(开发环境)。最好是指定命名空间id而不是名字的
        String namespace = "2a79a8bd-be6d-4148-9b5d-130df031efa1";

        Properties properties = new Properties();
        properties.put("serverAddr", serverAddr);
        properties.put("namespace", namespace);
        ConfigService configService = NacosFactory.createConfigService(properties);

        //获取配置dataId, group, timeoutMs
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);

        //监听命名空间下配置文件的变化
        configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }

            @Override
            public void receiveConfigInfo(String s) {
                //当配置有变化 的时候获取通知
                System.out.println(s);
            }
        });

        while (true){
            Thread.sleep(2000);
        }
    }
}

可以拿到配置内容:

common:
  config1: something

对于Nacos配置管理,通过Namespace,group, DataId能够定位到一个配置集。
配置集(Data ID):就是一个配置文件,一个配置集可以包含数据库、线程池、日志级别等配置项。
配置项:配置集中的包含的一个个内容,代表一个配置项。它可以代表一个具体的可配置的参数和值域。
配置分组(Group):代表某某项目
命名空间(Namespace):可以应用于不同的开发环境上的隔离,比如开发、测试。默认是public,也可以自己创建。

登录管理

先要开启数据库登录允许,导入数据库修改配置文件

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
 spring.datasource.platform=mysql

### Count of DB:
 db.num=1

### Connect URL of DB:
 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
 db.user.0=root
 db.password.0=123456

依赖:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>5.3.9.RELEASE</version>
</dependency>

nacos使用的是BCryptPasswordEncoder方式类加密,每次生成密码都会加随机盐
实现密码加密:

public class PasswordEncoderUitl {
    public static void main(String[] args) {
        String encode = new BCryptPasswordEncoder().encode("123");
        System.out.println(encode);
    }
}

更新:已经可以通过管理控制界面直接改密码,不需要手动生成密码加密文填充数据库了
可以在配置文件中打开spring.security.enabled=true

Nacos微服务的创建、发布配置

先创建父工程:

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.2.5.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-dependencies</artifactId>
	<version>Greenwich.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-dependencies</artifactId>
	<version>2.3.7.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

子工程依赖,配置中心(如果只是作为服务发现,不需要这个)

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

application.yml(推荐yml)

spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
server:
  port: 7000

bootstrap.yml(如果只是作为服务发现,不需要这个)

spring:
  application:
    name: gulimall-coupon #和上面application.yml同名!!
  cloud:
    nacos:
      config:
        server-addr: localhost:8848 #配置中心地址

启动类,读取配置:

@SpringBootApplication
@EnableDiscoveryClient

如何获取配置?看下面

@RefreshScope  没有这个将无法动态刷新
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    // @Value("${user.name}") //取出了系统变量
     @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test() {
        return R.ok().put("name", name).put("age", age);
    }
}

注意需要在配置列表里创建一个applicationname.properties的文件配置,dataId叫应用名,而group可以暂时留空,以从中获取动态配置。
20220204004423931

细节:

1)、命名空间:配置隔离。默认:public(保留空间);默认新增的所有配置都在public空间

1、开发,测试、生产:利用命名空间来做环境隔离。
注意:需要在bootstrap.properties配置上需要使用的哪个命名空间的配置(注意是唯一id而不是名称):
spring.cloud.nacos.config.namespace=c31ea401-85f4-4495-a2d4-6455e7a047ed
2、每一个微服务之间互相隔离,每一个微服务都创建自己的命名空间,只加载自己的命名空间下的配置

2)、配置集:所有的配置的集合

3)、配置集ID:类似于文件名:Data ID(applicationname.yml/properties)

4)、配置分组:默认都在DEFAULT_GROUP。不同组可以有相同名字的配置集id

spring.cloud.nacos.config.group=1111
每个微服务创建自己的命名空间,使用配置分组来区分环境。比如dev、test、prop
一般最好是不同的微服务以命名空间区分,而不同的环境(测试、发布)以配置分组来区分

同时加载多个配置集??

首先,在配置管理里,在某一命名空间下,划分不同的方式写入配置信息
20220204020213736
20220204020225825

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=62f8157e-22f8-4a00-bfec-835b5ee84c37

spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
spring.cloud.nacos.config.extension-configs[0].group=dev
spring.cloud.nacos.config.extension-configs[0].refresh=true

spring.cloud.nacos.config.extension-configs[1].data-id=mybatis.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true

spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true

spring.cloud.nacos.config.extension-configs[3].data-id=gulimall-coupon.properties
spring.cloud.nacos.config.extension-configs[3].group=dev
spring.cloud.nacos.config.extension-configs[3].refresh=true

这个主要作用是因为spring读取配置,是bootstrap先于application,是yml先于properties
注意,如果是没有在上面指定的配置,则会读取本地的yml。
如果本地没有,就会读取nacos中的DEFAULT_GROUP
最好是加上以下语句,在缺省情况下读取里面的内容,同时也可以省略上面的[3]的东西。(它默认会扫描所有的dev)

spring.cloud.nacos.config.group=dev

nacos集群

复制多份nacos,各自设置不同的端口,绑定的ip
然后复制cluster.conf.example,绑定集群中所有的ip和端口。

#2021-06-28T22:17:42.360
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
连接方式:

server-addr: localhost:8848,loaclhost:8849,localhost:8850