diff --git a/README.md b/README.md
index 3a5b2dd..d726afe 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,13 @@
-# segmentfault-lession
-Segment Fault 在线讲堂 代码工程
+Segment Fault 在线讲堂 代码工程
+=====================================
-## Java 微服务实践 - Spring Boot 系列
+
+# [Java 微服务实战系列课堂](https://segmentfault.com/n/1330000009887617)
+
+
+
+## Java 微服务实践 - Spring Boot 系列 ([一键报名,更优惠!](https://segmentfault.com/ls/1650000011063780))
@@ -87,7 +92,7 @@ Segment Fault 在线讲堂 代码工程
-### [第九节 NoSQL](https://segmentfault.com/l/1500000009957330)([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-9))[[问答](https://segmentfault.com/l/1500000009957330/d/1560000010384965)]
+### [第九节 NoSQL](https://segmentfault.com/l/1500000009957330)([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-9)) [[问答](https://segmentfault.com/l/1500000009957330/d/1560000010384965)]
* 主要内容:
@@ -98,7 +103,7 @@ Segment Fault 在线讲堂 代码工程
-### [第十节 缓存](https://segmentfault.com/l/1500000009970812)([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-10))[[问答](https://segmentfault.com/l/1500000009970812/d/1560000010509920)]
+### [第十节 缓存](https://segmentfault.com/l/1500000009970812)([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-10)) [[问答](https://segmentfault.com/l/1500000009970812/d/1560000010509920)]
* 主要内容
@@ -109,7 +114,7 @@ Segment Fault 在线讲堂 代码工程
-### [第十一节 消息](https://segmentfault.com/l/1500000009971600)
+### [第十一节 消息](https://segmentfault.com/l/1500000009971600)([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-11)) [[问答](https://segmentfault.com/l/1500000009971600/d/1560000010580012)]
* 主要内容
@@ -121,22 +126,22 @@ Segment Fault 在线讲堂 代码工程
-### [第十二节 验证](https://segmentfault.com/l/1500000009971716)
+### [第十二节 验证](https://segmentfault.com/l/1500000009971716) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-12)) [[问答](https://segmentfault.com/l/1500000009971716/d/1560000010630935)]
* 主要内容
- * Bean Validation(JSR-303):介绍 Java Bean 验证、核心 API、实现框架 Hibernate Validator
+ * Bean Validation(JSR-303):介绍 Java Bean 验证、核心 API、实现框架 Hibernate Validator
* Apache commons-validator :介绍最传统 Apache 通用验证器框架,如:长度、邮件等方式
* Spring Validator:介绍 Spring 内置验证器 API、以及自定义实现
* Spring Boot 整合:解读 spring-boot-starter-validation
-### [第十三节 WebSocket](https://segmentfault.com/l/1500000009971764)
+### [第十三节 WebSocket](https://segmentfault.com/l/1500000009971764) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-13)) [[问答](https://segmentfault.com/l/1500000009971764/d/1560000010698298)]
* 主要内容
- * WebSocket(JSR-356):简介 WebSocket 协议、解释专业术语(如端点、端和会话等)
+ * WebSocket(JSR-356):简介 WebSocket 协议、解释专业术语(如端点、端和会话等)
* 生命周期:理解 WebSocket 生命周期(如:开启会话、关闭会话、接受消息等)
* 核心接口:介绍 Java WebSocket 中的核心API(如:@ServerEndpoint、@ClientEndpoint、@OnOpen等)
* 实现容器:当前实现 WebSocket 的主流容器,以及 Tomcat Comet 技术
@@ -144,61 +149,61 @@ Segment Fault 在线讲堂 代码工程
-### [第十四节 WebService](https://segmentfault.com/l/1500000009978309)
+### [第十四节 WebService](https://segmentfault.com/l/1500000009978309) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-14)) [[问答](https://segmentfault.com/l/1500000009978309/d/1560000010748545)]
* 主要内容
- * Web Services:介绍 WSDL 协议、SOAP协议 以及 XML-PRC
+ * Web Services:介绍 WSDL 协议、SOAP协议 以及 XML-PRC
* JAX-RS(JSR-224):简介 The Java API for XML-Base Web Servces 2.0 规范
* Web Serices Metadata(JSR-181):介绍 Web Services Metadata 编程模型、注解、Java 映射等
* Spring Boot 整合:介绍和整合 spring-boot-starter-ws
-### [第十五节 安全](https://segmentfault.com/l/1500000009978481)
+### [第十五节 安全](https://segmentfault.com/l/1500000009978481) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-15)) [[问答]](https://segmentfault.com/l/1500000009978481/d/1560000010817910)
* 主要内容
- * 客户端安全:介绍 CSRF、CSP、HTTP Struct Transport Security、X-Frames-Options、X-XSS-Protection 等
+ * 客户端安全:介绍 CSRF、CSP、HTTP Struct Transport Security、X-Frames-Options、X-XSS-Protection 等
* 服务端安全:Authentication 和 Authorization
* Spring Boot 整合:介绍和整合 spring-boot-starter-security
-### [第十六节 日志](https://segmentfault.com/l/1500000009978585)
+### [第十六节 日志](https://segmentfault.com/l/1500000009978585) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-16)) [[问答](https://segmentfault.com/l/1500000009978585/d/1560000010867242)]
* 主要内容
- * 日志框架:介绍主流日志框架,以及发展历程 Apache Log4j -> Java Logging -> Logback -> Apache Log4j2
+ * 日志框架:介绍主流日志框架,以及发展历程 Apache Log4j -> Java Logging -> Logback -> Apache Log4j2
* 统一日志API:介绍统一日志API Apache commons-logging 以及 slf4-api
* 日志设计模式:说明主流日志框架的设计模式
* Spring Boot 整合:集合 spring-boot-starter-logging ,分析Spring Boot 日志系统设计
-### [第十七节 监管](https://segmentfault.com/l/1500000009978661)
+### [第十七节 监管](https://segmentfault.com/l/1500000009978661) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-17)) [[问答](https://segmentfault.com/l/1500000009978661/d/1560000010933454)]
* 主要内容
- * JMX(JSR-3):介绍 Java 标准管理规范,着重说明 MBean、MXBean、属性(Attribute)、操作(Operation)等相关概念
+ * JMX(JSR-3):介绍 Java 标准管理规范,着重说明 MBean、MXBean、属性(Attribute)、操作(Operation)等相关概念
* 核心API:实战的方式深入探讨服务端和客户端核心API的使用,加深理解
* 客户端:讲解主流客户端(JConsole、JVisualVM)以及 HTTP 桥接框架 Jolokia
* Spring Boot 整合:介绍 Spring 对 JMX 的扩展支持,随后再深入探讨自动装配模块
-### [第十八节 配置](https://segmentfault.com/l/1500000009978661)
+### [第十八节 配置](https://segmentfault.com/l/1500000009978661) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-18)) [[问答](https://segmentfault.com/l/1500000009978729/d/1560000011093017)]
* 主要内容
- * 外部配置:介绍外部配置文件(Properties以及YAML方式)、命令行,以及占位符的使用
+ * 外部配置:介绍外部配置文件(Properties以及YAML方式)、命令行,以及占位符的使用
* 配置引用:讲解如何通过编码的方式获取配置项值,以及将该值赋值致Bean的属性上
* Prfoles:说明 Profiles 使用场景,以及在实际生产环节中如何合理的使用
* Environment:通过实战的方式解决和说明Spring Environment接口,以及它与外部配置、Profiles之间的关系
-### [第十九节 测试](https://segmentfault.com/l/1500000009978826)
+### [第十九节 测试](https://segmentfault.com/l/1500000009978826) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-19)) [[问答](https://segmentfault.com/l/1500000009978826/d/1560000011154349)]
* 主要内容
@@ -209,7 +214,7 @@ Segment Fault 在线讲堂 代码工程
-### [第二十节 自定义启动器](https://segmentfault.com/l/1500000009978904)
+### [第二十节 自定义启动器](https://segmentfault.com/l/1500000009978904) ([课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-boot/lesson-20)) [[问答](https://segmentfault.com/l/1500000009978904/d/1560000011202690)]
* 主要内容
@@ -222,7 +227,7 @@ Segment Fault 在线讲堂 代码工程
## Java 微服务实践 - Spring Cloud 系列
-### 持续更新中,请期待
+### 10月开播,敬请期待
diff --git "a/spring-boot/lesson-1/[\346\265\267\346\212\245] Spring Boot \345\210\235\344\275\223\351\252\214 \346\265\267\346\212\245.png" "b/spring-boot/lesson-1/[\346\265\267\346\212\245] Spring Boot \345\210\235\344\275\223\351\252\214 \346\265\267\346\212\245.png"
new file mode 100644
index 0000000..a068dc7
Binary files /dev/null and "b/spring-boot/lesson-1/[\346\265\267\346\212\245] Spring Boot \345\210\235\344\275\223\351\252\214 \346\265\267\346\212\245.png" differ
diff --git "a/spring-boot/lesson-1/Spring Boot \345\210\235\344\275\223\351\252\214.pptx" "b/spring-boot/lesson-1/[\350\257\276\344\273\266] Spring Boot \345\210\235\344\275\223\351\252\214.pptx"
similarity index 57%
rename from "spring-boot/lesson-1/Spring Boot \345\210\235\344\275\223\351\252\214.pptx"
rename to "spring-boot/lesson-1/[\350\257\276\344\273\266] Spring Boot \345\210\235\344\275\223\351\252\214.pptx"
index 07e7330..3dd5f01 100644
Binary files "a/spring-boot/lesson-1/Spring Boot \345\210\235\344\275\223\351\252\214.pptx" and "b/spring-boot/lesson-1/[\350\257\276\344\273\266] Spring Boot \345\210\235\344\275\223\351\252\214.pptx" differ
diff --git "a/spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.jpg" "b/spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.jpg"
deleted file mode 100644
index e790f3a..0000000
Binary files "a/spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.jpg" and /dev/null differ
diff --git "a/spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230 \346\265\267\346\212\245.png" "b/spring-boot/lesson-10/[\346\265\267\346\212\245] Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.png"
similarity index 100%
rename from "spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230 \346\265\267\346\212\245.png"
rename to "spring-boot/lesson-10/[\346\265\267\346\212\245] Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.png"
diff --git "a/spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.pptx" "b/spring-boot/lesson-10/[\350\257\276\344\273\266] Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.pptx"
similarity index 100%
rename from "spring-boot/lesson-10/Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.pptx"
rename to "spring-boot/lesson-10/[\350\257\276\344\273\266] Spring Boot \347\263\273\345\210\227\344\271\213\347\274\223\345\255\230.pptx"
diff --git "a/spring-boot/lesson-11/[\346\265\267\346\212\245] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.png" "b/spring-boot/lesson-11/[\346\265\267\346\212\245] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.png"
new file mode 100644
index 0000000..da5823e
Binary files /dev/null and "b/spring-boot/lesson-11/[\346\265\267\346\212\245] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.png" differ
diff --git "a/spring-boot/lesson-11/[\350\257\276\344\273\266] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.pptx" "b/spring-boot/lesson-11/[\350\257\276\344\273\266] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.pptx"
new file mode 100644
index 0000000..3098b94
Binary files /dev/null and "b/spring-boot/lesson-11/[\350\257\276\344\273\266] Spring Boot \347\263\273\345\210\227\344\271\213\346\266\210\346\201\257.pptx" differ
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/.gitignore b/spring-boot/lesson-11/spring-boot-lesson-11/.gitignore
new file mode 100644
index 0000000..2af7cef
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/.gitignore
@@ -0,0 +1,24 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
\ No newline at end of file
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/pom.xml b/spring-boot/lesson-11/spring-boot-lesson-11/pom.xml
new file mode 100644
index 0000000..bfea509
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/pom.xml
@@ -0,0 +1,58 @@
+
+
+ 4.0.0
+
+ com.segmentfault
+ spring-boot-lesson-11
+ 0.0.1-SNAPSHOT
+ jar
+
+ spring-boot-lesson-11
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.6.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.kafka
+ spring-kafka
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/ProducerMain.java b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/ProducerMain.java
new file mode 100644
index 0000000..029b91b
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/ProducerMain.java
@@ -0,0 +1,41 @@
+package com.segmentfault.springbootlesson11;
+
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.clients.producer.RecordMetadata;
+import org.apache.kafka.common.serialization.StringSerializer;
+
+import java.util.Properties;
+import java.util.concurrent.Future;
+
+/**
+ * 生产者 测试
+ *
+ * @author Mercy
+ * @see
+ * @since 2017.08.09
+ */
+public class ProducerMain {
+
+
+ public static void main(String[] args) throws Exception {
+
+ Properties properties = new Properties();
+
+ properties.setProperty("bootstrap.servers", "localhost:9091,localhost:9092,localhost:9093");
+ properties.put("key.serializer", StringSerializer.class);
+ properties.put("value.serializer", StringSerializer.class);
+
+ KafkaProducer kafkaProducer = new KafkaProducer(properties);
+
+ ProducerRecord producerRecord = new ProducerRecord("sf-2", 0, "message", "大家好");
+
+ Future future = kafkaProducer.send(producerRecord);
+
+ RecordMetadata recordMetadata = future.get();
+
+ System.out.println(recordMetadata);
+
+ }
+
+}
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/SpringBootLesson11Application.java b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/SpringBootLesson11Application.java
new file mode 100644
index 0000000..b36442e
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/SpringBootLesson11Application.java
@@ -0,0 +1,12 @@
+package com.segmentfault.springbootlesson11;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootLesson11Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootLesson11Application.class, args);
+ }
+}
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/consumer/ConsumerListener.java b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/consumer/ConsumerListener.java
new file mode 100644
index 0000000..15c051d
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/consumer/ConsumerListener.java
@@ -0,0 +1,33 @@
+package com.segmentfault.springbootlesson11.consumer;
+
+import com.segmentfault.springbootlesson11.domain.User;
+import org.springframework.kafka.annotation.KafkaListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * 消费者监听
+ *
+ * @author Mercy
+ * @see
+ * @since 2017.08.09
+ */
+@Component
+public class ConsumerListener {
+
+
+ @KafkaListener(topics = "sf-2")
+ public void consumer(String message) {
+
+ System.out.println(message);
+
+ }
+
+
+ @KafkaListener(topics = "sf-users")
+ public void consumer(User user) {
+
+ System.err.println(user);
+
+ }
+
+}
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/controller/KafkaController.java b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/controller/KafkaController.java
new file mode 100644
index 0000000..02da9c8
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/controller/KafkaController.java
@@ -0,0 +1,44 @@
+package com.segmentfault.springbootlesson11.controller;
+
+import com.segmentfault.springbootlesson11.domain.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.kafka.core.KafkaTemplate;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * Kafka RestController
+ *
+ * @author Mercy
+ * @see
+ * @since 2017.08.09
+ */
+@RestController
+public class KafkaController {
+
+ private final KafkaTemplate kafkaTemplate;
+
+ @Autowired
+ public KafkaController(KafkaTemplate kafkaTemplate) {
+ this.kafkaTemplate = kafkaTemplate;
+ }
+
+
+ @GetMapping(value = "/message/send")
+ public String sendMessage(@RequestParam String message) {
+
+ kafkaTemplate.send("sf-2", 0, message);
+
+ return message;
+ }
+
+ @PostMapping(value = "/user/save")
+ public User saveUser(@RequestBody User user) {
+
+ kafkaTemplate.send("sf-users", 0, user);
+
+ return user;
+
+ }
+
+
+}
diff --git a/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/deserializer/ObjectDeserializer.java b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/deserializer/ObjectDeserializer.java
new file mode 100644
index 0000000..b28abeb
--- /dev/null
+++ b/spring-boot/lesson-11/spring-boot-lesson-11/src/main/java/com/segmentfault/springbootlesson11/deserializer/ObjectDeserializer.java
@@ -0,0 +1,51 @@
+package com.segmentfault.springbootlesson11.deserializer;
+
+import org.apache.kafka.common.serialization.Deserializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.Map;
+
+/**
+ * 用户的反序列化器
+ *
+ * @author Mercy
+ * @see
+ * @since 2017.08.09
+ */
+public class ObjectDeserializer implements Deserializer