SpringCloud概述&注册中心和配置中心Nacos
1.系统架构的演变
1.1. 单体架构
将所有功能都部署在一个 web 容器中 运行的系统就叫做单体架构。
存在的问题:
- 代码耦合:模块的边界模糊、依赖关系不清晰,整个项目非常复杂,每次修改代码都心惊胆战
- 迭代困难:每次功能的变更或bug的修复都会导致重新部署整个应用,随着代码的增多,构建、测试和部署的时间也会增加
- 扩展受限:单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩
- 技术债务:随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且“越积越多不坏不修”
1.2 分布式架构
分布式架构,就是将原来一个项目应用进行拆分,将其拆分为互不想干的几个应用,以此来提升系统的整体性能。
存在的问题:
- 各系统难免存在重叠的业务
1.3 SOA 架构
在 SOA 架构中,我们会将系统整体拆分为服务层和表现层。服务层封装了具体的业务逻辑供表现层调用,表现层则负责处理与页面的交互操作。
当部署的服务越来越多,就会出现服务集群地址硬编码的问题,此时,我们就需要增加一个注册中心来解决各个服务之间的注册与发现。
存在的问题:
- 抽取服务的粒度较大,服务提供方与调用方接口耦合度较高
1.4 微服务
随着业务的发展,我们在 SOA 架构的基础上进一步扩展,将其彻底拆分为一个个小的可以独立部署的微服务。
微服务架构特征:- 面向服务:微服务对外暴露 Restful 等轻量协议的接口
- 单一职责:微服务拆分粒度更小,做到单一职责
2. SpringCloud 概述
Spring Cloud 是一系列框架的有序集合如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等。
Spring将目前各家公司开发的服务框架组合起来,通过Spring Boot风格进行再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
2.1 Spring Cloud 和 Spring Boot的关系
Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务;
Spring Cloud是一个基于SpringBoot实现的微服务开发方案;
3. Spring Cloud Alibaba概述
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发微服务的必需组件。
作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟Spring Cloud官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:
3.1 Spring Boot和Spring Cloud的版本对应关系
Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version |
---|---|---|
2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 |
2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE |
2021.1 | Spring Cloud 2020.0.1 | 2.4.2 |
2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE |
2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE |
2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE |
2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE |
2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE |
2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley | 2.0.X.RELEASE |
1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware | 1.5.X.RELEASE |
4.Nacos概述和安装
4.1 什么是Nacos
Nacos是阿里巴巴的一个注册中心、配置中心组件。Nacos 是阿里巴巴的新开源项目,其核心定位是 “一个更易于帮助构建云原生应用的集注册中心与配置中心于一体的管理平台”。
下载地址: https://github.com/alibaba/nacos/tags
4.2 Nacos安装与启动
- 安装
#切换到指定目录
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
- 启动
[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
- 关闭
[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK
[root@localhost bin]
-测试
浏览器访问:http://192.168.209.129:8848/nacos,默认用户名/密码为: nacos/nacos
5.Nacos注册中心
5.1 什么是Nacos注册中心
注册中心主要有三部分组成:
Ø Nacos-Server:注册中心
提供服务的注册和发现。
Ø Nacos-Provider:服务提供方
把自身的服务实例注册到 Nacos Server 中
Ø Nacos-Consumer:服务调用方
通过 Nacos Server 获取服务列表,消费服务。
5.2 Nacos入门
- 添加依赖
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置 appliaction.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.209.129:8848 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的名字
- 在启动类上添加 @EnableDiscoveryClient 注解
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
6.Nacos 开机自启
6.1.编写开机启动文件
- 添加nacos.service文件
vim /lib/systemd/system/nacos.service
- 文件内容如下:
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
6.2.修改nacos的startup.sh
- 修改JAVA_HOME路径并注销之后的3行配置,如下:
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
6.3.设置开机启动
systemctl daemon-reload #重新加载服务配置
systemctl enable nacos.service #设置为开机启动
systemctl start nacos.service #启动nacos服务
systemctl stop nacos.service #停止nacos服务
systemctl status nacos.service #查看nacos服务的状态
7. Nacos配置中心
7.1创建nacos-config
- pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 192.168.179.129:8848
file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
- 在启动类上添加@SpringBootApplication、@EnableDiscoveryClient注解
- controller
@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.type}")
private String type;
@GetMapping("/config/info")
public String getConfigInfo() {
System.out.println(this);
String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}
7.2 往 Nacos 中添加配置信息
-
在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:
${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}
-
说明:
- spring.cloud.nacos.config.prefix:默认是当前服务的服务名称
- spring.cloud.nacos.config.file-extension:配置文件的格式(后缀),目前只支持yaml和properties
-
启动时加载配置文件
-
修改配置文件后nacos监听到MD5有变化则推送消息给客户端,客户端收到消息后会拉取最新配置(参考
配置管理->监听查询
菜单)
7.3.配置隔离
7.3.1.Nacos配置管理模型
-
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
-
Namespace Group DataId介绍:
- Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
- Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
- DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
-
获取配置集需要指定:
-
nacos服务地址,必须指定
-
namespace,如不指定默认public
-
group,如不指定默认 DEFAULT_GROUP
-
dataId,必须指定
-
8.Nacos集群和持久化
Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库不然每个节点一个数据库,那么数据就不统一了,需要使用外部的mysql
8.1.持久化
8.1.1.切换数据库
修改conf/application.properties文件,增加支持mysql数据源配置
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111
8.2.集群
8.2.1.部署架构图:
8.2.2 集群搭建
找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,复制三份Nacos,分别修改conf/application.properties 中的端口号
8.3.配置代理服务
8.3.1.安装nginx
- 安装nginx的依赖库
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
- 下载nginx
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
- 解压安装包
tar -zxvf nginx-1.12.0.tar.gz
配置nginx安装包
cd nginx-1.12.0
./configure --prefix=/usr/local/nginx
注意:./configure配置nginx安装到/usr/java/nginx目录下
- 编译并安装
make && make install
8.3.2.配置nginx代理nacos
upstream nacos {
server 192.168.209.129:8848;
server 192.168.209.129:8849;
server 192.168.209.129:8850;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://nacos;
}
}