最近简单了解了一下SpringCloud微服务,本篇对于SpringCloud进行一个简单总结,并使用nacos进行简单实例实现。
目录
前言
本篇所采用的框架为 Spring Cloud Alibaba,该框架基于SpringCloud改良的微服务框架,不仅包含了原来SpringCloud拥有的基本功能,还升级了其他部分内容
官方文档:
Spring Cloud:Spring Cloudhttps://spring.io/projects/spring-cloud
Spring Cloud Alibaba:spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibaba · GitHubSpring Cloud Alibaba provides a one-stop solution for application development for the distributed solutions of Alibaba middleware. - spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibabahttps://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.mdSpring Cloud Alibaba官网 | Spring AI + 阿里通义组件 | Springboot | 微服务实践教程 - Spring Cloud Alibaba官网 (aliyun.com)
https://sca.aliyun.com/ Nacos:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网Nacos 提供动态服务发现、配置和管理,助力用户在私有云、混合云、公有云等环境中快速构建和交付微服务平台,提升业务复用和创新交付速度,为用户赢得市场竞争力。
https://nacos.io/download/nacosserver/#%E7%A8%B3%E5%AE%9A%E7%89%88%E6%9C%AC
环境配置:
- JDK1.8
- NACOS
一、SpringCloud微服务基础概念
1.集群
同一个业务,部署在不同的服务器上面,为高并发的使用提供条件。
2.分布式
同一个业务,拆解成多个子业务,部署在不同的服务器上面,每个子业务都可以做成集群,目的是为了分摊服务器的压力。
3.微服务
相对于分布式的服务来说,它的颗粒度更小,可以实现精细化管理,使得整体项目的耦合度更低。
每个微服务都可以单独部署,进行开发测试,拥有自己的开发生命周期,这样的设计敏捷性更高,这些多个微服务最终都会整合为一个微服务框架。
二、微服务开发简单介绍
1.关键技术
- 开发技术:SpringBoot
- 治理技术:SpringCloud(微服务一站式解决方案)
- 部署技术:Docker,K8S,Jekins等
2.SpringCloud解决方案
- 注册中心:Euerka
- 负载均衡:Ribbn
- 声明式调用远程方法:OpenFeign
- 熔断 降级 监控:Hystrix
- 网关:Gateway
- 分布式配置中心:SpringCloud Config
- 消息总线:SpringCloud Bus
- 消息驱动:SpringCloud Stream
- 链路跟踪:Sleuth
3.SpringCloud Alibaba
- 服务注册配置中心:SpringCloudAlibaba Nacos
- 熔断 降级 限流:SpringCloudAlibaba Sentinel
- 分布式事务:SpringCloudAlibaba Seate
4.设计架构
三、实践开发
思想:将项目业务拆解为多个微服务后,到Nacos中进行注册
1.Nacos
(1)nacos简介
配置管理微服务,动态管理、配置服务,流量管理的软件
(2)nacos结构
(3)使用方法
解压安装 → 通过cmd进入nacos的bin文件夹中 → 输入命令行 startup.cmd -m standalone(选择采用独立模式)
注:如果使用的是PowerShell进行运行,命令前需要添加 .\ 即为 .\startup.cmd -m standalone
最后显示 Nacos started successfully 即为成功
点击Console后的网址进行访问
出现此页面即为成功,此时可以点击 服务管理 - 服务列表 进行查看,此时为空,接下来我们进行服务的添加
2.项目实践
(1)主要流程
创建maven项目 → 添加两个SpringBoot的子工程 → 添加依赖 → 编写配置文件 → 编写Controller层 → 运行查看nacos中是否添加服务
(2)详细步骤
创建工程这里就不进行赘述了,我们直接从依赖添加开始进行,注意的是选择的SpringBoot版本为2.7.6
这里以物流管理用户与订单为例,工程结构如下图所示:
① 添加依赖
将下列依赖添加到order-server与user-server的pom.xml中
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
<spring.cloud.version>2021.0.3</spring.cloud.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
② 编写配置文件
使用yml文件进行nacos配置
③ 编写控制层代码进行简单测试
首先在order-server子工程中进行测试
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
// http://localhost:8000/getOrderUid?uid=1001
@GetMapping("/getOrderUid")
public String getOrderUid(String uid) {
System.out.println("UID: " + uid);
return "UID: " + uid;
}
}
运行后控制台输出如下文本即为成功
Nacos中已经成功添加服务
使用对应端口进行访问:
测试成功
④ 为一个服务添加多个实例运行
运行后使用新实例的端口进行访问测试
nacos进行刷新,发现实例已经添加完成
⑤ 服务间通信的负载均衡
由于我的nacos版本较高,所以需要在user-server的pom.xml中添加一个依赖来启动SpringCloud的负载均衡
<!-- 升级spring cloud之后,Nacos消费者服务依赖该组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.6</version>
<type>pom</type>
</dependency>
编写配置类,开启负载均衡,采用轮询方式
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 RestTemplateConfig {
@Bean
@LoadBalanced //开启负载均衡 默认轮询模式
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
编写controller类,进行访问
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class OrderController {
@Autowired
DiscoveryClient discoveryClient; // 发现客户端
@Autowired
RestTemplate restTemplate;
// http://localhost:9000/getOrder?userId=1001
@GetMapping("/getOrder")
public String getOrder(@RequestParam(name = "userId") String userId) {
String requestUrl = "http://order-server/getOrderUid?uid=" + userId;
// 调用 nacos 上面的服务 负载均衡策略实现
String str = restTemplate.getForObject(requestUrl, String.class);
System.out.println(str);
return str;
}
}
运行后,会在两个服务之间轮流执行
至此一个简单的SpringCloud工程就搭建完成了
总结
本篇简单介绍了SpringCloud的基础概念与微服务开发,并简单实现了一个客户端交互的负载均衡,以上仅做一个简单示例;
在日常开发中,我们的小项目没有高并发的情况,SpringCloud并不是必须的,而在企业级生产中微服务的使用就十分必要了。
注意事项
- nacos安装时本地的环境变量中JDK过多将安装失败,确保环境中只进行了一个环境变量的配置;
- SpringBoot、SpringCloud与Alibaba注意版本对应
- yml文件中的配置编写注意事项:
#大小写敏感
#数值前面必须要有空格作为分隔符
#使用缩减方式表示层级关系 只能使用空格不能使用tab 缩进空格数量不重要,只需要对齐就可以了