官方文档:

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Nacos服务注册与配置中心

Nacos简介

为什么叫Nacos

前四个字母分别为Naming,Configuration的前两个字母,最后s为Service。

是什么?

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
注册中心+配置中心的组合。即 Nacos=Eureka+Config+Bus.

能干啥?

代替Eureka做服务注册中心
代替Config做服务配置中心

官网: https://naocs.io

Nacos安装并运行

  • 下载地址 https://github.com/alibaba/nacos/releases/tag/1.3.2
  • 运行解压后bin文件夹下startup.cmd startup.cmd -m standalone
  • 访问:http://localhost:8848/nacos 默认用户名密码:nacos

    服务注册

    将服务提供者9001、9002和消费者Order83注册进Nacos

    服务提供者9001和9002

    pom

    1. <!-- SpringCloud ailibaba nacos-->
    2. <dependency>
    3. <groupId>com.alibaba.cloud</groupId>
    4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    5. </dependency>

    父pom 配置alibaba-nacos版本号

    <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>com.alibaba.cloud</groupId>
                  <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                  <version>${spring.cloud.alibaba.version}</version>
                  <type>pom</type>
                  <scope>import</scope>
              </dependency>
          </dependencies>
      </dependencyManagement>
    

    yaml

    server:
    port: 9001
    spring:
    application:
      name: nacos-payment-provider
    cloud:
      nacos:
        discovery:
          server-addr: 127.0.0.1:8848
    management:
    endpoints:
      web:
        exposure:
          include: "*"
    

    主启动

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

    controller

    @RestController
    public class PaymentController {
    
      @Value("${server.port}")
      private String serverPort;
    
      @GetMapping(value = "/payment/nacso/{id}")
      public String getpayment(@PathVariable("id") Integer id) {
          return "Hello Nacos Discovery " + id+"\t port:"+serverPort;
      }
    }
    

    服务消费者Order83

  • pom:同上9001和9002

  • yaml ```yaml server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos:
    discovery:
      server-addr: 127.0.0.1:8848
    

消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者

service-url: nacos-user-service: http://nacos-payment-provider


- Controller
```java
@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}") //消费者地址
    private String serverURL;

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

}
  • Config

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

    测试

    image.png
    image.png

    结论: Nacos集成Rabbon,即自带负载均衡。

    选择使用何种模式?(Nacos可以切换AP,CP两种模式)

    image.png
    CAP: 强一致性、高可用性、分区容错性

  • 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并且能够保持心跳,那么就选择AP模式。

  • 如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DBS服务则更适用于CP模式。

Nacos切换命令:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switcches?entry=serverMode$value=CP'

配置中心

创建微服务CloudAlibaba-config-nacos-client3377

  • POM:

    <!-- nacos config-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- SpringCloud ailibaba nacos-->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  • bootstarp.yml ```yaml server: port: 3377 spring: application: name: nacos-config-client cloud: nacos:

    discovery:
      server-addr: localhost:8848
    config:
      server-addr: localhost:8848
      file-extension: yaml #指定yml格式
    

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}


- Application.yml
```yaml
spring:
  profiles:
    active: dev #开发环境
  • Controller类 添加@RefreshScope开启动态刷新配置

    @RestController
    @RefreshScope //支持Nacos的动态刷新功能
    public class ConfigClientController {
    
      @Value("${config.info}")
      private  String configInfo;
    
      @GetMapping("/config/info")
      public String getConfigInfo(){
          return configInfo;
      }
    }
    
  • 启动类:

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

    image.png
    注:
    获取失败重启Nacos
    Nacos支持动态刷新,不用像bus一样需要运维人员post刷新。

    Nacos分类配置

    问题:

    实际开发中,通常会有dev、test、prod等环境,如何保证指定环境启动时服务器能够正确读取到Nacos中相应的配置文件呢?

    Namespace+Group+Data ID三者的关系,为什么这么设计。

  • DataID方案:

    • 指定spirng.profile.active和配置文件的DataID来使不同环境下读取不同的配置。
    • 默认空间+默认分组+新建dev和test两个DataID.
    • 通过spring.profile.ativiti属性就能进行多环境下配置文件的读取。 配什么就加载什么
  • Group方案:
    • 通过Group实现环境区分,新建Group
    • 在nacos图形界面控制台上新建文件DataID
    • 在bootstarp中config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP
  • Namespace方案
    • 新建dev/tset的namespace
    • 在bootstrap中config下增加一条namespace:加命名空间id

      Nacos集群和持久化配置

      Nacos支持三种部署模式

  1. 单机模式:用于测试和单机使用
  2. 集群模式:用于生产环境,确保高可用
  3. 多集群模式:用于多数据中心场景

    Nacos持久化配置解释

  • Nacos自带默认是嵌入式数据库derby
  • Derby到mysql切换配置步骤

    • 运行conf下的nacos-mysql.sql文件。
    • 修改conf下application.properties文件
      1.安装数据库,版本要求:5.6.5+
      2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
      3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
      spring.datasource.platform=mysql
      db.num=1
      db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
      db.user=root
      db.password=root
      

      使用Docker部署Nacos集群

      环境配置

      Docker version 1.13.1
      Nacos version 1.2.1
      Mysql version 5.7
      Nginx version lastest

      镜像拉取

      Nacos: docker pull nacos/nacos-server
      Nginx: docker pull nginx
      Mysql: docker pull mysql:5.7

      容器启动

      Mysql启动:
      docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
      Nacos启动:
  • 创建挂载文件路径

mkdir -p /usr/local/nacos/logs
mkdir -p /usr/etc/nacos/conf

  • 复制nacos配置目录到宿主机(或从其他地方复制需要application.properties、cluster.conf)

docker cp 18fa206c4883:/home/nacos/conf /usr/etc/nacos/conf

  • 三个nacos部署在同一台服务器上,服务器ip:192.168.1.131,将8846、8847、8848三个端口分别映射到三个docker容器,自己根据实际情况自行调整,修改jvm参数大小

    ```java

    创建三个nacos容器

    docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8848 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8848:8848 \ nacos/nacos-server:1.2.1

docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8847 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8847:8847 \ nacos/nacos-server:1.2.1

docker run -d \ -e PREFER_HOST_MODE=hostname \ -e MODE=cluster \ -e NACOS_SERVER_PORT=8846 \ -e NACOS_SERVERS=”192.168.1.131:8846 192.168.1.131:8847 192.168.1.131:8848” \ -e SPRING_DATASOURCE_PLATFORM=mysql\ -e MYSQL_SERVICE_HOST=192.168.1.131\ -e MYSQL_SERVICE_PORT=3306\ -e MYSQL_SERVICE_USER=root\ -e MYSQL_SERVICE_PASSWORD=123456\ -e MYSQL_SERVICE_DB_NAME=nacos_config\ -e NACOS_SERVER_IP=192.168.1.131 \ -e JVM_XMS=256m -e JVM_XMX=512m \ -v /usr/local/nacos/logs1:/home/nacos/logs \ -v /usr/etc/nacos/conf:/home/nacos/conf \ -p 8846:8846 \ nacos/nacos-server:1.2.1


- 访问 http://119.3.160.59:8846/nacos
<a name="jT2mE"></a>
#### Nginx配置nacos的统一入口
[https://blog.csdn.net/BDawn/article/details/106234675](https://blog.csdn.net/BDawn/article/details/106234675)<br />**docker启动nginx**<br />docker run --name my-nginx -v /root/docker/nginx/nginx.conf:/etc/nginx.nginx.conf:ro -p 8080:8080 -d nginx<br />-v  /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro :挂载nginx中的配置文件。<br />-p 8080:8080 :映射8080端口<br />**nginx主要配置信息:**

upstream cluster{ server 192.168.1.131:8846; server 192.168.1.131:8847; server 192.168.1.131:8848; } server { listen 8080; server_name localhost;

    location / {
        proxy_pass http://cluster;//转发到cluster上的地址
    }
}

``` 配置修改之后注意重启nginx
全部配置成功就可以通过8080端口访问nacos http://xxxx:8080