目录
二、Spring Cloud和Spring Cloud Alibaba概述
5.1、修改nacos配置文件:/usr/local/nacos/conf/application.properties
前言
随着互联网的不断发展,互联网应用对高并发、大流量的性能需求不断提高,为了满足这种这种不断发展的性能需求,应用系统的架构也在不断演变以满足系统的性能需求。
一、系统架构演变
- 单体架构
在网站初期,应用体量比较小的时候,所有的功能模块都集中在一个应用中,打包成一个jar包发布到服务器上,应用和数据库运行在一台服务器上。在用户量不大的时候,单体应用也撑得住,随着用户量的增多,应用的拓展和迭代会遇到很多问题,如:
1. 代码耦合:所有的功能模块都在一个应用中,边界模糊,依赖关系不清晰,系统单点容错率低;
2.迭代困难:每次功能迭代和bug修复都需要重新部署整个应用,随着代码的增多,构建、测试和部署需要的时间也会增加;
3.拓展受限:单体应用只能作为一个整体进行扩展,无法针对特定的模块进行扩展; - 垂直应用架构
随着用户访问量的增大,单体应用只能通过增加节点来应对,然而并不是每个系统模块访问量都大,此时单体架构就不能满足需求了。而垂直应用架构根据功能模块对系统进行拆分,这样一来既降低了系统的耦合度,也可以针对特定的功能模块进行优化。
优点:
1、降低了系统的耦合度,提高了单点容错率;
2、可以针对特定的功能模块进行拆分;
缺点:
1、各个功能模块之间相互独立,无法互相通信;
2、各个功能模块之间相互独立,会有重复的开发任务; - 分布式架构
随着垂直应用越拆越多,重复的业务代码也越来越多,我们就考虑能不能将重复的业务代码抽出来作为独立的业务层,让表现层按需调用业务层,这就是所谓的分布式架构。
分布式架构将系统拆分成服务层和表现层两部分,服务层包含业务逻辑,表现层只负责和页面进行交互,业务逻辑通过调用服务层来实现。
优点:抽取重复的业务代码,提供了代码的复用性;
缺点:系统耦合度提高,调用关系复杂,难以维护; - SOA架构
在分布式架构下,服务间的调用是采用硬编码的方式,当服务越来越多,服务之间的复杂调用关系就会越来越难以维护。为了解决这个问题,我们采用注册中心(Dubbo)对服务进行调度和集中管理。
优点:注册中心解决了服务间复杂的调用关系,实现了服务间关系的自动调节;
缺点:
1、服务提供方和服务调用方存在依赖关系,耦合度较高;
2、服务抽取的粒度太大; - 微服务
微服务从SOA架构进一步演化而来,将SOA进一步拆分成一个个微小服务,每个微服务独立打包、部署、升级,互不影响。服务间的通讯采用HTTP协议,restful风格的API,JSON格式的数据,采用二进制进行数据传输。
优点:
1、隔离性强:各个服务之间相互独立,避免出现级联问题,容错性强;
2、面向服务:每个服务对外暴露Restful等轻量协议的接口,并通过接口调用其他服务;
3、单一职责:服务拆分的粒度更小,每个服务都只负责单一业务,避免业务重复开发;
4、自治:每个服务独立打包、部署、升级,降低运维成本;
缺点:
1、服务过多,治理成本较高;
2、系统开发的技术成本较高(容错、分布式事务等);
二、Spring Cloud和Spring Cloud Alibaba概述
Spring Cloud是微服务系统架构的一套具体实现方案,提供了如服务发现注册、配置中心、消息总线、负载均衡、熔断器、数据监控等功能。Spring Cloud没有重复造轮子,而是将市面上一些成熟的框架组件(主要由Netflix公司提供)基于SpringBoot进行整合封装,屏蔽了复杂的配置和实现原理,使得开发者能够更轻松的开发微服务架构的程序。
Spring Cloud Alibaba是另一套微服务架构的实现方案。由于在2020年Netflix公司停止了对Spring Cloud组件的维护,所以Spring Cloud急需一些替代品,恰好Alibaba开源了自己的微服务组件,解决了Spring Cloud的燃眉之急,Spring Cloud Alibaba就次诞生。
总结:Spring Cloud和Spring Cloud Alibaba都是基于SpringBoot整合的微服务系统架构的具体实现方案,不同之处在于,Spring Cloud中的组件主要由Netflix公司提供,Spring Cloud Alibaba中的组件大多由Alibaba提供。
三、Nacos
1.Nacos简介
Nacos是Spring Cloud Alibaba中的一个组件,主要充当两个角色:服务管理中心和配置管理中心,功能是服务注册和发现以及服务的配置文件的集中管理和动态更新。
2.Nacos安装和启动
下载地址:Tags · alibaba/nacos · GitHub
解压到指定目录:
[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 #非集群模式启动
... ...
nacos is starting with standalone
nacos is starting,you can check the /usr/java/nacos/logs/start.out
关闭:
[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK
测试:
浏览器访问:http://具体IP:8848/nacos,默认用户名/密码为: nacos/nacos
3.nacos注册中心(存放服务)
3.1、服务提供者:nacos_provider
pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml:
server:
port: 9090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.52.131 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的名字
启动类:
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class,args);
}
}
3.2、服务消费者:nacos_consumer
pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
application.yml:
server:
port: 8080
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.52.131 #nacos服务的地址
application:
name: nacos-consumer #向注册中心注册的名字
启动类:
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}
3.3、为什么要使用注册中心?
- 解决微服务服务调用地址硬编码问题;
- 解决微服务不能负载均衡的问题;
4、naocs配置中心(存放配置文件)
4.1、入门案例:nacos_config
pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
bootstrap.yml:
spring:
cloud:
nacos:
config:
server-addr: 192.168.52.131
file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
group: NACOS_GROUP
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class,args);
}
}
4.2、为什么要用配置中心?
微服务架构下配置文件存在的问题:
1、配置文件相对分散。微服务架构下,配置文件分散在各个微服务中,随着服务越来越多,管理困难。
2、无法区分环境。微服务项目可能会有多个环境,如开发、测试、生产等,每个环境的配置文件可能都不同,如果需要修改,会很困难。
3、无法实时更新:每次修改配置文件后,都需要重启服务才能生效,这对于一个正在运行的项目来说很不友好。
配置中心的作用总的来说就是:
- 集中管理配置文件;
- 动态更新配置文件;
4.3、隔离模型
Namespace -------------------------- 环境:dev、test、prod
Group -------------------------- 项目名:health、jd
Data Id -------------------------- 工程名:nacos-config.yaml health-provider.yaml
5、持久化
Nacos中的数据默认保存在自带的数据库Derby中,搭建集群的时候,会出现集群中各个节点的数据不统一的问题。要想数据互通,就要采用一个第三方共用数据库(MySQL)进行数据持久化,每个节点都将数据存储到一个相同的第三方数据库,从而实现数据统一。
5.1、修改nacos配置文件:/usr/local/nacos/conf/application.properties
#*************** Config Module Related Configurations ***************#
### 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.52.128:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111
5.2、在MySQL中建库建表
执行Nacos压缩包里自带的sql脚本
测试:
- 重启nacos;
- 新建配置;
- 观察是否持久化到MySQL中;
总结
本文仅仅简单介绍了Spring Cloud以及Nacos的安装和使用。