B站尚硅谷最新版SpringCloud Alibaba学习笔记(1)Nacos服务注册和配置中心
B站视频:https://www.bilibili.com/video/BV18E411x7eT
文章目录
一、SpringCloud Alibaba入门简介
1.why会出现SpringCloud alibaba
SpringCloud NetFlix Projects Entering Maintenance Mode
2.SpringCloud alibaba带来了什么?
是什么
官网https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
能干嘛
3.SpringCloud alibaba学习资料获取
官网https://spring.io/projects/spring-cloud-alibaba#overview
文档
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
二、Nacos简介
前四个字母分别为Naming和Confiquration的前两个字母,最后的s为Service
1.是什么
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
Nacos就是注册中心+配置中心的组合
Nacos = Eureka+Config+ Bus
2.能干嘛
- 替代Eureka做服务注册中心
- 替代Config做服务配置中心
3.去哪下
官网
https://nacos.io/zh-cn/index.html
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
4.各种注册中心比较
三、安装并运行Nacos
1.下载
https://nacos.io/zh-cn/index.html
找到下载linux版本
移植到Linux的/opt上
2.解压
tar -zxvf nacos-server-1.4.1.tar.gz
解压后
进入nacos文件夹的bin文件夹
可以看到两个脚本,启动和关闭
3.nacos的启动和关闭
单机运行
sh startup.sh -m standalone
可以看到日志的文章
cat /opt/nacos/logs/start.out
防火墙开启8848端口
开启端口
firewall-cmd --zone=public --add-port=8848/tcp --permanent
查看开启的端口
firewall-cmd --list-ports
重启防火墙
firewall-cmd --reload
访问控制台
http://192.168.137.128:8848/nacos/index.html(注意地址是自己的)
默认账号密码为nacos
关闭nacos
sh shutdown.sh
四、Nacos作为服务注册中心演示
1.创建父工程
mySpringCloudAlibaba
删除不必要的文件
pom
<?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>com.yezhinao</groupId>
<artifactId>mySpringCloudAlibaba</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloudalibaba-provider-payment9001</module>
</modules>
<!-- 统一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1 在nacos里cloud的版本太低会导致与actuator包不兼容-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.基于Nacos的服务提供者
①新建工程cloudalibaba-provider-payment9001
②修改配置文件
POM
<?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">
<parent>
<artifactId>mySpringCloudAlibaba</artifactId>
<groupId>com.yezhinao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</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>
</project>
application.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.137.128:8848 #配置Nacos地址
#暴露端口
management:
endpoints:
web:
exposure:
include: '*'
③创建启动类PaymentMain9001
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}
添加PaymentController
@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;
}
}
④启动
启动成功后可以看到注册信息
3.基于Nacos的服务消费者
为了表现Nacos的负载均衡,新建一个cloudalibaba-provider-payment9002
只需要修改application.yml和启动类
①新建一个工程cloudalibaba-consumer-nacos-order83
②修改配置文件
POM
<?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">
<parent>
<artifactId>mySpringCloudAlibaba</artifactId>
<groupId>com.yezhinao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-nacos-order83</artifactId>
<dependencies>
<!--SpringCloud ailibaba 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>
</project>
application.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.137.128:8848 #配置Nacos地址
service-url:
nacos-user-service: http://nacos-payment-provider
③创建启动类OrderNacosMain83
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
④创建业务类
@Configuration
public class ApplicationContextConfig {
//配置负载均衡
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController
@Slf4j
public 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);
}
}
⑤启动
启动三个服务
访问http://localhost:83/consumer/payment/nacos/1
可以发现轮询调用提供者
4.服务注册中心对比
Nacos全景图所示
Nacos和CAP
Nacos支持AP和CP模式的切换
五、Nacos作为服务配置中心演示
1.Nacos作为配置中心-基础配置
①新建一个工程cloudalibaba-config-nacos-client3377
②修改配置文件
POM
<?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">
<parent>
<artifactId>mySpringCloudAlibaba</artifactId>
<groupId>com.yezhinao</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-config-nacos-client3377</artifactId>
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>
</project>
配置两个yml
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.137.128:8848 #服务注册中心地址
config:
server-addr: 192.168.137.128:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
#${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
#nacos-config-client-dev.yaml
application.yml
spring:
profiles:
active: dev #开发环境
③创建启动类NacosConfigClientMain3377
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
④创建业务类
@RestController
@RefreshScope
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
⑤在Nacos中添加配置信息
匹配规则
Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则
官网
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
新增配置
设置Datald
DATA ID
nacos-config-client-dev.yaml
配置内容
config:
info: “config info for dev, version = 1”
dataid的配置规则
p r e f i x − {prefix}- prefix−{spring.profiles.active}.${file-extension}
因为prefix默认为spring.application.name的值,所以也可以是
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
注意:
因为file-extension: yaml,指定了yaml,即使dataid的后缀为yml也是不行的。
⑥测试
配置添加后,启动cloudalibaba-config-nacos-client3377
访问http://localhost:3377/config/info
修改配置
因为添加了@RefreshScope,实现配置自动更新
六、Nacos作为配置中心-分类配置
问题
1.Nacos的图形化管理界面
由Namespace+DataId+Group确定一个配置文件
2.DatalD方案
①指定spring.profile.active和配置文件的DatalD来使不同环境下读取不同的配置
②默认空间+默认分组+新建dev和test两个DatalD
nacos-config-client-dev.yaml
config:
info: "nacos-config-client-dev.yaml,version = 7"
nacos-config-client-test.yaml
config:
info: "nacos-config-client-test.yaml,version = 7"
③通过spring.profile.active属性就能进行多环境下配置文件的读取
http://localhost:3377/config/info
test
dev
3.Group方案
①新建Group
通过Group实现环境区分
config:
info: "nacos-config-client-test.yaml,TEST_GROUP,version = 7"
②修改bootstrap.yml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O27mPG57-1616568677008)(https://gitee.com/yezhinao/picture/raw/master/image/20210323145228.png)]
application.yml为测试环境
③测试
http://localhost:3377/config/info
4.Namespace方案
①新建命名空间
test空间
新建后可以在配置列表里查看到
②创建一个配置yaml
config:
info: "nacos-config-client-test.yaml,TEST_GROUP,namespace:test,version = 7"
③修改bootstrap.yml
application.yml为测试环境
可以在命名空间里查看命名空间的ID
④测试
http://localhost:3377/config/info
5.总结
配置中心的配置查找顺序:NameSapce->Group->DataID
七、Nacos集群和持久化配置(重要)
1.官网说明
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
上图的解析
https://nacos.io/zh-cn/docs/deployment.html
Nacos持久化配置解释
Nacos默认自带的是嵌入式数据库derby
https://github.com/alibaba/nacos/blob/develop/config/pom.xml
从这一张图片来看,我们的Centos7,Nginx,而且nacos持久化支持Mysql数据库,所以还需要安装Mysql
2.Centos7安装Mysql5.7
安装参考链接
https://blog.csdn.net/EB_NUM/article/details/105425622
①下载和在线安装
#下载MySQL 安装包
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#安装mysql 安装源:
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
#在线安装MySQL
yum -y install mysql-community-server
#启动mysql 服务
systemctl start mysqld
#设置开机启动
systemctl enable mysqld
systemctl daemon-reload
②查看临时密码
vim /var/log/mysqld.log
mysql -u root -p
很不巧可能是因为我的临时密码携带!这个特殊字符不能进入
如果临时密码有效请直接查看④设置远程登录或参考文档
③临时密码无效的解决办法
参考资料
https://blog.csdn.net/lydia88/article/details/104838461
#进入mysql配置文件
vim /etc/my.cnf
#加上这句话
skip-grant-tables
#重启服务
systemctl restart mysqld
mysql -u root -p
use mysql
#修改密码
update user set authentication_string=password('123456') where user='root';
flush privileges;
返回修改配置文件
vim /etc/my.cnf
重启服务
#重启服务
systemctl restart mysqld
④设置远程登录
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#远程登录
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
⑤配置mysql默认编码为utf-8
vim /etc/my.cnf
character_set_server=utf8
init_connect='SET NAMES utf8'
#重启服务
systemctl restart mysqld
#查看编码
show variables like '%character%';
⑥开启防火墙端口3306
#防火墙开启端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
#重启防火墙
firewall-cmd --reload
#查看防火墙开启的端口
firewall-cmd --list-ports
远程测试连接
3.Centos7安装nginx
安装参考链接
https://www.jianshu.com/p/97cdbeebef96
启动参考链接
https://blog.csdn.net/qq_37345604/article/details/90034424
最后防火墙将80端口开启
nginx环境配置完成
4.集群配置步骤(重点)
①Linux服务器上mysql数据库配置
找到nacos安装目录的nacos-mysql.sql
将其取出
新建一个数据库名为nacos_config
导入nacos-mysql.sql文件
②application.properties配置
找到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&serverTimezone=UTC
db.user=root
db.password=123456
尝试启动
./startup.sh
查看日志是否报错
cat /opt/nacos/logs/start.out
配置mysql数据库成功
如果出现下面错误,仔细检查application.properties配置
③Linux服务器上nacos的集群配置cluster.conf
找到cluster.conf.example,并且拷贝为cluster.conf
cluster.conf是集群生效的文件
#查看ip
hostname -I
假设使用3台机器做集群,则可以使用3个不同的端口做伪集群
编辑cluster.conf
5.编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端
①找到startup.sh
#备份一份startup.sh
cp startup.sh startup.sh.bak
②修改startup.sh
#修改startup.sh
vim startup.sh
nohup $JAVA -Dserver.port=${EMBEDDED_STORAGE} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
修改后,可以使用指定端口启动
#使用指定端口启动
./startup.sh -p 3333
#查看启动日志
cat /opt/nacos/logs/start.out
修改成功,以指定端口的形式启动
接着模拟另外两台机器,以4444 和 5555端口启动
#使用指定端口启动
./startup.sh -p 4444
./startup.sh -p 4444
到这里就已经实现了nacos的集群配置了
下一步只需要套一层nginx实现负载均衡就可以了
③Nginx的配置,由它作为负载均衡器
#进入nginx的配置目录
cd /usr/local/nginx/conf
#备份nginx的配置文件
cp nginx.conf nginx.conf.bak
#修改配置文件
vim 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;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://cluster;
}
....
}
启动nginx
./nginx -c /usr/local/nginx/conf/nginx.conf
防火墙打开1111端口
http://192.168.137.128:1111/nacos/index.html
完成集群部署
6.测试
在配置中心配置一个yaml
mysql数据库将信息存入
微服务cloudalibaba-provider-payment9002启动注册进nacos集群
修改application.yml
运行后服务注册成功
代码:https://gitee.com/yezhinao/springcloud_alibaba/tree/master/mySpringCloudAlibaba(1)