Nacos入门

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

posted @   yikolemon  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 我与微信审核的“相爱相杀”看个人小程序副业
点击右上角即可分享
微信分享提示