Spring Cloud
Spring cloud 是分布式微服务架构的一站式解决方案,它提供了一套简单易用的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务系统的构建。
Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
- 分布式是指在网络中的多个计算机或服务器上进行协作处理的一种计算方式。在分布式系统中,各个计算节点可以相互协作,在不同的计算节点上执行不同的任务或数据处理,共同完成一个整体的计算任务。
- 集群是指将多台计算机或服务器组合成一个整体,通过共享计算资源和协同工作来提供更高的计算能力和可靠性。在一个集群中,各个计算节点可以独立运行,但彼此之间通过网络连接进行通信和协作,共同完成某个任务或提供某种服务。
什么是微服务
微服务(MicroServices)最初是由 Martin Fowler 于2014 年发表的论文《MicroServices》 中提出的名词,它一经提出就成为了技术圈的热门话题。
微服务,我们可以从字面上去理解,即“微小的服务”
所谓“服务”,其实指的是项目中的功能模块,它可以帮助用户解决某一个或一组问题,在开发过程中表现为 IDE(集成开发环境,例如 Eclipse或 IntelliJ IDEA)中的一个工程或 Moudle。
“微小”则强调的是单个服务的大小,主要体现为以下两个方面:
- 微服务体积小,复杂度低:一个微服务通常只提供单个业务功能的服务,即一个微服务只专注于做好一件事,因此微服务通常代码较少,体积较小,复杂度也较低。
- 微服务团队所需成员少:一般情况下,一个微服务团队只需要8到10 名人员(开发人员2到5名)即可完成从设计、开发、测试到运维的全部工作。
微服务架构
微服务架构是一种系统架构的设计风格。与传统的单体式架构(ALL IN ONE)不同,微服务架构提倡将一个单一的应用程序拆分成多个小型服务,这些小型服务都在各自独立的进程中运行服务之使用轻量级通信机制(通常是 HTTP RESTFUL API)进行通讯。
通常情况下,这些小型服务都是围绕着某个特定的业务进行构建的,每一个服务只专注于完成一项任务并把它做好,即“专业的人做专业的事”
每个服务都能够独立地部署到各种环境中,例如开发环境、测试环境和生产环境等,每个服务都能独立启动或销毁而不会对其他服务造成影响。
这些服务之间的交互是使用标准的通讯技术进行的,因此不同的服务可以使用不同数据存储技术,甚至使用不同的编程语言。
微服务与单体架构
单体架构是微服务架构出现之前业界最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。
在项目的初期,单体架构无论是在开发速度还是运维难度上都具有明显的优势。但随着业务复杂度的不断提高,单体架构的许多弊端也逐渐凸显出来,主要体现在以下3个方面:
- 随着业务复杂度的提高,单体应用(采用单体架构的应用程序)的代码量也越来越大,导致代码的可读性、可维护性以及扩展性下降。
- 随着用户越来越多,程序所承受的并发越来越高,而单体应用处理高并发的能力有限。
- 单体应用将所有的业务都集中在同一个工程中修改或增加业务都可能会对其他业务造成一定的影响,导致测试难度增加。
服务注册与发现
Eureka是Netflix中的一个开源框架。它和zookeeper、Consul一样,都是用于服务注册管理的。
Nacos(全称为 Alibaba Cloud Native Controlling System)是一个开源的服务发现、配置管理和服务管理平台,由阿里巴巴集团开发和维护。Nacos提供了一系列的核心功能,包括服务注册与发现、配置管理和动态路由等,可以帮助开发者轻松构建和管理微服务架构。
Nacos 作为服务注册中心可以实现服务的注册与发现
在图中共涉及到以下3个角色:
- 服务注册中心(Register Service):它是一个Nacos Server,可以为服务提供者和服务消费老提供服务注册和发现功能。
- 服务提供者(Provider Service):它是一个Nacos Client,用于对外服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现和调用。
- 服务消费者(Consumer Service):它是一个Nacos Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。
安装和运行Nacos Server
官网下载:Nacos Server 下载 | Nacos 官网
在解压后的bin目录中通过cmd启动服务
浏览器访问:localhost:8848/nacos
搭建项目
创建Maven项目
在pom.xml文件中配置子模块依赖版本信息管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
在项目中新建Maven模块
项目资源管理器中如图所示:
1.在模块的pom.xml文件中导入启动依赖:版本由父级项目进行约束
<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-discovery</artifactId>
</dependency>
</dependencies>
2.在src/main/java中创建包com.easy,在其中创建启动类
在启动类上添加注解 @EnableDiscoveryClient 作为服务与注册的客户端
@SpringBootApplication
@EnableDiscoveryClient
public class GoodsApplication8802 {
public static void main(String[] args) {
SpringApplication.run(GoodsApplication8802.class, args);
}
}
3.创建controller包并创建控制类,使用注解指定请求方式
可以使用 @Value 注解获取yml配置文件中的属性
@RestController
public class GoodsController {
@Value("${server.port}")
private int port;
@RequestMapping(method = RequestMethod.GET,value = "goods")
public String getGoods() {
return "easygoods ------"+port;
}
}
4.在resources文件夹中创建application.yml配置文件
5.启动项目注册服务
同样的方式注册8802,注册成功
6.测试访问
服务之间的通信
同样的方式创建order模块并配置application.yml
导入负载均衡等相关依赖,默认负载均衡策略为:轮询
<dependencies>
<!-- 负载均衡 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
在controller包创建控制类
@RestController
public class OrderController {
@Autowired
OrderService orderS;
@RequestMapping(method = RequestMethod.GET,value = "order")
public String getOrder(){
return orderS.getOrder();
}
}
在config包下创建配置类用于负载均衡
@Configuration
public class EasyConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在service包下创建创建服务类与easygoods进行通信
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public String getOrder(){
String result=restTemplate.getForObject("http://easygoods/goods",String.class);
return "orderService ------商品数据:"+result;
}
}
两次请求轮询从服务的两个实例中获取数据
配置中心
配置中心是Nacos提供的一个核心功能,用于集中管理微服务架构中的各种配置信息。
在微服务架构中,每个微服务都有自己的配置需求,例如数据库连接信息、日志级别、缓存配置等。传统的做法是将这些配置信息硬编码到每个微服务的代码中,但这样做会导致配置分散、难以管理和修改。而使用Nacos作为配置中心,可以将所有的配置信息集中存储和管理,使得配置的修改和更新变得更加方便和快捷。
Nacos提供了一个统一的配置管理中心,可以将配置信息按照不同的命名空间进行划分和管理。在配置中心中,开发者可以添加、修改、删除和查询配置信息。Nacos还支持实时的配置推送功能,当配置信息发生变化时,Nacos可以实时将新的配置信息推送给订阅该配置的微服务实例,从而实现动态的配置更新。
代码实现
创建config模块用于测试
1.在pom.xml中导入相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2.在resources文件夹中创建bootstrap.yml,包括服务名,地址,配置文件类型等
3.创建启动类
@SpringBootApplication
public class EasyConfigApplication9911 {
public static void main(String[] args) {
SpringApplication.run(EasyConfigApplication9911.class, args);
}
}
4.创建控制类,使用 @Value 注解,获取yml文件中的指定属性,这里设置默认值hello
使用 @RefreshScope 注解:实时获取刷新配置
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${app.name:hello}")
private String appName;
@RequestMapping("/get")
public String get() {
System.out.println(appName);
return appName;
}
}
5.启动服务后
新建配置并发布
登录Nacos控制台(默认是localhost:8848/nacos),在配置管理->配置列表中添加你的配置
Data ID的命名规则通常是${prefix}-${spring.profiles.active}.${file-extension}
其中prefix默认为spring.application.name的值,但你也可以自定义。
配置应用成功
编辑配置内容
配置实时生效