SpringCloud初识
什么是微服务
微服务最早是由马丁弗勒在2014年提出。
是一种架构模式,它提倡将单一应用程序划分为一组小的服务
每个服务都存在自己的进程。
服务之间相互调用 (使用RestFulApi )最终实现一个完整的项目。
- SpringBoot就是以向微服务技术。编写的项目可以独立运行。
- SpringCloud是将微服务的管理技术。
SpringCloud
在进行各个微服务之间调度的时候,存在很多的问题。
- 服务之间的调用
- 服务的熔断
- 服务的注册发现
- 服务的负载均衡
等
准对每一项的问题都有不同的解决方案,但是解决方案很多,存在于不同的厂家。为了兼容性
SpringCloud将这些问题解决整合起来
准对每一项的问题都有不同的解决方案,但是解决方案很多,存在于不同的厂家。为了兼容性
因为Spring的IOC,SpringBoot的自动装配,所以SpringCloud可以更加方便的将以上不同公司开发的微服务问题解决方案整合在一起。就是SpringCloud技术
SpringCloud是一个技术的集合。
SpringCloud=分布式微服务架构的一站式解决方案
是多种微服务架构落地技术的集合体
Spring中的技术有多少
技术分布
随着时间的更新,很多地方都存在变化
SpringCloud版本
SpringCloud与SpringBoot之间的版本存在兼容的问题
- Boot是以数字作为版本
- cloud是以英文作为版本(伦敦地铁的号)
现在SpringBoot基本上都是2.0的版本
SpringBoot2之后存在很多的更新技术,而且已经稳定。
SpringBoot的版本更新特别快,基本上两个星期就是一次小更新
SpringCloud版本
SpringCloud的版本号是伦敦地铁站编号,我跟随硅谷的视频主要操作H版本
A,B,C,D,F~~~
SpringCloud与SpringBoot的版本对应
查看版本对应详细
通过监控指标的info展示
https://start.spring.io/actuator/info
你们的浏览器展示可能是json串。这里我使用的是CSDN的浏览器插件
可以方便进行浏览器json数据的转换。
SpringCloud中的技术组件
随着时间推移,很出现新的技术更新旧的技术
不同的解决方案技术也随着改变
SpringCloud的搭建
SpringBoot是一个和微服务框架,SpringCloud是为了解决微服务的问题出现的(分布式微服务管理框架)
我们搭建SpringCloud是在SpringBoot的基础上进行添加一个一个的组件(nacos)(loadBalancer)(openfeign)等从而形成的cloud模块
查看最初项目结构
IDEA设置字符编码
IDEA注解激活
IDEA的java编译版本
IDEA的文件过滤
我们在使用IDEA创建项目的时候总是伴随着其他的文件,这些文件我们不会去编写,在Git提交远程库也不会进行提交。我们就可以将这些文件进行过滤
指定的文件添加进去进行过滤
搭建父项目
我们在学习Maven的时候知道了多模块开发。
父工程可以管理子工程的jar文件。
我们可以通过Maven多模块开发来通过一个父工程,管理多个子工程
每一个子工程都是一个SpringBoot微服务。从而模拟服务之间的调度问题。在通过cloud技术给出解决
父工程操作
因为父工程不需要代码,只需要管理jar文件。
所以只保留pom文件即可
添加依赖
为了统一jar包的管理
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringCloudStu</groupId>
<artifactId>SpringCloudStu</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<!--//父项目管理子项目-->
<dependencyManagement>
<dependencies>
<!--springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--<!–spring cloud alibaba 2.1.0.RELEASE–>-->
<!--<dependency>-->
<!--<groupId>com.alibaba.cloud</groupId>-->
<!--<artifactId>spring-cloud-alibaba-dependencies</artifactId>-->
<!--<version>2.1.0.RELEASE</version>-->
<!--<type>pom</type>-->
<!--<scope>import</scope>-->
<!--</dependency>-->
</project>
我这里先引入这些两个jar文件,夫工程可以管理很多。
这一点我们要知道
构建子项目
我们都知道使用框架,需要:(约定大于配置大于编码)
下面我们具体操作的就是子项目。多个子项目之间的调度属于SpringCloud技术
子模块的搭建步骤
- 建module
- 改pom
- 写yml
- 主启动
- 业务类
建module
引入依赖
这个字模块说白了就是SpringBoot
我们需要引入SpringBoot的依赖。它的父项目中提供的
SpringBoot和cloud的dependences依赖,我们可以不去指定版本号了
<!--针对于SpringBoot的MVC操作-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--针对与SpringBoot的监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
我上面并没有引入太多,不如数据库的操作。我觉得一步一步来就行了
写yaml
这里因为没有指定数据库,我就设定一个端口号吧
server:
port: 8881
主启动
//主启动
@SpringBootApplication
public class ModuleOne {
public static void main(String[] args) {
SpringApplication.run(ModuleOne.class,args);
}
}
其他组件,比如控制器等操作
@Controller
public class OneController {
@RequestMapping("/oneShow")
@ResponseBody
public String oneShow(){
return "show";
}
}
查看整体的目录结构
结果
当然一个子模块肯定是不能演示之间的调度的
分析SpringBoot项目和前端
- 因为我们在javaWeb的时候很多前端和后端还是耦合在一起的。
- 之后我们会接触到前后端分离,前端负责页面展示。后端提供方法
- 也就是控制器中的请求可以获取json字符串给前端,前端拿到数据就可以做处理了。属于vue的技术范畴了
- 可能之后我学习的时候回去整理一下
热更新dev—tools
在SpringBoot中我们就知道热部署,我们不需要在手动的进行重启,这样也麻烦,所以下面复习一下dev-tools
引入依赖
<!--用于热部署的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
引入插件
<build>
<!--引入名字方便我们查看-->
<finalName>ModuleOne</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
打开自动编译
设置选择,保存确定
设置更新
打开设置快捷键ctrl+shift+alt+/
允许自动重启
重启即可
测试
我们手动的改变代码。不去重启主程序。
IDEA会自动给我进行更新操作。
有些IDEA可能会自动地添加热部署
开发阶段为了我们的方便,开启热部署,项目部署的时候。就不需要热部署了
子项目之间的调用
我们想要子项目之间调用,一个子项目肯定是不行的。我们需要第二个
SpringBoot其实内部自动装配了 RestTemplate。
可以完成我们通过Restful方式远程访问.
查看项目结构
搭建其他模块,参考上面。
注意设置端口不一样才行,因为每一个SpringBoot都是一个进程
RestTemplate操作
想要做的操作module2调用module1的请求
引入RestTemplate组件
RestTemplate组件每个模块都可以去引入。
只要该模块需要访问请他模块请求就可以进行引入
//主启动
@SpringBootApplication
public class ModuleTwo {
public static void main(String[] args) {
SpringApplication.run(ModuleTwo.class,args);
}
// 因为主启动类也是一个 SpringBoot的配置类
// 我们通过配置类 像容器中添加一个 RestTemplate组件
// 可以进行远程访问 restful请求
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
因为现在是module2待用module1所以在module2中引入
操作RestTemplate
module2的控制器展示
@Controller
public class TwoController {
// 获取RestTemplate组件
@Autowired
private RestTemplate restTemplate;
// 添加请求
@RequestMapping("twoshow")
@ResponseBody
public String twoShow() {
// 在module2 中 通过RestTemplate 调用指定的请求
String forObject = restTemplate.getForObject("http://localhost:8881/oneShow", String.class);
return "调用module1返回的结果:" + forObject;
}
}
以上我没有操作数据库。因为为了简单展示
RestTemplate使用可以自行API查找
- delete():在特定的URL上对资源执行HTTP DELETE操作;
- exchange():在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的;
- execute():在URL上执行特定的HTTP方法,返回一个从响应体映射得到的对象;
- getForEntity():发送一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象;
- getForObject():发送一个HTTP GET请求,返回的请求体将映射为一个对象;
- postForEntity():POST 数据到一个URL,返回包含一个对象的ResponseEntity,这个对象是从响应体中映射得到的;
- postForObject():POST 数据到一个URL,返回根据响应体匹配形成的对象;
- headForHeaders():发送HTTP HEAD请求,返回包含特定资源URL的HTTP头;
- optionsForAllow():发送HTTP OPTIONS请求,返回对特定URL的Allow头信息;
- postForLocation():POST 数据到一个URL,返回新创建资源的URL;
- put():PUT 资源到特定的URL;
- getMessageConverters():