简介:什么是微服务?


  • 就目前而言,对于微服务业界并没有一个统一的、标准的定义

  • 但通常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。


以上是业界大佬Martin Fowler的原话,算是目前对微服务最好的诠释,这个问题也经常被面试官提到,所以这段话还是必须得记下来。



前言:由于springcloud的更新特别频繁,而且springboot和springcloud版本之间有相互依赖关系,如果版本不匹配,会发生很多奇怪的异常(这个问题特别恶心,我被这个坑过很多次),且后续我们还会在此项目中整合一系列第三方框架,都对版本依赖比较强,所以开始创建项目之前,声明一下本项目的开发环境:


  • springboot: 2.3.6
  • springcloud: Hoxton.SR9
  • jdk: 1.8
  • maven: 3.6.x
  • idea: 2020.2.1

tips:如果不想用此版本的springboot,可以在官网查询对应的版本依赖关系,根据自己需要选择合适的版本。

依赖关系:

https://start.spring.io/actuator/info">​https://start.spring.io/actuator/info​

spring官网:

https://spring.io/projects">​https://spring.io/projects​


后期我会采用maven父子结构来搭建微服务,便于jar包管理,接下来开始创建一个maven父工程一、打开idea,新建项目

从零开始搭建一整套微服务_maven

二、选择maven,jdk,勾选使用模板,选择maven-archetype-site模板

从零开始搭建一整套微服务_spring_02

三、选择项目存放的地址,填写Name和GroupId,其他的会自动填充

从零开始搭建一整套微服务_ide_03

四、选择maven,我这里选的是idea自带的版本,也可以选择自己安装的maven,版本不要低于3.5,点击finish

从零开始搭建一整套微服务_ide_04

五、创建完成后会看到以下的目录,然后把src目录整个删掉,到这里,一个父工程就搭建好了

从零开始搭建一整套微服务_ide_05

六、修改一下idea的编译环境,进入设置

从零开始搭建一整套微服务_maven_06

七、勾选启用注解

从零开始搭建一整套微服务_spring_07

八、修改pom文件,打包方式改为pom,添加依赖(详细配置查看git地址)从零开始搭建一整套微服务_maven_08


父工程创建完后,就开始建子工程,我们模拟一个经典的订单支付-消费的场景,后期会围绕这两个服务展开对各种组件的学习:

服务提供者  cloud-provider-payment

服务消费者  cloud-consumer-order

共通服务      cloud-api-commons

tips:考虑到后期服务会特别多,实体类的重复使用会造成很多冗余代码,这里抽出一个单独的服务来管理实体类以及一些共通的工具包等

一、选中项目名右键新建Module

从零开始搭建一整套微服务_maven_09

二、选择maven和jdk,这里有人喜欢选择Spring Initializer也可以,个人喜欢选择maven,因为这个创建出来的项目很干净,还有很多小细节也处理的好

从零开始搭建一整套微服务_ide_10

三、填写项目名(因为我用的是mac版idea,win版界面略有差别,但是要注意名字不要搞错)

从零开始搭建一整套微服务_maven_11

四、项目创建完以后,是一个标准的maven目录结构,没有springboot的相关文件,我们需要手动修改,先改pom文件,添加相关依赖(详细文件内容查看git地址)

从零开始搭建一整套微服务_maven_12

五、找到resources目录,右键New->File->application.yml

从零开始搭建一整套微服务_spring_13

    修改yml文件内容


server:
port: 8001
spring:
application:
name: cloud-provider-payment
datasource:
type: com.alibaba.druid.pool.DruidDataSource #
driver-class-name: com.mysql.jdbc.Driver #mysql
url: jdbc:mysql://localhost:3306/springcloud?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
username: root
password: 123456


mybatis:
mapper-locations: classpath:mapper/*.xml

六、找到java目录,右键New->Java Class

从零开始搭建一整套微服务_spring_14

从零开始搭建一整套微服务_spring_15

   修改主启动类


@SpringBootApplication
public class PaymentApplication {


public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class, args);
}
}

七、然后在现有工程创建业务类,目录结构如下

从零开始搭建一整套微服务_maven_16

八、建库建表,表结构如下,特别简单,两个字段


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;


-- ----------------------------
-- Table structure for payment
-- ----------------------------
DROP TABLE IF EXISTS `payment`;
CREATE TABLE `payment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`serial` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


SET FOREIGN_KEY_CHECKS = 1;

九、按照上面的流程,创建工程cloud-consumer-order及相关的业务类,cloud-api-commons工程因为不涉及业务流程,所以只需要创建实体类和工具包就可以

从零开始搭建一整套微服务_maven_17

说明:CommonResult是一个包装类,方便与前端数据交互


@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {


private Integer code;
private String message;
private T data;


public CommonResult(Integer code, String message){
this(code,message,null);
}
}

十、cloud-api-commons工程创建完以后,执行maven install,就可以在其他两个工程的pom文件引入依赖

从零开始搭建一整套微服务_spring_18

自己写个demo测试一下配置有没有成功,基本的springboot整合mybatis,这里不再赘述。


到这里,准备工作就完成了,接下来开始学习第一个组件:服务注册中心Eureka的配置与搭建从零开始搭建一整套微服务_maven_19


本项目已上传到gitee和github,地址在公众号窗口 我的->git 查看相关内容