SpringCloudAlibaba系列(一)Nacos

706 阅读4分钟

这是我参与更文挑战的第 17 天,活动详情查看: 更文挑战

Nacos

一、概述

官网:https://nacos.io/zh-cn/docs/what-is-nacos.html

注册中心和配置中心

二、环境配置

下载安装

  • 下载Nacos:https://github.com/alibaba/nacos/releases
  • 启动Nacos:在解压后的文件夹bin目录下使用命令启动 cmd startup.cmd -m standalone,standalone(非集群启动)
  • 访问http://localhost:8848/nacos,访问主界面,账号密码为nacos

依赖

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

配置

server:
  port: 9001
spring:
  application:
    name: nacos-provider-payment
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   # nacos配置中心地址
management:   # 暴露监控地址
  endpoints:
    web:
      exposure:
        include: '*'

主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

启动服务后,在nacos主页就可以看到当前服务。

三、Nacos负载均衡

根据9001Copy一个9011服务用来提供服务。

创建一个服务的消费者cloudalibaba-consumer-nacos-order83

依赖同上

配置文件

server:
  port: 83
spring:
  application:
    name: nacos-consumer-order
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   # nacos配置中心地址

service-url:  #可选,用户访问的微服务名称,方便后面使用服务的路径
  nacos-user-service: http://nacos-provider-payment

config和Controller

@SpringBootConfiguration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

@RestController()
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    //从配置文件读取微服务名称
    @Value("${service-url.nacos-user-service}")
    private String serverUrl;

    @GetMapping("/consumer/nacos/getPort/{id}")
    public String paymentInfo(@PathVariable("id") String id) {
        return restTemplate.getForObject(serverUrl + "/nacos/getPort/" + id, String.class);
    }
}

因为Nacos自带Ribbon,所以天生就有负载均衡的能力,现在访问http://localhost:83/consumer/nacos/getPort/1,就会轮询访问9001和9011两个服务。

支持AP和CP切换

A保证可用性,C保证数据一致性。

如果不需要存储服务级别的消息且服务实例是通过nacos-client注册,并且能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring Cloud 和 Dubbo。

如果需要在服务级别编辑或者存储信息,那么CP是必须的,如K8S服务和DNS服务。

模式切换:

curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

四、Nacos之服务配置中心

新建cloudalibaba-config-nacos-client3377,导入依赖

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

使用两个配置文件,一个application和一个更高级别的bootstrap

application.yml

spring:
  profiles:
    active: dev

bootstrap,yml

server:
  port: 3377
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   # nacos配置中心地址
      config:
        server-addr: 127.0.0.1:8848 # nacos作为配置中心
        file-extension: yaml      # 指定配置文件格式

在nacos主界面添加配置文件

image-20201216103027882

注意:Data ID 的格式为${prefix}-${spring.profiles.active}.${file-extension},如按照上面的配置就是nacos-config-client-dev.yaml

添加一个Controller就可以访问到对应的配置文件了

@RestController
@RefreshScope       //通过Spring Cloud 原生注解实现配置自动刷新
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

已经配置RefreshScope注解,所以自带动态刷新。

五、Nacos之命名空间(NamesPace)、DataID、分组

Nacos默认的NamesPase是Public,NamesPase主要用来实现隔离。根据不同的开发环境进行隔离。

Group可以把不同的微服务划分到同一个组。

Service就是微服务,一个Service可以包含多个微服务也就是集群(Cluster)。

Instance就是微服务的实例。

image-20201216104449629

DataID方案

application.yml中配置的dev环境,DataID 也是 xxxxx-dev.yaml,新建一个nacos-config-client-test.yaml,把application.yml中的active改为test,同样获取到对应DataID的配置内容。

Group方案

默认为DEFAULT_GROUP

image-20201216105358413

也可以根据分组不同获取不同的配置信息。新增一条Group为DEV_GROUP的配置,配置文件的config加一个group的配置。

config:
  server-addr: 127.0.0.1:8848 # nacos作为配置中心
  file-extension: yaml      # 指定配置文件格式
  group: DEV_GROUP

NamesPace方案

在nacos住界面新增命名空间,会生成一个命名空间id

image-20201216110749310

在配置文件的config中添加一个namespace配置

config:
  server-addr: 127.0.0.1:8848 # nacos作为配置中心
  file-extension: yaml      # 指定配置文件格式
  group: DEV_GROUP
  namespace: 9ed7b1a9-6220-4bc5-b271-e39df2651aa8

现在访问的配置文件就是9ed7b1a9-6220-4bc5-b271-e39df2651aa8命名空间下的DEV_GROUP分组中DataID为nacos-config-client-dev.yaml的配置及文件。

六、Nacos集群和持久化配置

官方说明https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

Nacos数据库切换

Nacos自带的是一个嵌入式数据库derby,需要把数据库切换为MySQL。

  • 在conf文件夹下找到nacos-mysql.sql,运行SQL
  • 修改application.properties文件,修改项参考https://nacos.io/zh-cn/docs/deployment.html
  • 重启nacos,嵌入式数据库已经切换为MySQL数据库。

Linux下配置Nacos集群配合Nginx

修改cluster.conf
172.20.102.156:3333
172.20.102.156:4444
172.20.102.156:5555

注意:172.20.102.156通过hostname -i获得

修改startup.sh

image-20201221150731928

image-20201221150811254

如果内存太小无法启动三台Nacos,修改此处

image-20201221150848843

修改nginx.conf配置

image-20201221151106349

启动Nacos
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
# 查看启动成功了多少
ps -ef | grep nacos | grep -v grep | wc -l
启动Nginx

./nginx

测试

创建一个cloudalibaba-provider-payment9002服务

配置文件

server:
  port: 9002
spring:
  application:
    name: nacos-provider-payment
  cloud:
    nacos:
      discovery:
        server-addr: 47.95.226.96:1111   # nacos配置中心地址
management:   # 暴露监控地址
  endpoints:
    web:
      exposure:
        include: '*'

访问http://Linux地址:1111/nacos