【从单体架构到分布式架构】
本系列文章希望用浅显直白的语言介绍架构发展过程中遇到的各种问题,以及对应的解决方案和优缺点。
在正式学习之前,开发环境需要做好哪些准备呢?
我们为什么要选择使用 Spring Boot 呢?
Spring Boot 和 Spring 是两个截然不同的框架么?
本课程在学习过程中,会有大量的代码配合讲解,所以在正式学习之前,你需要做好以下准备。
必备;本课程所有代码基于 JDK 1.8 编写。
C:\>java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
1.2 Maven
必备;本课程所有代码基于 Maven 构建;如果你在电脑上安装好了 Maevn,建议把 Maven 仓库的地址修改成一个国内的网站地址。
C:\>mvn -v
C:\
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:4
7+08:00)
Maven home: D:\Program Files\apache-maven-3.3.9\bin\..
Java version: 1.8.0_171, vendor: Oracle Corporation
Java home: D:\Program Files\Java\jdk1.8.0_171\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"
1.3 IDE
必备;选择一个你熟悉的 IDE,我使用的是 Eclipse,这里要注意,有些 IDE 需要进行一些 Maven 环境变量的配置。
必备;建议在本机上安装一个 MySQL 数据库;为了方便操作,最好安装一个自己熟悉的数据库可视化工具,也可以使用 MySQL 自带的 MySQL Workbench。
非必备;本课程所有代码都上传到了 github ,可以通过 git clone 下载所有代码,如果你未安装相关软件,也可以直接下载压缩包。
非必备;在讲解的过程中,会经常进行接口测试,包括接口压力测试,建议安装 SoapUI 或 PostMan 或其他类似的软件。
在有 Spring Boot 之前,Spring 框架是当时很火的一个框架(现在也很火),不过随着使用 Spring 框架的人越来越多,Spring 从一个简洁的框架,慢慢地变成大而全;Spring 能够支持的组件越来越多,需要引入的配置文件也越来越多,这也就是我们经常听到的"配置文件爆炸"、"配置炼狱";
Spring 也意识到这个问题,而且随着微服务概念的兴起,也需要有一个可以支持快速开发微小独立应用的框架;在 2012年10月,Spring JIRA 中创建了一个功能请求,要求在 Spring 框架中支持无容器 Web 应用程序体系结构;这个功能要求促使了 2013年 Spring Boot 项目的研发。继而在 2014年4月,Spring Boot 1.0.0 发布。
本章节项目的代码:
https://github.com/CodeDaShu/ArchitectureEvolution/tree/master/chapter1
如果你能连接互联网,可以打卡 start.spring 这个网址,Spring 提供了一个在线生成 Spring Boot 项目的功能。
图中的 GroupID 和 ArtifactID 组合起来被称作“坐标”,是为了保证项目的唯一性所提出来的,如果你的项目要被上传到 Mavan 仓库中,可以根据 GroupID + ArtifactID 找到你的项目。
这里我们这样填写,点击 Genarate 按钮生成项目 :
GroupID = com.archevolution
ArtifactID = chapter1 //表示是第一章节的项目,后面的章节如果有代码,都会建立单独的项目,GroupID 保持不变,ArtifactID 对应相应的章节
Search dependencies to add = Web
Step 3. 导入项目
将下载好的项目解压,然后通过 [Import Existing ] 导入到 Eclipse 中,到了这一步,我们就有了第一个基于 Spring Boot 的项目了。
如果跳过这一步也是可以的,这样项目默认的端口是 8080。
修改 application.properties 文件为 application.yml 文件,配置项目访问端口:
server:
port: 8082
Step 5. 创建第一个接口
在 src/main/java/com/archevolution/chapter1 下新建 package Controller 作为项目的控制层,并新建 UserController 类,代码如下:
package com.archevolution.chapter1.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@RequestMapping(value = "/queryAdmin")
public String queryUser(){
return "User : Admin";
}
}
Step 6. 启动项目并测试接口
在 Chapter1Application 类中的空白处,选择 [Run As - Java Application] 运行项目;
待项目启动后,通过接口测试软件或直接打开浏览器输入:
http://127.0.0.1:8088/queryAdmin
输出结果:
User : Admin
4. Spring Boot 的优势
我们为什么要学习,这就要看看 Spring Boot 可以给软件开发带来什么样的好处。
Spring Boot 已经完成了与很多框架的集成,当我们想在自己的项目中集成某一种框架的时候,只需要配置 Starter ,Spring Boot 会自动帮我们完成相关的配置和相关的依赖(引入什么 jar 包、jar 包的版本、是否需要引入其他的 jar 包等等),开发人员不需要关心框架整合的问题。
已经制定好一套规则了,如果你遵守的话,就不用再写配置了,如果你不打算遵守的话,再写配置告诉程序你想怎么样;
比如你的项目要使用内置的 Tomcat,端口默认是 8080,你可以不做任何配置,但是当你想修改端口为 8088(不遵守规则),那么你就需要增加配置,设置 server.port = 8088 。
Spring Boot 可以通过很多方式进行配置,而配置是有优先级的,优先级高的会覆盖优先级低的配置。
最常用的配置中:
命令行参数 > 系统环境变量 > YAML 配置文件 > 默认参数
比如我们在启动的时候设置: java-jar springboot.jar--server.port=9090
在配置文件中设置: server.port=8888
那么启动后的应用端口将是 9090
。
在很多实际项目中,都会分成开发环境、测试环境、(准生产环境)、生产环境等等,不同的测试环境配置文件多多少少会有一些不同,传统的项目中,我们都是有多个代码基线,不同的代码极限中,配置文件的内容是不相同的。
那么 Spring Boot 项目中会通过什么方式实现在不同的环境中使用不同的配置呢?
通常我们会在一个程序包中设置多个配置文件,然后通过配置文件、启动命令、设置服务器环境变量等方式,指定生效的配置文件。
有些同学看到这里可能会有疑问,感觉没有什么差别啊,两个环境中,总会有一个配置文件是不相同的;但实际上 Spring Boot 可以有好多中配置的方式;
比如我们可以在启动命令中设置哪个配置文件生效:
当然,如果你害怕启动命令敲错了,可以直接将启动命令写成 sh 脚本,通过脚本启动;或者直接将其作为环境变量,配置到服务器上。
因为 Spring Boot 内置了 web 容器,所以可以让应用像本地程序一样启动运行,但并不是说 Spring Boot 只能通过内置的 Tomcat 或 Jetty 运行。
Spring 应用的运行方式有两种:
使用 jar 的方式无序在部署 web 容器,似的调试和部署更加的简单,适合大规模的快速部署;但同时也会导致应用包体积过大,而且内置 web 容器的相关配置修改起来比较困难。
使用 war 包部署,一般 web 容器都有功能比较强大的可视化界面,管理起来更为简单,数据源也可以交给 web 容器进行管理,应用体积比较小;但同时需要开发或运维人员搭建和维护 web 容器,应用和容器也可能会存在兼容性的问题。
有些注解不一定是 Spring Boot 才有或者独有的,可能是 Spring 、Spring MVC 或其他框架的,但根据常见程度我也列出来了。
用在 Spring Boot 的主类上,标识着这个应用是一个 Spring Boot 应用, @SpringBootApplication
又是三个注解的组合,包含了:
@SpringBootConfiguration
:源于 @Configuration
,作用就是将当前类标注为配置类;@EnableAutoConfiguration
:自动配置,让 Spring Boot 应用将所有 @Configuration
配置都加载到 IoC 容器中;@ComponentScan
:将一些标注了特定注解的 bean 注册到 IoC 容器中,比如: @Controller
、 @Component
、 @Entity
等等。用于将加载 xxxx.xml
文件中的配置;比如老的 Spring 项目迁移到 Spring Boot 上,可以使用这个标签加载制定的配置文件。
@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class Chapter1Application {
public static void main(String[] args) {
SpringApplication.run(Chapter1Application.class, args);
}
}
5.6.3 @Autowired
自动装配,会在 IoC 容器中查询对应类型的 Bean,如果查询到了,就装配上,如果查询不到,那么会抛出异常; @Autowired
可以消除 set、get 方法,对应着 XML 配置文件中的:
@SpringBootApplication
@ImportResource("classpath:beans.xml")
public class Chapter1Application {
public static void main(String[] args) {
SpringApplication.run(Chapter1Application.class, args);
}
}
5.6.4 Controller 相关
@Controller
:标记在一个类上,表示这是一个 Controller 对象,是一个控制器类;@RestController
:等于 @Controller
和 @ResponseBody
的组合,方法返回的对象可以直接转化成 JSON 格式;@RequestParam
:接收请求头 Request Head 中的内容,比如 Content-Type
标识了具体请求中的资源类型,常用的 application/xml
、 application/json
等等。PathVariable
:获取 url 中的参数;RequestBody
:读取请求体 Request Body ,并将其反序列化成 Java 对象;@RequestMapping
:将 http 请求映射到控制器上,也就是将请求路径和其处理类和方法进行绑定。5.6.5 Bean相关
@Service
:用于标注服务层组件,表示这是一个 Bean,Bean 的名称默认为当前类的名字,也可以传递参数,指定 Bean 的名称;@Repository
:数据库访问组件,也就是 DAO 层;@Scope
:用于配置作用域,比如设置 singleton 表示单例,prototype 每次都会创建一个新的对象等等;@Entity
:实体类,可以使用 @Table
注解和数据库中的表绑定,主键使用 @Id
标注,其余字段使用 @Column
进行标注(如果保持属性名和字段名一致,可以省略 @Column);@Component
:当组件不好归类的时候,可以使用 @Component
进行标注;@Autowired
:当我们需要使用组件的时候,可以使用 @Autowired
实现的 Bean 的自动注入。在本节课中,我们学习了 Spring Boot 的概念、历史、优点、常见知识点,以及搭建了一个最简单的 Spring Boot 应用;现在我们项目的架构是这样的,不要笑,就是这么“简陋”。
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。