目录
一、docker环境安装部署Nacos
1、镜像获取
//查询Nacos镜像
docker search nacos
//拉取镜像
docker pull nacos/nacos-server
//查看镜像
docker images
2、查询当前docker可用的网络通信(容器内部使用)
docker network ls
选择bridge作为Nacos通信网络,或者也可用自己创建一个,name为:common-network
docker network create common-network
3、创建容器并启动Nacos
docker run --name nacos --network bridge -e JVM_XMS=64m -e JVM_XMX=64m -e JVM_XMN=16m -e NACOS_AUTH_ENABLE=true -e MODE=standalone -p 8849:8848 -d nacos/nacos-server
注意:--network是指定网络的
考虑到测试环境很多人都使用的阿里云的服务器,内存较小,可用将下面参数都设置小一点,否则会出现内存爆满服务器直接卡死的现象
Xms 是指设定程序启动时占用内存大小
Xmx 是指设定程序运行期间最大可占用的内存大小
Xmn 新生代的大小
4、设置开启自动启动Nacos
docker update --restart=always nacos
4、查看Nacos是否启动成功
docker ps
如果能看到nacos在列表中,表示创建并启动成功了
5、访问nacos平台
ip:port+/nacos/index.html 例如 127.0.0.1:8849/nacos/index.html
二、为nacos配置数据库持久化
以下为配置数据库操作,如仅测试使用可不用配置
1、进入nacos容器中
docker exec -it nacos /bin/bash
2、修改application.properties配置文件
vi conf/application.properties
修改以上位置,分别是数据库类型、ip、端口、数据库名、用户名、密码
mysql的容器ip可以通过以下指令查看(最后的mysql为容器名字)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql
或者
docker inspect mysql| grep IPAddress
最终修改为:(我的)
红框框出来的部分,也就是填写数据源类型的部分,要把双引号去掉。
3、指定完了数据库后需要创建相关数据库与表
3.1创建名字为nacos的数据库
3.2访问下面网址获取表结构
https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
3.3创建好表之后重启nacos
docker restart nacos
三、nacos管理平台部分讲解
服务分类:
①代表命名空间,②代表分组,能够通过这两个精确的找到一个服务。命名空间类似一级分类,可以用来区分项目。分组类似二级分类,可以用来区分开发环境。
雪崩保护:
在服务详情中,可以添加一个服务阈值,设置在0-1之间的数值,当同一个服务名的多个实例中,健康实例/所有实例<服务阈值的时候,就会开启雪崩保护,会将不健康的实例也拿来提供服务,以达到负载均衡的目的,分担实例压力防止服务压力过大而崩溃,但是后面会通过专门的服务管控sentinel进行管理,一般nacos不负责管理这个。
元数据:
当启动服务的时候时可以获取到nacos服务中的元数据的,例如在元数据中加一个”version“=1,可以通过获取version的版本来动态的调用服务等
心跳机制:
nacos服务注册的时候会调用addBeatInfo创建一个延时定时心跳任务beatTask,调用nacos服务端的/instance/beat接口,nacos服务会每隔5秒会发送一个心跳。nacos服务端收到nacos注册后,会创建一个延时定时的任务(ClientBeatCheckTask),在nacos集群模式下会根据服务数量进行hash取模,得到的服务机器进行处理任务,定时判断nacos实例客户端是否还存活,如果超过15秒还是还没收到客户端的心跳,则会更新实例的healthy属性为false,如果超过30秒还没有收到心跳,则会直接剔除该实例,调用deleteIp方法对该实例进行注销,如果实例重新发送心跳,需要重新注册
四、Springcloud集成nacos
1、依赖springboot、springcloudalibaba的版本依赖控制以及nacos-discovery依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>abc</groupId>
<artifactId>abc</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2.2.6.RELEASE</spring.cloud.alibaba.version>
<spring.boot.version>2.3.2.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR9</spring.cloud.version>
</properties>
<dependencies>
<!--SpringBoot基本场景启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringBoot 测试的场景启动-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
<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>
<!--SpringBoot的版本管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--Spring Cloud的版本管理-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、在启动配置类中添加注解@EnableDiscoveryClient,启动发现注册功能,高版本springboot可以不用添加
@SpringBootApplication
@EnableDiscoveryClient
public class application {
public static void main(String[] args) {
SpringApplication.run(application.class,args);
}
}
3、在application.yaml中加入nacos相关配置
server:
port: 8021
# 应用名称 (nacos会将该名称当做服务名称)
spring:
application:
name: stock-service
cloud:
nacos:
discovery:
server-addr: 120.79.10.136:8848 #nacos服务器的ip+端口
username: nacos
password: nacos
# namespace: public # 相同特征的服务进行归类分组管理
# ephemeral: false # 默认=true(临时实例) 当服务宕机 超过心跳 就会将实例剔除掉
#永久实例 哪怕宕机了也不会删除实例 当服务宕机 永远不会剔除掉
#group的相同特征的服务进行归类分组管理
#weight: 通常要结合 安装 权重的负载均衡策略, 权重越高分配的流量就越大
#metadata: version=1 可以结合元数据做扩展
五、nacos-config
开启权限控制:
需要修改nacos的配置文件application.properties
nacos.core.auth.enabled=true
当开启该配置的时候,java配置文件中就不能省略nacos的username和password
启用nacos-config作为配置中心
1、引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、编写配置中心地址,添加bootstrap.properties,在不做任何设置的情况下,nacos会默认读取当前服务名.properties文件作为配置文件
spring.application.name=nacos-config
# 配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
添加配置文件的几种方式以及优先级
首先要先选择使用的命名空间,现在nacos平台上找到命名空间的ID,然后通过代码绑定
spring.cloud.nacos.config.namespace=05b97916-0a8e-49e5-a59a-ececb63539e3
一、默认配置文件
会自动找到服务名.properties作为默认的配置文件例如当前服务名是nacos-config,那么默认的配置文件就是nacos-config.properties,如果现存的配置文件,后置不是properties,例如nacos-config.yml,可以通过以下代码修改默认配置文件以及profile文件后缀名
spring.cloud.nacos.config.file-extension=yaml
二、profile配置
与springboot的profile使用基本相同,不同的是命名,这里仍然是以服务名+profile+后缀名作为配置文件,例如nacos-config-dev.properties。然后通过以下代码开启
spring.profiles.active=dev
三、通过extensionConfigs的方式
properties:
spring.cloud.nacos.config.extensionConfigs[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh=true
yml:
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common.yaml
group: REFRESH_GROUP
refresh: true
- data-id: common1.yaml
group: REFRESH_GROUP
refresh: true
四、通过sharedConfigs的方式
spring.cloud.nacos.config.sharedConfigs[0].data-id= common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group=REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh=true
优先级
profile>默认>extensionConfigs>sharedConfigs
同一类型中后面的覆盖前面的,
更新远程配置信息
使用nacos-config的好处之一就是可以实现不重启服务直接更新配置文件,并且服务也能识别到最新的配置文件,只需要再nacos上发布最新的配置即可,nacos每10毫秒就会去比对配置文件的md5,当文件更新后,md5就会发生改变。当检测到不同的时候,就会将最新的配置信息拉取到服务上,一秒钟之内就可以完成拉取。(nacos1.4也有一个bug,就是java程序上的配置nacos信息的文件中,如果命名空间选择的是public,那么最好不要在显示声明命名空,否则会不断的拉取远程配置,即便远程配置文件没有更新,nacos客户端和nacos服务器的版本不一致也可能会出现这个问题)
命名空间-分组-DataId的最佳实践方式
- namespace命名空间:代表不同环境,比如开发、测试、生产
- group分组:代表项目
- DataId:每个项目下往往有若干个工程(微服务),每个配置集(DataId)是一个工程(微服务)的主配置文件
@RefreshScope
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解,只需要加载类上面即可
@RestController
@RefreshScope
public class TestController {
@Value("${common.age}")
private String age;
@GetMapping("/common")
public String hello() {
return age;
}