本文共 13117 字,大约阅读时间需要 43 分钟。
博客参考学习视频: https://www.bilibili.com/video/BV18E411x7eT?from=search&seid=4388336378730572330
上一篇:
前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service。
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。
Nacos : Dynamic Naming and Configuration Service
Nacos 就 是 注 册 中 心 + 配 置 中 心 的 组 合 等 价 于 Nacos = Eureka + Config+Bus
官网文档:
默认账号密码都是 nacos
https://nacos.io/zh-cn/docs/what-is-nacos.html
新建 Module: cloudalibaba-provider-payment9001
POM
com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring.cloud.alibaba.version} pom import
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
YML
server: port: 9001spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址management: endpoints: web: exposure: include: '*'
主启动
@EnableDiscoveryClient@SpringBootApplicationpublic class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class, args); }}
业务类
@RestControllerpublic class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: "+ serverPort+"\t id:"+id; }}
测试
nacos 服务注册中心 + 服务提供者 9001 都OK
新建 cloudalibaba-provider-payment9002
9002 其他步骤参考 9001
或者取巧不想新建重复的劳动力,直接拷贝虚拟端口映射
新建Module: cloudalibaba-consumer-nacos-order83
POM
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery com.atguigu.springcloud cloud-api-commons ${project.version} org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
为什么 nacos 支持负载均衡: 因为依赖了 ribbon
YML
server: port: 83spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)service-url: nacos-user-service: http://nacos-payment-provider
主启动
@EnableDiscoveryClient@SpringBootApplicationpublic class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class, args); }}
业务类
① ApplicationContextBean
@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); }}
② OrderNacosController
@RestController@Slf4jpublic class OrderNacosController { @Resource private RestTemplate restTemplate; @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); }}
测试
① nacos 控制台
② http://localhost:83/consumer/payment/nacos/13
③ 83 访问 9001/9002, 轮询负载 OK
Nacos 全景图所示
Nacos 和 CAP
Nacos 支持 AP 和 CP 模式的切换
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
cloudalibaba-config-nacos-client3377
POM
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
YML
why 配置两个
Nacos 同 springcloud-config 一样,在项目初始化时,要保证先从配置中心配置拉取,拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap 优先级高于 application
bootstrap
# nacos配置server: port: 3377spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置
spring: profiles: active: dev
主启动
@EnableDiscoveryClient@SpringBootApplicationpublic class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); }}
业务类(controller)
@RestController@RefreshScopepublic class ConfigClientController { @Value("${config.info}") private String configinfo; @GetMapping("/config/info") public String getConfiginfo(){ return configinfo; }}
注意:@RefreshScope
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
理论:
Nacos 中的 dataid 的组成格式与springBoot 配置文件中的匹配规则
官网:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
配置新增: nacos-config-client-dev
Nacos 界面配置对应
设置 DataId
公 式 : ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
小总结说明
测试
自带动态刷新
修改下 Nacos 中的 yaml 配置文件, 再次调用查看配置的接口, 就会发现配置已经刷新
问题: 多环境多项目管理
Nacos 的图形化管理界面
Namespace+Group+Data ID 三者关系? 为什么这么设计?
Case
指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置
默认空间+默认分组+新建 dev 和 test 两个 DataID新建 dev 配置 DataID
新建 test 配置 DataID
通过 spring.profile.active 属性就能进行多环境下配置文件的读取
测试
通过 Group 实现环境区分
新建 Group
在 nacos 图形界面控制台上面新建配置文件 DataID
bootstrap+application
在 config 下 增 加 一 条 group 的 配 置 即 可 。 可 配 置 为 DEV_GROUP 或 TEST_GROUP
新建 dev/test 的 Namespace
回到服务管理-服务列表查看
按照域名配置填写
YML
namespace:
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
官网架构图:
上图官网翻译, 真实情况
说明
默认使用Nacos 使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos 采用了集中式存储的方式集群化部署,目前只支持MySQL的存储。
Nacos 支持三种部署,模式
windows
cmd starup.cmd 或者双击 startup.cmd 文件
单机模式支持mysql
按照上述: 我们需要 mysql 数据库。
官网说明
Nacos 默认自带的是嵌入式数据库 derby
derby 到 mysql 切换配置步骤
执行脚本:
CREATE DATABASE nacos_config;USE nacos_config;/* 数据库全名 = nacos_config *//* 表名称 = config_info *//******************************************/CREATE TABLE `config_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', `data_id` varchar(255) NOT NULL COMMENT 'data_id', `group_id` varchar(255) DEFAULT NULL, `content` longtext NOT NULL COMMENT 'content', `md5` varchar(32) DEFAULT NULL COMMENT 'md5', `gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间', `gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间', `src_user` text COMMENT 'source user', `src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL, `tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段', `c_desc` varchar(256) DEFAULT NULL, `c_use` varchar(64) DEFAULT NULL, `effect` varchar(64) DEFAULT NULL, `type` varchar(64) DEFAULT NULL, `c_schema` text, PRIMARY KEY (`id`), UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';....省略后面的。参考自己的
nacos-server-1.1.4\nacos\conf 目 录 下 找 到 application.properties
在文件下面添加
spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb.user=nacos_devtestdb.password=youdontknow
参考
启动nacos, 可以看到是个全新的空记录界面, 以前是记录进derby
预计需要, 1 个 nginx+3 个 nacos 注册中心+1 个 mysql
Nacos 下载 linux 版本
集群配置步骤(重点)
位置:
内容
spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://1.7.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb.user=rootdb.password=HF_mysql_654321
注意:
mysql 授权远程访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;flush privileges;
内容
这个 IP 不能写 127.0.0.1,必须是 Linux 命令 hostname -I 能够识别的 IP
/mynacos/nacos/bin 目录下有 startup.sh 在什么地方, 修改什么, 怎么修改
思考
修改内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynHfkBUX-1604673302987)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20201105235141390.png)]
注意:
这里是 —Dserver.port=${PORT}, 不要误认为是“.”
在启动前一定要先启动mysql服务,不然nacos会报错:
[root@localhost ~]# service mysql start
执行方式
同时通过window 浏览器访问
安装nginx 请参考我这篇博客:
修改 nginx 的配置文件
nginx.conf
upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555;}server{ listen 1111; server_name localhost; location /{ proxy_pass http://cluster } ....省略
按照指定启动
微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群
Yml
server-addr: 写你自己的虚拟机 ip:1111
结果
ywpAJlh-1604673302998)]
nginx.conf
upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555;}server{ listen 1111; server_name localhost; location /{ proxy_pass http://cluster } ....省略
[外链图片转存中…(img-veQwCXEY-1604673303000)]
按照指定启动
[外链图片转存中…(img-0oNJeWyI-1604673303005)]
[外链图片转存中…(img-iZD1PpoD-1604673303009)]
[外链图片转存中…(img-na22ViSw-1604673303012)]
[外链图片转存中…(img-UsErQigE-1604673303016)]
微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群
Yml
server-addr: 写你自己的虚拟机 ip:1111
结果
[外链图片转存中…(img-diXA39v4-1604673303020)]
转载地址:http://dabki.baihongyu.com/