1、介绍
①概要
Nacos:Dynamic Naming and Configuration Service(动态命名和配置服务)
你可以看为:Eureka(注册中心)+Config(配置中心)+Bus(消息总线)
Nacos的支持模式:AP或者CP
②用处
- 替代Eureka作为注册中心
- 替代Config作为配置中心
2、安装
下载安装Nacos,我使用2.2.0。教学视频还在使用1.x版本,官网已经将2.x标为推荐了
安装包地址:
我使用docker进行安装:
docker网站:nacos/nacos-server - Docker Image | Docker Hub
docker pull nacos/nacos-server
docker运行Nacos:
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
查看Nacos控制台:
账号和密码都是nacos
http://服务器ip:8848/nacos/#/login
3、Nacos做注册中心
①版本问题
我们之前使用的Springboot都是2.2.2版本:
Springcloud Alibaba对于版本有着清晰的描述:
所以我们使用2.1.xRELEASE
如果你的版本不同,可以参考下面的网址:
版本说明 · alibaba/spring-cloud-alibaba Wiki (github.com)
②Provider
新建模块cloudalibaba-provider-payment9001
依赖:
<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,测试:
搭建另一个个Provider吧,端口为9002,后面要用到
③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);
}
}
启动,测试:
④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);
}
}
启动,测试,成功:
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,成为注册配置中心
官网的配置要求:
在 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
来配置。目前只支持properties
和yaml
类型。
根据官网的要求,配置名为:
nacos-config-client-dev.yml
三.Nacos配置发布和更新:
Nacos控制台添加配置,发布:
运行3377,测试:
修改version为2,发布,查看配置动态刷新,成功:
②分类配置概念
Nacos的配置通过Namespace
+Group
+Data ID
三者共同构建
设计思想:类似Java中的包名和类名
-
NameSpace用于区分部署的环境
-
Group和DataID逻辑上区分两个目标对象
默认:
Namespace=public,Group=DEAFAULT_GROUP,默认Cluster为DEFAULT
上图的Service就是微服务(整体),一个Service可以有多个Cluster(集群)
Nacos默认Cluster是DEFAULT,Cluster是对一个指定微服务的虚拟划分,比如Service有两个集群,分别在上海和南京。
如上图,Cluster1起名称叫做SH(代表上海的集群),Cluster2起名NJ(代表南京的集群),这样可以让一个机房微服务互相调用。
Instance就是微服务实例,比如Provider实例和Consumer实例
③分类配置实操
一.通过DataID配置(最小)
通过DataID来区别配置:dev
和test
上面我们配置了dev的配置,下面我们再配置一个test,方法同上次配置。
1.修改nacos配置
2.修改client的active指定
spring:
profiles:
active: test #表示开发环境 dev和test
3.测试,成功:
二.通过Group配置(中)
1.新建配置nacos-config-client-info.yml,设置组为TEST_GROUP
可以看到如果不设置GROUP,默认为DEFAULT_GROUP
2.client项目bootstrap.yml设置gruop配置
3.application.yml修改info(为了对应上面nacos的info)
4.重启测试,成功:
三.通过NameSpace配置(最大)
1.在nacos上新建命名空间:dev和test
2.配置完命名空间后能够看到配置管理的信息:
3.在dev的namespace中创建配置,稍微修改前面的配置:
4.测试:
5、Nacos集群和持久化(重点)
Nacos使用嵌入式的数据库(derby)实现数据的存储,在多节点下,数据存在一致性问题
在前面,我们重启Nacos,数据仍然保留的(就类似于QQ使用SqlLite)
如何解决???
Nacos可以使用集中存储的方式支持集群化部署,目前仅支持Mysql(0.7版本后支持)
①单节点环境搭建
单间点使用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脚本
三.Nacos配置
注:如果你在这里出错了,容器无法运行,你也无法进入容器修改配置文件。
所以我推荐你使用挂载的方式来运行nacos
下面我们会使用到Nacos的application.properties配置文件,将这个文件挂载到外部,你可以使用我的nacos配置文件,免除启动临时容器复制的麻烦
查看你的nacos版本是否与我一致:2.2.0
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
3.重启Nacos
4.测试:
在Nacos上配置
查看数据库是否更新
成功!!!
②集群搭建
一.软件与版本
因为我的服务器比较拉,三台肯定顶不住,所以在此仅搭建两台,如果你的服务器牛,可以搭三台
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
标签:Nacos,入门,spring,配置,boot,nacos,server From: https://www.cnblogs.com/zko0/p/17081215.html