Spring Cloud概述
系统架构的演变
- 单体架构:代码耦合、迭代困难、扩展受限
- 分布式架构:各系统存在重叠业务(重复开发)
- SOA:抽取的粒度大、服务提供方和消费方耦合度高
- 微服务:单一职责、面向服务
什么是Spring Cloud?
- Spring Cloud是一套微服务开发的全家桶
- Spring没有重复造轮子,只是基于Spring Boot将其他公司 (Netflix) 的服务框架组合起来
Spring Cloud Alibaba
- Spring Cloud = Spring Boot + Netflix
- Spring Cloud Alibaba = Spring Boot + Alibaba
Spring Cloud、Spring Cloud Alibaba、Spring Boot的版本关系
https://github.com/alibaba/spring-cloud-alibaba
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 |
Nacos
Na: Naming 、co: Configuration,s: Service
下载地址:https://github.com/alibaba/nacos/tags
nacos的安装
将安装包上传到/usr/upload目录下
[root@localhost ~]# cd /usr/upload
[root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
启动和关闭:
[root@localhost ~]# cd /usr/local/nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
[root@localhost bin]# ./shutdown.sh
测试:
http://192.168.23.135:8848/nacos,默认用户名&密码为: nacos
Nacos注册中心(存放服务)
- Nacos-Server:提供服务的注册和发现
- Nacos-Provider:把自身的服务实例注册到Nacos Server中
- Nacos-Consumer:通过Nacos Server获取服务列表,消费服务
使用Nacos注册中心
nacos_provider模块相关配置
pom.xml
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.22.135:8848 #nacos服务的地址
application:
name: nacos-provider #向注册中心注册的服务名
启动类
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class);
}
}
controller
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
nacos_consumer模块相关配置
pom.xml
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.209.129:8848 #nacos服务的地址
application:
name: nacos-consumer #向注册中心注册的名字
启动类
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class);
}
}
config
@Configuration
public class ConfigBean {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Controller
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
//访问Rest服务的客户端
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 根据id获取用户
* @param id
* @return
*/
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//获取nacos中注册的所有服务信息
List<String> services = discoveryClient.getServices();
for (String service : services) {
System.out.println(service);
}
//获取nacos中注册的指定的服务信息
ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-provider").get(0);
// String url = serviceInstance.getHost() + ":" + serviceInstance.getPort(); //192.168.182.1:9090
// String url = "http://" + host + ":" + port + "/provider/getUserById/" + id;
URI uri = serviceInstance.getUri();//http://192.168.182.1:9090
String url = uri + "/provider/getUserById/" + id;
//调用服务
return restTemplate.getForObject(url, User.class);
}
}
Nacos配置中心(存放配置文件)
配置中心概述
-
首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
-
当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
-
当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
案例
创建nacos_config模块
pom.xml
<?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>springcloud_parent</artifactId>
<groupId>com.peng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos_config</artifactId>
<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>
</project>
bootstrap.yml
-
客户端配置文件的名称必须为
bootstrap.yml
-
bootstrap/ application 的应用场景:
bootstrap.yml
比applicaton.yml
优先加载,应用于系统级别参数配置,一般不会变动;application.yml
应用于SpringBoot项目的自动化配置;
spring:
cloud:
nacos:
config:
server-addr: 192.168.23.135:8848
file-extension: yaml #后缀名,只支持 properties 和 yaml 类型
prefix: nacos-config #文件名,如果没有配置则默认为 ${spring.appliction.name}
启动类
@SpringBootApplication
@EnableDiscoveryClient //向注册中心注册该服务,并可以获取其他服务的调用地址
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class,args);
}
}
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;
/**
* 获取配置信息
* @return
*/
@RequestMapping("/config/info")
public String getConfigInfo(){
System.out.println(this);
return driverClassName + "<br>" + url + "<br>" + username + "<br>" + password + "<br>" + type;
}
}
向Nacos添加配置信息
-
在 Nacos 中,dataId(配置文件的命名的规则) 的完整格式如下:
s p r i n g . c l o u d . n a c o s . c o n f i g . p r e f i x . {spring.cloud.nacos.config.prefix}. 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配置管理模型
-
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
-
Namespace: 代表不同的环境的配置隔离, 如: 开发(dev)、测试(test), 生产(prod)等
-
Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
-
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
-
获取配置集需要指定:
-
nacos服务地址,必须指定
-
namespace,如不指定默认public
-
group,如不指定默认 DEFAULT_GROUP
-
dataId,必须指定
-
namespace隔离
命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
新建namespace
在配置管理与服务管理模块下, 可在导航栏切换不同的namespace
克隆配置文件: 可用于将配置迁移到其他namespace
此时在config模块中读取nacos中的配置文件可以指定namespace
spring:
cloud:
nacos:
config:
server-addr: 192.168.23.135:8848
file-extension: yaml
prefix: nacos-config
namespace: a66ca122-fb24-46ba-bde0-58508c2d6689 #开发环境dev
Group隔离
新建配置文件并修改Group名
不同的Group下可以有相同名称的配置
此时在config模块中读取nacos中的配置文件可以指定namespace和group
spring:
cloud:
nacos:
config:
server-addr: 192.168.204.129:8848
file-extension: yaml
prefix: nacos-config
namespace: a66ca122-fb24-46ba-bde0-58508c2d6689 #开发环境dev
group: NACOS_GROUP #nacos项目
服务隔离
consumer调用provider
namespace不同、group不同:调用失败
测试结果
修改consumer配置文件的namespace和group
测试结果
Nacos持久化
Nacos默认有自带嵌入式数据库derby,但是如果做集群模式的话,就不能使用自己的数据库,不然每个节点一个数据库,数据就不统一了,需要使用外部的mysql
切换Nacos使用的数据库
修改/usr/local/nacos/conf/application.properties文件
关闭注释, 切换为mysql数据库(目前只支持mysql,版本要求:5.6.5+)
初始化数据库
创建nacos数据库并导入sql到mysql中
测试
重启nacos
因为更换了数据源,在nacos网站中重新创建配置文件:注意Data ID和Group
测试nacos所有写到嵌入式数据库的数据是否都写到了mysql