目录
一、概述
1、简介
2、作用
3、官方文档及源码
4、注册中心的比较
二、Nacos的下载及安装
1、下载地址
2、安装
3、启动
三、Nacos作为服务注册中心演示
1、基于Nacos的服务提供者
2、基于nacos的服务消费者
3、服务注册中心的对比
四、Nacos作为服务配置中心演示
一、Nacos作为配置中心-基础配置
1、建模块
2、配pom
3、写yml
4、主启动
5、controller
6、测试
7、自带动态刷新
二、Nacos作为配置中心-分类配置
1、问题
2、Nacos的图形化管理界面
3、Namespace+Group+d三者关系?为什么这么设计
4、三种方案加载配置
五、Nacos集群和持久化配置(重要)
一、官网说明
1、架构图
2、部署方式
二、Linux版Nacos+MySQL生产环境配置
1、安装nacos
2、mysql的配置
3、安装jdk
4、配置application.properties
5、Linux服务器上nacos的集群配置cluster.conf
6、编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口
6、配置Nginx
7、测试
三、微服务cloudalibaba-provider-payment9002启动注册进nacos集群
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
官方文档:Spring Cloud Alibaba Reference Documentation
中文文档:homehttps://nacos.io/zh-cn/index.htmlgithub:https://github.com/alibaba/Nacoshttps://github.com/alibaba/Nacos
Releases · alibaba/nacos · GitHubhttps://github.com/alibaba/nacos/releases版本选择一个较稳定的
将set MODE="cluster"
改为
set MODE="standalone"
打开bin目录下的startup.cmd文件等待开启
开启后用http://localhost:8848/nacos访问控制台
默认用户名和密码是nacos
官方文档
Spring Cloud Alibaba Reference Documentation
建cloudalibaba-provider-payment9001模块
父模块添加的坐标
com.alibaba.cloud spring-cloud-alibaba-dependencies 2.1.2.RELEASE 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
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
#nacos服务器的地址
server-addr: localhost:8848
#暴露端口
management:
endpoints:
web:
exposure:
include: "*"
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaProviderApplication9001 {
public static void main(String[] args) {
SpringApplication.run(AlibabaProviderApplication9001.class,args);
}
}
package com.xiaojiang.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public 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; } }
用9001的模板在建一个9002模块
建cloudalibaba-consumer-nacos-order83模块
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
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
package com.xiaojiang; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class NacosOrder83 { public static void main(String[] args) { SpringApplication.run(NacosOrder83.class,args); } }
package com.xiaojiang.conf; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextBean { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
package com.xiaojiang.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController public class OrderController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String service_uname; @GetMapping("/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id){ return restTemplate.getForObject(service_uname+"/payment/nacos/"+id,String.class); } }
由于Nacos整合了Ribbon所以Nacos支持负载均衡
实现CAP的原理
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
新建cloudalibaba-config-nacos-client3377模块
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config 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的原因
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,
拉取配置之后,才能保证项目的正常启动。
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos配置中心地址 file-extension: yaml #namespace: eb047634-2b19-43ff-a74c-41a4676486d0 group: DEV_GROUP namespace: fcf0065c-41b1-40d6-b5c4-266685537339 # 在nacos中配置文件的命名规则 #${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} #nacos-config-client-dev.yaml
spring: profiles: active: dev #active: test
package com.xiaojiang; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class NacosConfigApplication3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigApplication3377.class,args); } }
@RestController
package com.xiaojiang.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
//在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
@RefreshScope
public class NacosConfigController {
@Value("${config.info}")
private String config_info;
@GetMapping("/consumers/nacos/config")
public String NacosConfig(){
return "配置信息为" + config_info;
}
}
修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......
那怎么对这些微服务配置进行管理呢?
配置管理
命名空间管理
1 是什么
类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
2 三者情况
默认情况:
Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAULT
Nacos默认的命名空间是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。
在默认环境下新建另一个配置文件
在yml中通过spring.profile.active的的值即可区分
spring: profiles: #active: dev active: test
在public命名空间中新建两个同名的配置文件但group不同
在bootstrap.yml
group: DEV_GROUP
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos配置中心地址
file-extension: yaml
group: DEV_GROUP
新建一个namespace
新建成功
新建几个组名一样的配置文件
在yml中作以下修改
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos配置中心地址
file-extension: yaml
#通过namespace的命名空间的id来区分
#namespace: eb047634-2b19-43ff-a74c-41a4676486d0
namespace: fcf0065c-41b1-40d6-b5c4-266685537339
group: DEV_GROUP
集群部署说明https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
Release 1.1.4(Oct 24th, 2019) · alibaba/nacos · GitHubhttps://github.com/alibaba/nacos/releases/tag/1.1.4
将下载好的tar包上传的linux中
复制的自己的安装路径下,/usr/local/src/mynacos
在将tar包解压到当前文件夹下
tar -zxvf nacos-server-1.1.4.tar.gz
会解压一个nacos的文件
nacos的集群是需要数据库来支持的且只支持mysql
参考文档
Ubuntu18.04下安装MySQL - OpsDrip - 博客园https://www.cnblogs.com/opsprobe/p/9126864.htmlUbuntu16.04上安装MySQL(详细过程)_Runningluffy的博客-CSDN博客_ubuntu16.04安装mysqlhttps://blog.csdn.net/weixin_42209572/article/details/98983741
安装好Mysql后,在/usr/local/src/mynacos/nacos/conf文件夹下nacos-mysql.sql中有nacos所需的数据库的sql,登录到数据库中,新建nacos_conf数据库
create database nacos_config
执行source /usr/local/src/mynacos/nacos/conf/nacos-mysql.sql,执行sql脚本新建nacos所需的表
Linux之Ubuntu18.04安装Java JDK8的三种方式_软测小生的博客-CSDN博客_ubuntu安装jdk8
linux 下JDK卸载与安装_jx_lihuifu的博客-CSDN博客_linux 卸载jdk
1、在官网下载jdk
Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/2、上传到linux中,并解压到/usr/local/src下
可以给解压后的jdk的文件名改成jdk8
3、更改环境变量(root)
vi ~/.bashrc
按shift+g定位到末尾添加以下内容
export JAVA_HOME=/usr/local/src/jdk/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
保存
使系统变量生效
source ~/.bashrc
查看是否安装成功
java -version
在/usr/local/src/mynacos/nacos/conf文件夹下,根据自己nacos的安装目录来
cp application.properties application.properties.bk
vim /usr/local/src/mynacos/nacos/conf/application.properties
在最后一行做以下配置
#####################################################
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&queryTimeout=2400
db.user=root
db.password=123456
在/usr/local/src/mynacos/nacos/conf文件夹下,根据自己nacos的安装目录来
cp cluster.conf cluster.conf.bk
这个IP不能写127.0.0.1,必须是
Linux命令hostname -i能够识别的IP
vim /usr/local/src/mynacos/nacos/con/cluster.conf
做以下配置
#it is ip
#example
192.168.195.132:3344
192.168.195.132:3355
192.168.195.132:3366
在/usr/local/src/mynacos/nacos/bin目录下,
vim /usr/local/src/mynacos/nacos/bin/startup.sh,做以下更改
修改jvm的大小,默认的太小了
发现启动方式是cluster
安装nginx
apt-get install nginx
查看是否安装成功
nginx -v
启动nginx
systemctl start nginx
查看nginx的状态
systemctl status nginx
在浏览器输入nginx服务器的IP会出现以下
将nacos的三个节点由nginx进行负载均衡的访问
sudo vi /etc/nginx/conf.d/load-balancer.conf
进行以下配置,不用http{}(坑),因为在nginx.conf中是include了conf.d文件夹下的所有配置
upstream backend {
server 127.0.0.1:3366;
server 127.0.0.1:3355;
server 127.0.0.1:3344;
}#该服务器接受到端口80的所有流量并将其传递给上游upstream 。
#请注意,upstream名称和proxy_pass需要匹配。
server {
listen 1111;
server_name localhost;
location / {
proxy_pass http://backend;
}
}
需要禁用先前在安装后测试的默认服务器配置
rm /etc/nginx/sites-enabled/default
重新启动
systemctl status nginx
将以上的配置完成后,并将三个nacos节点启动和nginx启动
在浏览器输入以下
http://192.168.195.132:1111/nacos/#/login
即可访问nacos
截止到此处,1个Nginx+3个nacos注册中心+1个mysql
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
#nacos服务器的地址
server-addr: 192.168.195.132:1111
#暴露端口
management:
endpoints:
web:
exposure:
include: "*"