SpringCloudAlibaba -Nacos
EndPoint 服务端点
spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个EndPoint 服务端点。可以通过访问
http://localhost:port/actuator/nacos-discovery
获得关于某个端口下的服务的相关信息。
subscribe: 显示了当前有哪些服务订阅者
NacosDiscoveryProperties: 显示了当前服务实例关于Nacos的基础配置
Nacos客户端信息缓存
Nacos关闭以后,继续访问服务仍然可以使用。Nacos不关闭,服务关闭。被调用过的服务也会存在在Nacos中一小会儿。
Nacos对于调用过的服务会有缓存,缓存到metadata的Map中。可以降低Nacos的压力,后续的调用直接中缓存中返回结果。实现高可用。
Nacos Config 配置中心
在Nacos中配置管理中的配置列表下,新建配置:
所有带*号的必须填写。Data ID :填写服务的名字(也就是每个服务中配置文件中的spring.application.name)
Group : 服务分组,默认为DEFAULT_GROUP。更改分组需要在改配置服务中的bootstrap.properties下使用配置更改名字(spring.cloud.nacos.config.group=xxx)。名字需要和Nacos中的Group中一致。
配置内容:根据上面选择的格式,在Nacos中为服务添加相关的配置信息。相当于把原来的写在项目中的配置写在Nacos中方便管理。
这样的服务工程项目原来的基本配置(将服务注册至Nacos的相关配置)写入到bootstrap.properties中,springcloud项目启动会优先读取这个文件中的配置。
使用Nacos Config需要导入依赖:
查看远程配置的详细信息的方式
1.在启动类中添加获取相关属性的代码段
public static void main(String[] args) throws InterruptedException {
//配置容器
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
//从application.properties中读取相关的属性
while(true){
//当动态配置刷新时,会更新到Environment中,因此此处每隔一秒从Environment中获取配置
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.out.println(userName+" : "+userAge);
//获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
//休眠一秒
TimeUnit.SECONDS.sleep(1);
}
}
2.在类的内部定义相关的属性获取
@RestController
public class ConfigController {
@Value("${user.name:}")
private String name;
@Value("${user.age:}")
private String age;
@GetMapping("/config")
public String config(){
return name+":"+age;
}
}
3.通过属性映射的实体类进行调用
实体类:
@Data
@Component
@ConfigurationProperties(prefix = "user")//绑定前缀为user的属性字段
public class UserEntity {
private String name;
private String age;
}
controller:
@Autowired
private UserEntity userEntity;
@GetMapping("/config2")
public String config2(){
return userEntity.getName()+":"+userEntity.getAge();
}
注意:@Autowired注解必须添加,在这里UserEntity是从项目启动后就存在容器中的映射。如果需要获取配置中的详细信息,不能不加注解。不加注解为创建一个UserEntity的实例,其中所有属性为空,调用会报空指针异常错误
如果更改Nacos config 配置中心中的配置信息,无需重启改服务模块。配置中心会自动动态配置信息。
通过yaml方式进行远程配置
首先需要在改模块的bootstrap.properties文件中添加:
spring.cloud.nacos.config.file-extension=yaml
此配置项默认使用.properties文件格式
然后在Nacos config的配置中心中添加相关的配置信息,重启该服务模块即可。
Nacos config 配置中心多环境配置
支持profile粒度的配置
在模块项目中的bootstrap.properties文件中可以通过添加:
spring.profiles.active=develop #激活使用哪一分配置文件,代表原来的application-dev.properties
选择远程的哪一份配置文件进行启动。
在Nacos config中进行相关配置时,Data id 需要满足格式:【name】-【环境名称】.【远程配置文件类型】(例:nacos-config-develop.properties 或 nacos-config-develop.yaml)
Nacos config 配置中心数据模型
通过在 bootstrap.properties文件中定义:
spring.cloud.nacos.config.namespace=xxxxxxxx
通过命名空间的指定ID号,来确定使用哪个命名空间
通过在 bootstrap.properties文件中定义:
spring.coud.nacos.config.group=MY_GROUP
来选择远程配置环境中不同分组的环境配置
数据模型:
tips:远程配置格式为properties的也可以使用text格式,官方文档中未提及
Nacos数据持久化
内嵌数据库存于./data/derby-data文件夹中,使用java编写。由于无法便捷的观察数据存储情况,我们使用mysql对它进行数据持久化操作。操作步骤为:
mysql数据库脚本存在conf文件夹下。
在mysql中运行nacos-mysql.sql脚本创建相关的表格。创建表格如下:
修改conf/application.properties文件,其中:
将这一部分的相关注释去除,并且修改用户名,密码,链接。配置数据库个数。db.num配置数据库的个数,配置多少个,就要在db.url中.多少个链接(从0作为第一个开始),本机上修改为:
最后如果没有Nacos集群,则以单机方式启动Nacos。当日志信息中出现:
则代表使用了用户额外的数据库数据存储,即mysql。访问本机Nacos:
http://localhost:8848/nacos
发现所有的数据都为空,开始添加新的配置,后在mysql中的nacos数据库表config-info中发现增加了刚刚添加的配置信息。至此数据持久化结束。
Nacos集群部署
高可用架构:
3个或者3个以上的Nacos节点才可以构成集群。VIP通过Nginx和Keepalived进行实现。在本机上,复制三分干净的Nacos,也就是去除data和log的Nacos
然后分别将三台Nacos更改至对应端口(applcation.properties中server.port=880x)
我们这边使用本地的mysql,生产环境每个nacos对应一个数据库,数据库之间进行数据同步即可。(本地环境采用:三个Nacos都连接到本地的同一个数据库)
最后每个Nacos通过以集群的方式启动进行测试。访问Nacos的集群列表,查看结果:
如果使用内部数据库,数据也可以同步,内部数据库含有同步算法
加入Nginx
通过官网 www.nginx.org 下载对应版本的Nginx。解压缩后,双击nginx.exe开启Nginx,访问localhost:80 查看是否启动成功。也可以通过在解压缩后的目录下的命令窗口中输入:nignx -s stop 命令关闭nginx。
有可能,80端口被占用导致Nginx启动失败
在命令窗口下输入: netstat -aon|findstr :80 查看80端口被什么占用
然后输入:tasklist|findstr “4” 将第一行后面占用号输入查看对应进程
然后把对应的进程删去即可。像这种情况就是被IIS服务占用,如果访问localhost:80 会出现一下界面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eUqlOo71-1628737722641)(https://gitee.com/yang-codegod/pic-go/raw/master/image-20210723095315914.png)]
关闭方式如下:
但是如果如上图被System占用,则代表被ntoskrnl.exe占用,这个进程是负责Windows核心操作部分是内核进程,不可以删去!这种情况就只能改变nginx的端口号,具体操作归并到下述配置中。
配置文件 ./conf/nignx.conf完成对于nginx的配置:
修改监听端口:
添加对于nacos集群的链接配置:
添加对于/nacos 请求的拦截和处理(代理转发):
访问 localhost:81 :
启动成功!!!
tips:Nginx负载均衡配置-----upstream
tips: Nginx常用负载均衡策略配置
hash算法结果为0或者1
tips:Nginx负载均衡其他几个配置
tips:Nginx静态代理
tips:Nginx动静分离
相关链接:https://www.bilibili.com/video/BV1Yb411p7wT?p=24
tips:Nginx虚拟主机
相关链接:https://www.bilibili.com/video/BV1Yb411p7wT?p=25&spm_id_from=pageDriver
通tips回到Nacos集群,Nginx配置完毕并且成功运行之后,访问的地址就从原本的三个不同的地址转变为一个即Nginx地址加上相关链接的方式:
localhost:81/nacos
需要在springcloudalibaba的工程项目中修改对应的路径:
spring.cloud.nacos.discovery.server-addr=localhost:81
spring.cloud.nacos.config.server-addr=localhost:81
7722657)]
相关链接:https://www.bilibili.com/video/BV1Yb411p7wT?p=25&spm_id_from=pageDriver
通tips回到Nacos集群,Nginx配置完毕并且成功运行之后,访问的地址就从原本的三个不同的地址转变为一个即Nginx地址加上相关链接的方式:
localhost:81/nacos
需要在springcloudalibaba的工程项目中修改对应的路径:
spring.cloud.nacos.discovery.server-addr=localhost:81
spring.cloud.nacos.config.server-addr=localhost:81