首页 > 其他分享 >Nacos入门

Nacos入门

时间:2023-02-01 00:24:56浏览次数:49  
标签:Nacos 入门 spring 配置 boot nacos server

1、介绍

①概要

官网:home (nacos.io)

Nacos:Dynamic Naming and Configuration Service(动态命名和配置服务)

你可以看为:Eureka(注册中心)+Config(配置中心)+Bus(消息总线)

Nacos的支持模式:AP或者CP

20200619192453900

image-20230122011917201

②用处

  1. 替代Eureka作为注册中心
  2. 替代Config作为配置中心

2、安装

下载安装Nacos,我使用2.2.0。教学视频还在使用1.x版本,官网已经将2.x标为推荐了

安装包地址:

Releases · alibaba/nacos (github.com)

我使用docker进行安装:

docker网站:nacos/nacos-server - Docker Image | Docker Hub

docker pull nacos/nacos-server

image-20230121225427323

docker运行Nacos:

docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server

image-20230121225514635

查看Nacos控制台:

账号和密码都是nacos

http://服务器ip:8848/nacos/#/login

image-20230121225824391

3、Nacos做注册中心

①版本问题

我们之前使用的Springboot都是2.2.2版本:

image-20230121230629007

Springcloud Alibaba对于版本有着清晰的描述:

所以我们使用2.1.xRELEASE

image-20230121230719885

如果你的版本不同,可以参考下面的网址:

版本说明 · alibaba/spring-cloud-alibaba Wiki (github.com)

②Provider

新建模块cloudalibaba-provider-payment9001

image-20230121230356100

依赖:

<dependencies>
    <!--SpringCloud Alibaba nacos-->
    <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-web</artifactId>
    </dependency>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </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>
</dependencies>

yml:

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: Nacos安装ip:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)

#actuator
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类:

@EnableDiscoveryClient
@SpringBootApplication
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("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos registry, serverPort: " + serverPort + "\t id: " + id;
    }

}

启动Provider,测试:

image-20230121231307994

搭建另一个个Provider吧,端口为9002,后面要用到

image-20230121231726992

③Consumer(Ribbon)

新建模块cloudalibaba-consumer-nacos-order83

依赖:

<dependencies>
    <!--SpringCloud Alibaba nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
    <dependency>
        <groupId>cn.zko0.cloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <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>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </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>
</dependencies>

yml:

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 101.43.244.40:8848  #配置的Nacos地址(本机的写localhost:8848,服务器的写IP地址)


#消费者要访问的微服务名称(成功注册进nacos的服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类:

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

这里我们还是用RestTemplate,后面再整合Feign:

注:新的Nacos已经不整合ribbon,所以如果新版本要使用,需要Loadbalance依赖,或者使用openFeign

使用Ribbon需要加上@LoadBalanced

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

Controller:

@Slf4j
@RestController
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

    //从配置文件里读取serverURL
    @Value("${service-url.nacos-user-service}")
    private String serverUrl;

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

}

启动,测试:

image-20230122003059110

image-20230122004010967

④Consumer(Feign)

将上面的Consuemr更改为Feign的调用方式:

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

注掉config类中的Configuration类,不使用RestTemplate

主启动类:

@EnableFeignClients,激活feign

Service接口:

@Component
@FeignClient(value = "nacos-payment-provider")
public interface PaymentFeignService {

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Long id);

}

修改Controller:

@Slf4j
@RestController
public class OrderNacosController {

//    @Resource
//    private RestTemplate restTemplate;
//    //从配置文件里读取serverURL
//    @Value("${service-url.nacos-user-service}")
//    private String serverUrl;
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id")Long id){
        String payment = paymentFeignService.getPayment(id);
        return payment;
        //return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
    }
}

启动,测试,成功:

image-20230122011324968

4、Nacos做配置中心

①基础配置

一.Client(不分Provider和Consumer)

新建模块cloudalibaba-config-nacos-client3377

依赖:

<dependencies>
    <!-- nacos config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <!--SpringCloud Alibaba nacos-->
    <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-web</artifactId>
    </dependency>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </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>
</dependencies>

bootstrap.yml:

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: ip:8848 #Nacos服务注册中心地址(本机的写localhost)
      config:
        server-addr: ip:8848 #Nacos作为配置中心地址(本机的写localhost)
        file-extension: yml #指定yml格式配置

启动类:

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

二.Nacos匹配规则

文档:Nacos 融合 Spring Cloud,成为注册配置中心

image-20230122230227844

官网的配置要求:

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

根据官网的要求,配置名为:

nacos-config-client-dev.yml

三.Nacos配置发布和更新:

Nacos控制台添加配置,发布:

image-20230122230707390

运行3377,测试:

image-20230122230824321

修改version为2,发布,查看配置动态刷新,成功:

image-20230122230928192

②分类配置概念

Nacos的配置通过Namespace+Group+Data ID三者共同构建

设计思想:类似Java中的包名和类名

  • NameSpace用于区分部署的环境

  • Group和DataID逻辑上区分两个目标对象

默认:

Namespace=public,Group=DEAFAULT_GROUP,默认Cluster为DEFAULT

image-20230122231823975

上图的Service就是微服务(整体),一个Service可以有多个Cluster(集群)

Nacos默认Cluster是DEFAULT,Cluster是对一个指定微服务的虚拟划分,比如Service有两个集群,分别在上海和南京。

如上图,Cluster1起名称叫做SH(代表上海的集群),Cluster2起名NJ(代表南京的集群),这样可以让一个机房微服务互相调用。

Instance就是微服务实例,比如Provider实例和Consumer实例

③分类配置实操

一.通过DataID配置(最小)

通过DataID来区别配置:devtest

上面我们配置了dev的配置,下面我们再配置一个test,方法同上次配置。

1.修改nacos配置

image-20230131154922966

2.修改client的active指定

spring:
  profiles:
    active: test #表示开发环境 dev和test

3.测试,成功:

image-20230131155005636

二.通过Group配置(中)

1.新建配置nacos-config-client-info.yml,设置组为TEST_GROUP

image-20230131164946544

可以看到如果不设置GROUP,默认为DEFAULT_GROUP

image-20230131165013803

2.client项目bootstrap.yml设置gruop配置

image-20230131165149345

3.application.yml修改info(为了对应上面nacos的info)

image-20230131165219208

4.重启测试,成功:

image-20230131165303800

三.通过NameSpace配置(最大)

1.在nacos上新建命名空间:dev和test

image-20230131165837856

2.配置完命名空间后能够看到配置管理的信息:

image-20230131172103472

3.在dev的namespace中创建配置,稍微修改前面的配置:

image-20230131174633758

4.测试:

image-20230131174732309

5、Nacos集群和持久化(重点)

Nacos使用嵌入式的数据库(derby)实现数据的存储,在多节点下,数据存在一致性问题

在前面,我们重启Nacos,数据仍然保留的(就类似于QQ使用SqlLite)

如何解决???

Nacos可以使用集中存储的方式支持集群化部署,目前仅支持Mysql(0.7版本后支持)

image-20230131190702151

①单节点环境搭建

单间点使用Mysql,首先演示解决数据一致性使用Mysql操作

一.环境版本(请务必对应!!)

如果你使用错误的版本会出现许多的问题

经过查询:1.4.0以下使用的mysql驱动是8.0以下的,1.4.0以上使用的驱动就是8.0以上的,使nacos和数据库的版本对应。

  • Mysql8.0

  • Nacos2.2

二.Mysql安装

1.安装启动

 sudo docker run -d -p 3306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name  mysql mysql:8

2.获取数据库初始化sql脚本mysql-schema.sql

在linux上创建/data/conf文件夹后面使用

docker cp nacos-standalone:/home/nacos/conf/mysql-schema.sql /data/nacos/mysql-schema.sql

该脚本保存至/data/conf下

3.运行sql脚本

image-20230131230013719

三.Nacos配置

注:如果你在这里出错了,容器无法运行,你也无法进入容器修改配置文件。

所以我推荐你使用挂载的方式来运行nacos

下面我们会使用到Nacos的application.properties配置文件,将这个文件挂载到外部,你可以使用我的nacos配置文件,免除启动临时容器复制的麻烦

查看你的nacos版本是否与我一致:2.2.0

image-20230131214924970

application.properties 放在/datat/nacos下

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

1.创建Nacos容器

docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=256m -e JVM_XMX=256m -e JVM_XMN=128m -p 8848:8848 -v /data/nacos/application.properties:/home/nacos/conf/application.properties -d nacos/nacos-server

2.修改application.properties配置文件

Nacos官网配置信息:

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

image-20230131230115070

3.重启Nacos

4.测试:

在Nacos上配置

image-20230131230044683

查看数据库是否更新

image-20230131230144206

成功!!!

②集群搭建

一.软件与版本

因为我的服务器比较拉,三台肯定顶不住,所以在此仅搭建两台,如果你的服务器牛,可以搭三台

Nginx

Nacos2.2 (两台)

Mysql8

二.Nacos搭建

启动第一台nacos

docker run -d \
--name nacos_11 \
--hostname=nacos_11 \
-e MODE=cluster \
-e NACOS_SERVERS="101.43.244.40:3333 101.43.244.40:4444" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=101.43.244.40 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=128m \
-e JVM_XMX=128m \
-e JVM_XMN=64m \
-p 3333:8848 nacos/nacos-server

启动第二台nacos

docker run -d \
--name nacos_22 \
--hostname=nacos_22 \
-e MODE=cluster \
-e NACOS_SERVERS="101.43.244.40:3333 101.43.244.40:4444" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=101.43.244.40 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e JVM_XMS=64m \
-e JVM_XMX=64m \
-e JVM_XMN=32m \
-p 4444:8848 nacos/nacos-server

三.Nginx

配置Nginx1.16.1

这里我拉取的镜像是Nginx1.16.1。

#启动nginx容器(对外暴露1111端口)
docker run -d --name nginx1.16.1 -p 1111:80 nginx:1.16.1

进入nginx容器,修改配置

因为nginx容器没有装vim,所以我们要先安装vim

apt-get update
apt-get install vim

备份nginx.conf文件

cp nginx.conf nginx.conf.bk

修改nginx.conf文件

upstream cluster{
	server 10.211.55.17:3333;
	server 10.211.55.17:4444;
}

server{
	listen		80;
	server_name	101.43.244.40;
	
	location / {
		proxy_pass	http://cluster;
	}
}

四.修改Client

修改client,使用nginx虚拟地址,让nginx转发给三台Nacos,实现注册到Nacos

image-20230131234920081

标签:Nacos,入门,spring,配置,boot,nacos,server
From: https://www.cnblogs.com/zko0/p/17081215.html

相关文章

  • 大数据实时多维OLAP分析数据库Apache Druid入门分享-上
    @目录概述定义MPP和Lambda补充说明概述特征适用场景不适用场景横向对比部署单机部署入门示例概述定义ApacheDruid官网地址https://druid.apache.org/ApacheDruid......
  • drf从入门到精通02
    昨日回顾#1web应用开发模式 -前后端混合:bbs项目,图书管理---->模板语法--->后端通过模板语法把模板【xx.html】-前后端分离:后端,不需要写前端,只需要提供接口......
  • Java快速入门
    初学者快速学习Java1-介绍2- 创建Java工程3- 原始数据类型4- 变量5-控制流程5.1- if-else语句5.2- 一般操作符5.3-布尔值5.4- switch-case-defau......
  • Solidity极简入门#5. 变量数据存储和作用域
    Solidity中的引用类型引用类型(ReferenceType):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间......
  • Docker部署Nacos自动停止运行
    1、现象使用docker部署的Nacos在运行一段时间后,就自动停止运行了。查看docker运行容器,nacos停止了2、解决因为是学生购买的轻量级服务器,所以配置很低,出现这种问题我默......
  • Elasticsearch 从入门到实践 小册笔记
    MappingJSON中是可以嵌套对象的,保存对象类型可以用object类型,但实际上在ES中会将原JSON文档扁平化存储的。假如作者字段是一个对象,那么可以表示为:{"author":{......
  • drf入门规范——restful规范,序列化反序列化,django原生接口与drf接口案例
    restful规范(重要)概念REST全称是RepresentationalStateTransfer,中文意思是表述(编者注:通常译为表征性状态转移)。它首次出现在2000年RoyFielding的博士论文中。RESTful......
  • Unicorn快速入门
    看James给的SPIR-V看麻了,转过来快速入门一下unicorn。早该学学了。官网:https://www.unicorn-engine.org/(搞完这个继续看SPIR-V(确信))简介与安装Unicorn是一个基于QEMU的......
  • 内网渗透入门(一)
    通过sql注入拿到webshellintooutfile导出文件intodumpfile导出文件将查询的结果导出成文件如何找路径?————传入错误参数,就会爆出路径写入一句话木马,连接菜刀......
  • python入门灵魂5问
    --python学习路线,python教程,python学哪些,python怎么学,python学到什么程度一、Python入门简介对于刚接触python编程或者想学习python自动化的人来说,基本都会有以下python入......