背景
完成一个用户拼团的新手任务,从零开始搭建一个使用微服务架构并提供REST接口的项目,其中使用到了SpringBoot、Dubbo、Mybatis、ShardingJDBC、zebra、lion、cat等框架和中间件,现在回顾总结并记录成文,方便以后参考及帮助到有需要的同学。
目录
1. 入门
- 1.1 使用Gradle搭建工程
- 1.2 SpringBoot入门
- 1.3 ZooKeeper入门
- 1.4 集成Dubbo框架
- 1.5 docker安装MySQL
- 1.6 集成Mybatis
- 1.7 集成缓存中间件
- 1.8 单元测试
2. 进阶
- 2.1 定制SpringBoot配置
- 2.2 MySQL主从复制
- 2.3 接入分库分表中间件
- 2.4 接入配置中心
- 2.5 接入监控中心
1.1-1.3 本文
1.4-1.8 第二篇
2.1-2.5 第三篇
一. 使用Gradle搭建工程
1.1 基本概念
构建工具,基本使用跟maven一样,项目构建文件为build.gradle。
主要配置项为项目结构和依赖,不同于maven的是需要每个项目都配置仓库地址。
plugins {
id 'java'
}
group 'com.xxx'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'redis.clients', name: 'jedis', version:'2.6.0'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
1.2 注意点
- 与Java10有兼容性问题,新建、导入项目时使用本地的gradle包,使用gradleW会有问题。
- dependencies的jar包位置:
C:\Users\XXX\.gradle\caches\modules-2\files-2.1
1.3 打包
- 创建manifest.yml
---
applications:
- name: gs-rest-service
memory: 256M
instances: 1
host: rest-service
domain: guides.spring.io
path: build/libs/gs-rest-service-0.1.0.jar
- 运行gradle的build命令即可打
二. SpringBoot入门
约定优于配置的思想,太赞了,对于初学者来说非常友好。
传统的spring java Web应用:
- 配置web.xml
- 配置applicationContext.xml
- 将应用打成war包放入应用服务器(Tomcat, Jetty等)中并运行
而在springBoot中,以上3点都不需要
2.1 引入依赖
以gradle为例
dependencies {
compile("org.springframework.boot:spring-boot-starter-web")
testCompile('org.springframework.boot:spring-boot-starter-test')
}
引入依赖spring-boot-starter-web,包括:
- spring-web, spring-webmvc(Spring WebMvc框架)
- spring-* (Spring框架)
- tomcat-embed-* (内嵌Tomcat容器)
- jackson (处理json数据)
- spring-boot-autoconfigure (自动配置功能)
2.2 应用入口
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
SpringApplication启动后:
- 在内嵌的Tomcat容器中启动一个Spring的应用上下文,监听默认的tcp端口8080(默认约定)
- 默认配置Spring WebMvc:
- 2.1 Servlet容器默认的Context路径是/
- 2.2 DispatherServlet匹配的路径(servlet-mapping中的url-patterns)是/*
2.3 controller
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
return new Greeting(counter.incrementAndGet(),
String.format(template, name));
}
}
默认使用Jackson序列化,返回json数据
2.4 单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class GreetingControllerTests {
@Autowired
private MockMvc mockMvc;
@Test
public void noParamGreetingShouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/greeting")).andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.content").value("Hello, World!"));
}
@Test
public void paramGreetingShouldReturnTailoredMessage() throws Exception {
this.mockMvc.perform(get("/greeting").param("name", "Spring Community"))
.andDo(print()).andExpect(status().isOk())
.andExpect(jsonPath("$.content").value("Hello, Spring Community!"));
}
}
2.5 运行测试
- 直接run application
- 使用gradle的task:application的bootrun启动
- 使用gradle的task:build生成jar包,然后java -jar xxx.jar启动
然后打开浏览器,localhost:8080\xxx即可访问
三.ZooKeeper入门
作为分布式服务的注册、调度中心使用【分布式下的多服务管理,就像管理各种习性不一的物种一样,故名ZooKeeper】
3.1 安装
- 下载tar包,解压
- 重命名conf文件夹下的初始配置文件为zoo.cfg:指定端口、心跳时间、data文件路径、log文件路径
3.2 运行
- 启动zk的服务端
- 可启动zk的客户端测试,或者直接启动dubbo服务注册到zk
- zkclient