1、 Spring Cloud
Spring Cloud是一款基于 Spring Boot 实现的微服务框架
Spring Cloud 并不是一个拿来即可用的框架,它是一种微服务规范,共有以下 2 代实现:
第一代实现:Spring Cloud Netflix
第二代实现:Spring Cloud Alibaba
1.1、Spring Cloud 的常用组件如下表所示。
Spring Cloud 组件 | 描述 |
Spring Cloud Netflix Eureka | Spring Cloud Netflix 中的服务治理组件,包含服务注册中心、服务注册与发现机制的实现。 |
Spring Cloud Netflix Ribbon | Spring Cloud Netflix 中的服务调用和客户端负载均衡组件。 |
Spring Cloud Netflix Hystrix | 人称“豪猪哥”,Spring Cloud Netflix 的容错管理组件,为服务中出现的延迟和故障提供强大的容错能力。 |
Spring Cloud Netflix Feign | 基于 Ribbon 和 Hystrix 的声明式服务调用组件。 |
Spring Cloud Netflix Zuul | Spring Cloud Netflix 中的网关组件,提供了智能路由、访问过滤等功能。 |
Spring Cloud Gateway | 一个基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关框架,它使用 Filter 链的方式提供了网关的基本功能,例如安全、监控/指标和限流等。 |
Spring Cloud Config | Spring Cloud 的配置管理工具,支持使用 Git 存储配置内容,实现应用配置的外部化存储,并支持在客户端对配置进行刷新、加密、解密等操作。 |
Spring Cloud Bus | Spring Cloud 的事件和消息总线,主要用于在集群中传播事件或状态变化,以触发后续的处理,例如动态刷新配置。 |
Spring Cloud Stream |
Spring Cloud 的消息中间件组件,它集成了 Apache Kafka 和 RabbitMQ 等消息中间件,并通过定义绑定器作为中间层,完美地实现了应用程序与消息中间件之间的隔离。通过向应用程序暴露统一的 Channel 通道,使得应用程序不需要再考虑各种不同的消息中间件实现,就能轻松地发送和接收消息。 |
Spring Cloud Sleuth | Spring Cloud 分布式链路跟踪组件,能够完美的整合 Twitter 的 Zipkin。 |
1.2、Spring Boot 和 Spring Cloud 的区别与联系
- Spring Boot 和 Spring Cloud 分工不同
Spring Boot 是一个基于 Spring 的快速开发框架,它能够帮助开发者迅速搭 Web 工程。Spring Cloud 是微服务架构下的一站式解决方案
- Spring Cloud 是基于 Spring Boot 实现的
- Spring Boot 和 Spring Cloud 依赖项数量不同
- Spring Cloud 不能脱离 Spring Boot 单独运行
Spring Cloud版本选择
“spring-cloud”: {
“Hoxton.SR12”: “Spring
Boot >=2.2.0.RELEASE and <2.4.0.M1”,
“2020.0.6”: "Spring Boot
=2.4.0.M1 and <2.6.0-M1",
“2021.0.0-M1”: “Spring Boot >=2.6.0-M1 and <2.6.0-M3”,
“2021.0.0-M3”: “Spring Boot >=2.6.0-M3 and
<2.6.0-RC1”,
“2021.0.0-RC1”: “Spring Boot >=2.6.0-RC1 and
<2.6.1”,
“2021.0.5”: “Spring Boot >=2.6.1 and ❤️.0.0-M1”,
“2022.0.0-M1”: “Spring Boot >=3.0.0-M1 and ❤️.0.0-M2”,
“2022.0.0-M2”: “Spring Boot >=3.0.0-M2 and ❤️.0.0-M3”,
“2022.0.0-M3”: “Spring Boot >=3.0.0-M3 and ❤️.0.0-M4”,
“2022.0.0-M4”: “Spring Boot >=3.0.0-M4 and ❤️.0.0-M5”,
“2022.0.0-M5”: “Spring Boot >=3.0.0-M5 and ❤️.0.0-RC1”,
“2022.0.0-RC1”: “Spring Boot >=3.0.0-RC1 and ❤️.0.0-RC2”,
“2022.0.0-RC2”: “Spring Boot >=3.0.0-RC2 and ❤️.1.0-M1”
}
2、Nacos discovery
Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队使用 Java 语言开发的开源项目。
Nacos 的命名是由 3 部分组成:
组成部分 | 全称 | 描述 |
Na | naming/nameServer | 即服务注册中心,与 Spring Cloud Eureka 的功能类似。 |
co | configuration | 即配置中心,与 Spring Cloud Config+Spring Cloud Bus 的功能类似。 |
s | service | 即服务,表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的。 |
Nacos两大组件
组件 | 描述 | 功能 |
Nacos Server |
Nacos 服务端,与 Eureka Server 不同,Nacos Server 由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。 |
Nacos Server 可以作为服务注册中心,帮助 Nacos Client 实现服务的注册与发现。 |
Nacos Server 可以作为配置中心,帮助 Nacos Client 在不重启的情况下,实现配置的动态刷新。 |
||
Nacos Client |
Nacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。 |
Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-discovery,在服务注册中心(Nacos Server)中实现服务的注册与发现。 |
Nacos Client 通过添加依赖 spring-cloud-starter-alibaba-nacos-config,在配置中心(Nacos Server)中实现配置的动态刷新。 |
Nacos 实现服务注册与发现的流程如下:
- 从 Nacos 官方提供的下载页面中,下载 Nacos Server 并运行。
- 服务提供者 Nacos Client 启动时,会把服务以服务名(spring.application.name)的方式注册到服务注册中心(Nacos Server);
- 服务消费者 Nacos Client 启动时,也会将自己的服务注册到服务注册中心;
- 服务消费者在注册服务的同时,它还会从服务注册中心获取一份服务注册列表信息,该列表中包含了所有注册到服务注册中心上的服务的信息(包括服务提供者和自身的信息);
- 在获取了服务提供者的信息后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务。
2.1、版本兼容说明
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
2.2、Nacos server安装
下载:
https://github.com/alibaba/nacos/releases/tag/2.0.4
2.3、启动nacos
Nacos Server 下各目录说明如下:
- bin:用于存放 Nacos 的可执行命令。
- conf:用于存放 Nacos 配置文件。
- target:用于存放 Nacos 应用的 jar 包。
进入bin目录,执行启动命令:startup.cmd -m standalone
用户名/密码:nacos/nacos
2.4、工程改造
1)父pom改造
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.5</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.4.0</version> <type>pom</type> <scope>import</scope> </dependency>
2)服务提供者改造
添加依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.4.0</version> </dependency>
添加配置
spring: application: name: app-provider-service #服务名 cloud: nacos: discovery: server-addr: localhost:8848
启动类加注解:
@EnableDiscoveryClient
启动应用,查看nacos后台
3)服务消费者改造
添加依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.0.4.0</version> </dependency>
添加配置:
spring: application: name: app-api-service #服务名 cloud: nacos: discovery: server-addr: localhost:8848 #Nacos server 的地址
启动类添加注解:
@EnableDiscoveryClient
4)Config配置
创建config文件夹,在下面添加LoadBalancedConfig配置
import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class LoadBalancedConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
2.5、调用者实例
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.Map; @RestController @RequestMapping("/user") public class UserController { private final static String SERVER_URL = "http://localhost:8080"; @Autowired private RestTemplate restTemplate; @GetMapping("/getUserName") public Map getUserName() { String url = SERVER_URL + "/user/getUserName"; Map map = restTemplate.getForObject(url , Map.class); map.put("type" , "caller"); return map; } }
3、Nacos discovery 集成openFeign
3.1、修改调用方配置文件
1、增加springcloud依赖
<dependencyManagement> <dependencies> <!--spring cloud 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.5</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.4.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
2、增加openFeign依赖项
<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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> </dependencies>
3.2、代码改造
1、在启动类增加openFeign配置
@EnableFeignClients
2、新增服务层接口:UserService
import com.hqyj.common.entity.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "app-provider-service") public interface UserService { @GetMapping("/user/getUserName") public User getUserName() ; }
3、改造控制层方法:
@Autowired private UserService userService; @GetMapping("/getUserName") public Map getUserName() { User user = userService.getUserName(); Map map = new HashMap(); map.put("code" , 200); map.put("data" , user); map.put("type" , "caller"); return map; }