diff --git a/houserush/README.md b/houserush/README.md
index 2ccff7f..a167254 100644
--- a/houserush/README.md
+++ b/houserush/README.md
@@ -17,4 +17,4 @@
 
 4. check & change the src/main/resources/microservice.yaml and src/main/resources/application.yaml configuration file.
 
-5. run each microservice process <code>by mvn spring-boot:run. </code>
\ No newline at end of file
+5. run each microservice process by <code>mvn spring-boot:run. </code>
\ No newline at end of file
diff --git a/houserush/customer-manage/pom.xml b/houserush/customer-manage/pom.xml
index fae8da0..696d99b 100644
--- a/houserush/customer-manage/pom.xml
+++ b/houserush/customer-manage/pom.xml
@@ -25,7 +25,6 @@
   </parent>
 
   <modelVersion>4.0.0</modelVersion>
-
   <artifactId>houserush-customer-manage</artifactId>
   <name>Java Chassis::Samples::Practice::HouseRush-Customer-Manage</name>
 
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageApplication.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageApplication.java
new file mode 100644
index 0000000..17947d0
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageApplication.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage;
+
+import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+@SpringBootApplication
+@EnableServiceComb
+@EnableJpaAuditing
+public class CustomerManageApplication {
+
+  public static void main(String[] args) {
+    configBeforeBoot();
+    SpringApplication.run(CustomerManageApplication.class, args);
+  }
+
+  private static void configBeforeBoot() {
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+    RestObjectMapperFactory.getRestObjectMapper().setDateFormat(simpleDateFormat);
+  }
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageConfig.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageConfig.java
new file mode 100644
index 0000000..7432139
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/CustomerManageConfig.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "org.apache.servicecomb.samples.practise.houserush")
+public class CustomerManageConfig {
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Customer.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Customer.java
new file mode 100644
index 0000000..0494245
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Customer.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "customers")
+@SQLDelete(sql = "update customers set   = now() where id = ?")
+@Where(clause = "deleted_at is null")
+@EntityListeners(AuditingEntityListener.class)
+public class Customer {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private Integer id;
+
+  private String phone;
+
+  private String realName;
+
+  private String address;
+
+  @OneToMany(mappedBy = "customer", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, orphanRemoval = true)
+  private List<Qualification> qualifications = new ArrayList<>();
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+  private Date updatedAt;
+}
\ No newline at end of file
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Qualification.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Qualification.java
new file mode 100644
index 0000000..ac5878b
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/Qualification.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Data
+@Entity
+@Table(name = "qualifications")
+@EntityListeners(AuditingEntityListener.class)
+public class Qualification {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private Integer id;
+
+  @JsonIgnore
+  @ManyToOne
+  @JoinColumn(name = "customer_id")
+  private Customer customer;
+
+  private Integer saleId;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date UpdatedAt;
+}
\ No newline at end of file
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/User.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/User.java
new file mode 100644
index 0000000..77e7898
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/aggregate/User.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Data
+public class User {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private Integer id;
+
+  private String username;
+
+  @Transient
+  private String password;
+
+  @JsonIgnore
+  private String hashedPassword;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date updatedAt;
+
+  @Transient
+  private String token;
+
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApi.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApi.java
new file mode 100644
index 0000000..0ce9a4f
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApi.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.api;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Customer;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Qualification;
+
+import java.util.List;
+
+public interface CustomerManageApi {
+  Customer createCustomer(Customer customer);
+
+  Customer findCustomer(int id);
+
+  Customer updateCustomer(int id, Customer customer);
+
+  void removeCustomer(int id);
+
+  List<Customer> indexCustomers();
+
+  Customer updateCustomerQualifications(int id, List<Qualification> qualifications);
+
+  int getQualificationsCount(int customerId, int saleId);
+}
\ No newline at end of file
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApiRestImpl.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApiRestImpl.java
new file mode 100644
index 0000000..ddf925e
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/api/CustomerManageApiRestImpl.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.api;
+
+import org.apache.servicecomb.provider.pojo.RpcReference;
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.User;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.rpc.UserApi;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.service.CustomerManageService;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Customer;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Qualification;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestSchema(schemaId = "customerManageApiRest")
+@RequestMapping("/")
+public class CustomerManageApiRestImpl implements CustomerManageApi {
+
+  @RpcReference(microserviceName = "login", schemaId = "userApiRest")
+  private UserApi userApi;
+
+  @Autowired
+  private CustomerManageService customerManageService;
+
+  @PostMapping("customers")
+  public Customer createCustomer(@RequestBody Customer customer) {
+    User user = new User();
+    user.setUsername(customer.getRealName());
+    user.setPassword("123456");
+    userApi.createUser(user);
+    return customerManageService.createCustomer(customer);
+  }
+
+  @GetMapping("customers/{id}")
+  public Customer findCustomer(@PathVariable int id) {
+    return customerManageService.findCustomer(id);
+  }
+
+  @PutMapping("customers/{id}")
+  public Customer updateCustomer(@PathVariable int id, @RequestBody Customer customer) {
+    customer.setId(id);
+    return customerManageService.updateCustomer(customer);
+  }
+
+  @DeleteMapping("customers/{id}")
+  public void removeCustomer(@PathVariable int id) {
+    customerManageService.removeCustomer(id);
+  }
+
+  @GetMapping("customers")
+  public List<Customer> indexCustomers() {
+    return customerManageService.indexCustomers();
+  }
+
+  @PutMapping(value = "customers/{id}/update_qualifications")
+  public Customer updateCustomerQualifications(@PathVariable int id, @RequestBody List<Qualification> qualifications) {
+    Customer customer = customerManageService.findCustomer(id);
+    customerManageService.updateCustomerQualifications(customer, qualifications);
+    // refresh customer
+    customer = customerManageService.findCustomer(id);
+    return customer;
+  }
+
+  @GetMapping("customers/{customerId}/sales/{saleId}/qulification_count")
+  public int getQualificationsCount(@PathVariable int customerId, @PathVariable int saleId) {
+    return customerManageService.getQualificationsCount(customerId, saleId);
+
+  }
+}
\ No newline at end of file
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/CustomerDao.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/CustomerDao.java
new file mode 100644
index 0000000..c77a85c
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/CustomerDao.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Customer;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface CustomerDao extends JpaRepository<Customer, Integer> {
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/QualificationDao.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/QualificationDao.java
new file mode 100644
index 0000000..5227cae
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/dao/QualificationDao.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Qualification;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface QualificationDao extends JpaRepository<Qualification, Integer> {
+  int countByCustomerIdAndSaleId(int customerId, int saleId);
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/rpc/UserApi.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/rpc/UserApi.java
new file mode 100644
index 0000000..6a0c155
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/rpc/UserApi.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.rpc;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.User;
+
+public interface UserApi {
+  User createUser(User user);
+
+  User findUser(int id);
+
+  void removeUser(int id);
+
+  User signin(User user);
+
+  User verifyToken(String token);
+}
\ No newline at end of file
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageService.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageService.java
new file mode 100644
index 0000000..cc0c535
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageService.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.service;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Customer;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Qualification;
+
+import java.util.List;
+
+public interface CustomerManageService {
+  Customer createCustomer(Customer customer);
+
+  Customer findCustomer(int id);
+
+  Customer updateCustomer(Customer customer);
+
+  void removeCustomer(int id);
+
+  List<Customer> indexCustomers();
+
+  boolean updateCustomerQualifications(Customer customer, List<Qualification> qualifications);
+
+  int getQualificationsCount(int customerId, int saleId);
+
+}
diff --git a/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageServiceImpl.java b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageServiceImpl.java
new file mode 100644
index 0000000..2881054
--- /dev/null
+++ b/houserush/customer-manage/src/main/java/org/apache/servicecomb/samples/practise/houserush/customer/manage/service/CustomerManageServiceImpl.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.customer.manage.service;
+
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Customer;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.aggregate.Qualification;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.dao.CustomerDao;
+import org.apache.servicecomb.samples.practise.houserush.customer.manage.dao.QualificationDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CustomerManageServiceImpl implements CustomerManageService {
+
+  @Autowired
+  private CustomerDao customerDao;
+
+  @Autowired
+  private QualificationDao qualificationDao;
+
+  @Override
+  public Customer createCustomer(Customer customer) {
+    return customerDao.save(customer);
+  }
+
+  @Override
+  public Customer updateCustomer(Customer customer) {
+    int id = customer.getId();
+    if (customerDao.exists(id)) {
+      return customerDao.save(customer);
+    } else {
+      throw new DataRetrievalFailureException("cannot update the non-existed customer");
+    }
+  }
+
+  @Override
+  public Customer findCustomer(int id) {
+    return customerDao.findOne(id);
+  }
+
+  @Override
+  public void removeCustomer(int id) {
+    customerDao.delete(id);
+  }
+
+  @Override
+  public List<Customer> indexCustomers() {
+    return customerDao.findAll();
+  }
+
+  @Override
+  public boolean updateCustomerQualifications(Customer customer, List<Qualification> qualifications) {
+    customer.setQualifications(qualifications);
+    qualifications.forEach(qualification -> qualification.setCustomer(customer));
+    customerDao.saveAndFlush(customer);
+    return true;
+  }
+
+  @Override
+  public int getQualificationsCount(int customerId, int saleId) {
+    return qualificationDao.countByCustomerIdAndSaleId(customerId, saleId);
+  }
+}
diff --git a/houserush/customer-manage/src/main/resources/microservice.yaml b/houserush/customer-manage/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..7fa9d94
--- /dev/null
+++ b/houserush/customer-manage/src/main/resources/microservice.yaml
@@ -0,0 +1,44 @@
+#
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# all interconnected microservices must belong to an application wth the same ID
+APPLICATION_ID: houserush
+service_description:
+# name of the declaring microservice
+  name: customer-manage
+  version: 0.0.20
+servicecomb:
+  service:
+    registry:
+      address: http://192.168.229.134:30100
+  rest:
+    address: 0.0.0.0:7779
+  handler:
+    chain:
+      Provider:
+        default: bizkeeper-provider
+spring:
+  datasource:
+    url: jdbc:mysql://172.17.0.128:3306/customer?characterEncoding=utf8&useSSL=false
+    driver-class-name: com.mysql.jdbc.Driver
+    username: root
+    password: 123456
+  jpa:
+    properties:
+      hibernate:
+        enable_lazy_load_no_trans: true
\ No newline at end of file
diff --git a/houserush/house-order/README.md b/houserush/house-order/README.md
new file mode 100644
index 0000000..1ed80b0
--- /dev/null
+++ b/houserush/house-order/README.md
@@ -0,0 +1,95 @@
+## 微服务 House-Order
+
+### 主要职责
+该微服务主要有4个职责
+1. 管理员用作开售活动的管理。
+2. 普通用户"**抢购**"房产。
+3. 管理员获取抢购活动的结果。
+4. 普通用户查询自己的抢购结果。
+
+### 主要设计考量
+1. 简单，抢购的核心接口只有1，2个，因为这部分后续需要优化性能，所以越简单，后续优化越容易。
+2. 第一版利用同步调用的方式，尽量不引入冗余数据，减少数据一致性的考量。
+
+### 后续改进的关注点 TODO list:
+1. 需要减少对其他微服务的同步调用，考虑引入异步的事务消息更新机制。提高抢购的性能。
+2. 可能会引入缓存系统，初步定为redis。
+3. 需要跨微服务事务机制，保证数据库的一致性。
+
+### 数据表设计
+
+主要有2张表:
+1. house_orders表，这张表既表示了待抢房源，也表示了抢购订单（抢购结果），差别在与customer_id列是否为null和state列的值。
+在开始抢购之前，customer_id为空，state为new, 记录这次开售活动有哪些房源参与销售。开售中和开售后记录抢购结果。
+即谁抢购到了该房产。
+2. sales表，表示开售活动，主要记录了开售活动的起止时间。sale has_many house_orders。表示这次开售
+活动有哪些房产可售。
+
+sales表:
+
+| column name     | type         |  brief     | description       |
+| --------------  | ------------  | -------   | --------------    |
+| id              | int           | 主键      |  |
+| state           | varchar(20)   | 订单状态   | new->published-> ongoing -> finished |
+| begin_at        | timestamp     | 开售活动开始时间   |  |
+| end_at          | timestamp     | 开售活动结束时间   |  |
+| realestate_id   | int           | 楼盘id    | 一次开售活动只能针对同属一个楼盘的部分房源 |
+| deleted_at      | timestamp     | 开售活动删除时间 | 一次开售活动只有在未发布前可以进行删除或编辑,软删除方案 |
+
+
+house_orders表:
+
+| column name     | type         | 简介     | 更多说明        |
+| --------------  | ------------  | -------  | -------------- |
+| id              | int           | 主键      |  |
+| sale_id         | int           | 外键：开售活动id |  |
+| customer_id     | int           | 客户id  | 记录了谁抢到了该房源,开售前为空 |
+| state           | varchar(20)   | 订单状态 | new 是待抢，confirmed是已抢 |
+| ordered_at      | timestamp     | 抢购时间  | state变为confirmed的时间 |
+
+### 接口设计
+
+
+##### 管理开售活动相关
+```java
+  @PostMapping("sales")
+  Sale createSale(@RequestBody Sale sale)；
+
+  @GetMapping("sales/{saleId}")
+  Sale findSale(@PathVariable int saleId)；
+  //获取开售活动详情。
+  
+  @PutMapping("sales/{saleId}")
+  Sale Sale updateSale(@PathVariable int saleId, @RequestBody Sale sale)；
+  //开售活动发布是通过该接口，一旦发布，不能再修改了,也不能删除。
+
+  @DeleteMapping("sales/{saleId}")
+  void removeSale(@PathVariable int saleId)；
+  
+  @GetMapping("sales")
+  List<Sale> indexSales();
+  //对客户列出客户有抢购资格的还未开始的开售活动，已开始时间排序；对管理员，列出所有的开售活动。
+
+  @PostMapping("sales/{saleId}/house_orders")
+  createHouseOrders(@PathVariable int saleId, @RequestBody List<Integer> houseIds)；
+  //为开售活动创建房源，创建时需要检查这些房源是否已被其他开售活动锁定或售出。
+  //需要先对这些房源加锁后再添加到当前开售活动中，要注意事务的应用。
+  
+```
+
+##### 执行抢购相关
+```java
+  @PutMapping("house_orders/{houseOrderId}")
+  HouseOrder placeHouseOrder(@RequestHeader int customerId, @PathVariable int houseOrderId)
+  //修改house_orders的customer_id列，抢购前需要检查该房源是否已被占用，
+  // select for update加锁，注意事务应用。
+  //
+```
+
+### 依赖其他微服务。
+1. find 和 index Sale的时候，需要调用realestate微服务的相关接口获取
+Sale关联楼盘的详细信息。
+2. createHouseOrders接口需要依赖realestate微服务查询房源状态和加锁，见接口说明。
+3. 依赖CustomerManage微服务，查询当前抢购的客户是否还有抢购的资格。
+
+
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderApplication.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderApplication.java
new file mode 100644
index 0000000..63a6875
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderApplication.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale;
+
+import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+@SpringBootApplication
+@EnableServiceComb
+@EnableJpaAuditing
+public class HouseOrderApplication {
+  public static void main(String[] args) {
+    configBeforeBoot();
+    SpringApplication.run(HouseOrderApplication.class, args);
+  }
+
+  private static void configBeforeBoot() {
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+    RestObjectMapperFactory.getRestObjectMapper().setDateFormat(simpleDateFormat);
+  }
+}
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderConfig.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderConfig.java
new file mode 100644
index 0000000..f681976
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/HouseOrderConfig.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "org.apache.servicecomb.samples.practise.houserush")
+public class HouseOrderConfig {
+}
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/HouseOrder.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/HouseOrder.java
new file mode 100644
index 0000000..3b8b863
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/HouseOrder.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Data
+@Entity
+@Table(name = "house_orders")
+@EntityListeners(AuditingEntityListener.class)
+public class HouseOrder {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private Integer id;
+
+  @JsonIgnore
+  @ManyToOne
+  @JoinColumn(name = "sale_id")
+  private Sale sale;
+
+  private Integer customerId;
+
+  private String state = "new";
+
+  private Integer houseId;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date orderedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date CreatedAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date UpdatedAt;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/Sale.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/Sale.java
new file mode 100644
index 0000000..a0ea966
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/aggregate/Sale.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "sales")
+@SQLDelete(sql = "update sales set deleted_at = now() where id = ?")
+@Where(clause = "deleted_at is null")
+@EntityListeners(AuditingEntityListener.class)
+public class Sale {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private Integer id;
+
+  private String state = "new";
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date beginAt;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date endAt;
+
+  @JsonIgnore
+  @OneToMany(mappedBy = "sale")
+  private List<HouseOrder> houseOrders = new ArrayList<>();
+
+  private Integer realestateId;
+
+  @Transient
+  private String realestateName;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date updatedAt;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApi.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApi.java
new file mode 100644
index 0000000..13207d9
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApi.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.api;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.HouseOrder;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.Sale;
+
+import java.util.List;
+
+public interface HouseOrderApi {
+  List<HouseOrder> createHouseOrders(int saleId, List<Integer> houseIds);
+
+  HouseOrder placeHouseOrder(int customerId, int houseOrderId);
+
+  Sale createSale(Sale sale);
+
+  Sale findSale(int saleId);
+
+  Sale updateSale(int saleId, Sale sale);
+
+  void removeSale(int saleId);
+
+  List<Sale> indexSales();
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApiRestImpl.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApiRestImpl.java
new file mode 100644
index 0000000..2a74fc5
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/api/HouseOrderApiRestImpl.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.api;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.HouseOrder;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.Sale;
+import org.apache.servicecomb.samples.practise.houserush.sale.service.HouseOrderService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestSchema(schemaId = "houseOrderApiRest")
+@RequestMapping("/")
+public class HouseOrderApiRestImpl implements HouseOrderApi {
+  @Autowired
+  HouseOrderService houseOrderService;
+
+  @PostMapping("sales/{saleId}/house_orders")
+  public List<HouseOrder> createHouseOrders(@PathVariable int saleId, @RequestBody List<Integer> houseIds) {
+    return houseOrderService.createHouseOrders(saleId, houseIds);
+  }
+
+  @PutMapping("house_orders/{houseOrderId}")
+  public HouseOrder placeHouseOrder(@RequestHeader int customerId, @PathVariable int houseOrderId) {
+    return houseOrderService.placeHouseOrder(customerId, houseOrderId);
+  }
+
+  @Override
+  @PostMapping("sales")
+  public Sale createSale(@RequestBody Sale sale) {
+    return houseOrderService.createSale(sale);
+  }
+
+  @Override
+  @GetMapping("sales/{saleId}")
+  public Sale findSale(@PathVariable int saleId) {
+    return houseOrderService.findSale(saleId);
+  }
+
+  @Override
+  @PutMapping("sales/{saleId}")
+  public Sale updateSale(@PathVariable int saleId, @RequestBody Sale sale) {
+    sale.setId(saleId);
+    return houseOrderService.updateSale(sale);
+  }
+
+  @Override
+  @DeleteMapping("sales/{saleId}")
+  public void removeSale(@PathVariable int saleId) {
+    houseOrderService.removeSale(saleId);
+  }
+
+  @Override
+  @GetMapping("sales")
+  public List<Sale> indexSales() {
+    return houseOrderService.indexSales();
+  }
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/HouseOrderDao.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/HouseOrderDao.java
new file mode 100644
index 0000000..3e4bc2f
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/HouseOrderDao.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.HouseOrder;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+public interface HouseOrderDao extends JpaRepository<HouseOrder, Integer> {
+  @Lock(LockModeType.PESSIMISTIC_WRITE)
+  @Query("SELECT ho FROM HouseOrder ho WHERE ho.sale.id = ?1 and ho.houseId in (?2)")
+  List<HouseOrder> findAllBySaleIdAndHouseIdInForUpdate(int saleId, List<Integer> ids);
+
+  @Lock(LockModeType.PESSIMISTIC_WRITE)
+  @Query("SELECT ho FROM HouseOrder ho WHERE ho.id = ?1")
+  HouseOrder findOneForUpdate(int id);
+
+  int countByCustomerIdAndSaleId(int customerId, int saleId);
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/SaleDao.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/SaleDao.java
new file mode 100644
index 0000000..99795ec
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/dao/SaleDao.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.Sale;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface SaleDao extends JpaRepository<Sale, Integer> {
+}
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/CustomerManageApi.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/CustomerManageApi.java
new file mode 100644
index 0000000..0b30523
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/CustomerManageApi.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.Customer;
+
+public interface CustomerManageApi {
+  Customer findCustomer(int customerId);
+
+  int getQualificationsCount(int customerId, int saleId);
+}
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/RealestateApi.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/RealestateApi.java
new file mode 100644
index 0000000..0ca5393
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/RealestateApi.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.House;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.Realestate;
+
+import java.util.List;
+
+public interface RealestateApi {
+  Realestate findRealestate(int id);
+
+  List<House> lockHousesForSale(List<Integer> ids);
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Customer.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Customer.java
new file mode 100644
index 0000000..d458315
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Customer.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc.po;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Customer {
+  private int id;
+
+  private String phone;
+
+  private List<Qualification> qualifications;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/House.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/House.java
new file mode 100644
index 0000000..c122ef4
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/House.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc.po;
+
+import lombok.Data;
+
+@Data
+public class House {
+  private Integer id;
+
+  private String name;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Qualification.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Qualification.java
new file mode 100644
index 0000000..027ca72
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Qualification.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc.po;
+
+import lombok.Data;
+
+@Data
+public class Qualification {
+  private int id;
+
+  private Integer saleId;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Realestate.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Realestate.java
new file mode 100644
index 0000000..d7d3324
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/rpc/po/Realestate.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.rpc.po;
+
+import lombok.Data;
+
+@Data
+public class Realestate {
+  private int id;
+
+  private String name;
+}
\ No newline at end of file
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderService.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderService.java
new file mode 100644
index 0000000..3333de3
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderService.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.service;
+
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.HouseOrder;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.Sale;
+
+import java.util.List;
+
+public interface HouseOrderService {
+  List<HouseOrder> createHouseOrders(int saleId, List<Integer> houseIds);
+
+  HouseOrder placeHouseOrder(int customerId, int houseOrderId);
+
+  Sale createSale(Sale sale);
+
+  Sale findSale(int saleId);
+
+  Sale updateSale(Sale sale);
+
+  void removeSale(int saleId);
+
+  List<Sale> indexSales();
+}
diff --git a/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderServiceImpl.java b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderServiceImpl.java
new file mode 100644
index 0000000..e2dfd3c
--- /dev/null
+++ b/houserush/house-order/src/main/java/org/apache/servicecomb/samples/practise/houserush/sale/service/HouseOrderServiceImpl.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.sale.service;
+
+import org.apache.servicecomb.provider.pojo.RpcReference;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.HouseOrder;
+import org.apache.servicecomb.samples.practise.houserush.sale.aggregate.Sale;
+import org.apache.servicecomb.samples.practise.houserush.sale.dao.HouseOrderDao;
+import org.apache.servicecomb.samples.practise.houserush.sale.dao.SaleDao;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.CustomerManageApi;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.RealestateApi;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.Customer;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.House;
+import org.apache.servicecomb.samples.practise.houserush.sale.rpc.po.Realestate;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class HouseOrderServiceImpl implements HouseOrderService {
+  @Autowired
+  HouseOrderDao houseOrderDao;
+
+  @Autowired
+  SaleDao saleDao;
+
+  @RpcReference(microserviceName = "realestate", schemaId = "realestateApiRest")
+  private RealestateApi realestateApi;
+
+  @RpcReference(microserviceName = "customer-manage", schemaId = "customerManageApiRest")
+  private CustomerManageApi customerManageApi;
+
+  @Override
+  @Transactional
+  public List<HouseOrder> createHouseOrders(int saleId, List<Integer> houseIds) {
+    Sale sale = saleDao.findOne(saleId);
+    if (null == sale) {
+      throw new DataRetrievalFailureException("cannot create house for the non-existed sale.");
+    }
+
+    List<HouseOrder> houseOrders = houseOrderDao.findAllBySaleIdAndHouseIdInForUpdate(saleId, houseIds);
+    if (!houseOrders.isEmpty()) {
+      throw new InvocationException(400, "", "some house is already in this sale.");
+    }
+
+    List<House> houses = realestateApi.lockHousesForSale(houseIds);
+    List<HouseOrder> resHouseOrders = new ArrayList<>();
+    houses.forEach(house -> {
+      HouseOrder houseOrder = new HouseOrder();
+      houseOrder.setHouseId(house.getId());
+      houseOrder.setSale(sale);
+      houseOrderDao.save(houseOrder);
+      resHouseOrders.add(houseOrder);
+
+    });
+    return resHouseOrders;
+  }
+
+  @Override
+  @Transactional
+  public HouseOrder placeHouseOrder(int customerId, int houseOrderId) {
+    HouseOrder houseOrder = houseOrderDao.findOneForUpdate(houseOrderId);
+    Sale sale = houseOrder.getSale();
+
+    if (null != houseOrder) {
+      if (null == houseOrder.getCustomerId()) {
+        int qualificationsCount = customerManageApi.getQualificationsCount(customerId, sale.getId());
+
+        int ordersCount = houseOrderDao.countByCustomerIdAndSaleId(customerId, sale.getId());
+
+        if (qualificationsCount <= ordersCount) {
+          throw new InvocationException(400, "", "do not have the enough qualification to buy houses in this sale, " +
+              "the qualifications count is " + qualificationsCount + " , the order count is " + ordersCount);
+        }
+
+        houseOrder.setCustomerId(customerId);
+        houseOrder.setState("confirmed");
+        houseOrderDao.save(houseOrder);
+        return houseOrder;
+      } else {
+        throw new InvocationException(400, "", "this house have been occupied first by other customer, please choose another house or try it later.");
+      }
+    } else {
+      throw new InvocationException(400, "", "this house which you chose does not belong to the current sale.");
+    }
+  }
+
+  @Override
+  public Sale createSale(Sale sale) {
+    return saleDao.save(sale);
+  }
+
+  @Override
+  public Sale findSale(int saleId) {
+    Sale sale = saleDao.findOne(saleId);
+    Realestate realestate = realestateApi.findRealestate(sale.getRealestateId());
+    sale.setRealestateName(realestate.getName());
+    return sale;
+  }
+
+  @Override
+  @Transactional
+  public Sale updateSale(Sale sale) {
+    int id = sale.getId();
+    if (saleDao.exists(id)) {
+      return saleDao.save(sale);
+    } else {
+      throw new DataRetrievalFailureException("cannot update the none-existed sale");
+    }
+  }
+
+  @Override
+  public void removeSale(int saleId) {
+    saleDao.delete(saleId);
+  }
+
+  @Override
+  public List<Sale> indexSales() {
+    return saleDao.findAll();
+  }
+}
diff --git a/houserush/house-order/src/main/resources/microservice.yaml b/houserush/house-order/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..5aa426a
--- /dev/null
+++ b/houserush/house-order/src/main/resources/microservice.yaml
@@ -0,0 +1,48 @@
+#
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# all interconnected microservices must belong to an application wth the same ID
+APPLICATION_ID: houserush
+service_description:
+  # name of the declaring microservice
+  name: house-order
+  version: 0.0.6
+servicecomb:
+  service:
+    registry:
+      address: http://127.0.0.1:30100
+      instance:
+        watch: true
+        healthCheck:
+          interval: 5
+
+  rest:
+    address: 0.0.0.0:6788
+  handler:
+    chain:
+      Provider:
+        default: bizkeeper-provider
+spring:
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/house_order?characterEncoding=utf8&useSSL=false
+    username: root
+    password: root
+  jpa:
+    properties:
+      hibernate:
+        enable_lazy_load_no_trans: true
\ No newline at end of file
diff --git a/houserush/realestate/README.md b/houserush/realestate/README.md
new file mode 100644
index 0000000..18835e5
--- /dev/null
+++ b/houserush/realestate/README.md
@@ -0,0 +1,245 @@
+## 微服务 realestate
+
+该微服务用于楼盘及房源管理
+
+###快速开始
+
+1、参考[ServiceComb快速入门](http://servicecomb.apache.org/cn/docs/quick-start/)安装开发环境:
+
+- 安装git,详情可参考[git安装教程](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git)。
+- 安装JDK 1.8,详情可参考[JDK安装教程](https://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html)。
+- 安装Maven 3.x, 详情可参考[Maven安装教程](https://maven.apache.org/install.html)。
+
+2、运行 Service Center
+
+- 安装Docker,详情可参考[Docker安装教程](https://www.docker.com/get-started)。
+- 命令行或终端输入<code>$ docker pull servicecomb/service-center</code>拉取最新版servicecomb/service-center。
+- 命令行或终端输入<code>$ docker run -d -p 30100:30100 servicecomb/service-center:latest</code>在30100端口运行service-center。
+
+3、参考下文的[数据表设计](#dbDisign)创建数据库表。
+
+4、配置realestate的数据库、服务中心地址以及启动端口
+
+- 修改src/main/resources/microservice.yaml文件:
+```yaml
+#...
+servicecomb:
+  service:
+    registry:
+      address: http://127.0.0.1:30100 #service-center地址
+  rest:
+    address: 0.0.0.0:7771   #微服务启动端口
+    #...
+spring:
+  #数据库url、用户名、密码配置
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/realestate?characterEncoding=utf8&useSSL=false
+    username: houserush
+    password: password
+    #...
+```
+5、启动微服务
+- 该微服务基于spring-boot开发，所以启动微服务只需要在微服务根目录下打开命令行或终端输入<code>$ mvn spring-boot:run</code>,或通过IDE启动spring-boot程序。
+
+### 主要功能
+
+- 楼盘的增删改查
+
+- 建筑楼的增删改查
+
+- 房源的增删改查
+
+- 锁定已售房源
+
+### 设计原理
+
+一个楼盘可能含多栋建筑楼，一栋建筑楼可能含多个房源
+
+### 数据表设计
+<span id = "dbDisign" />
+
+- realestates
+
+| 字段            | 类型         | 描述      |
+| :-------------- | ------------ | --------|
+| id              | int          | 主键id   |
+| name            | varchar(255) | 楼盘名称 |
+| description     | varchar(2048)| 描述     |
+| deleted_at      | timestamp    | 删除时间 |
+| created_at      | timestamp    | 创建时间 |
+| update_at       | timestamp    | 更新时间 |
+
+- buildings
+
+| 字段                    | 类型         | 描述       |
+| :--------------------- | ------------ | --------- |
+| id                     | int          | 主键id    |
+| realestate_id          | int          | 所在楼盘id |
+| name                   | varchar(255) | 建筑楼名称 |
+| sequence_in_realestate | tinyint      | 栋        |
+| deleted_at             | timestamp    | 删除时间   |
+| created_at             | timestamp    | 创建时间   |
+| update_at              | timestamp    | 更新时间   |
+
+- houses
+
+| 字段               | 类型         | 描述        |
+| :---------------- | ------------ | ---------  |
+| id                | int          | 主键id      |
+| building_id       | int          | 所在建筑楼id |
+| name              | varchar(255) | 房源名称     |
+| layer             | int          | 房源所在楼层 |
+| state             | varchar(255) | 房源状态     |
+| sequence_in_layer | tinyint      | 房间号       |
+| price             | decimal      | 价格        |
+| deleted_at        | timestamp    | 删除时间     |
+| created_at        | timestamp    | 创建时间     |
+| update_at         | timestamp    | 更新时间     |
+
+
+### 接口设计
+
+```java
+package org.apache.servicecomb.samples.practise.houserush.realestate.api;
+
+public interface RealestateApi {
+    /**
+    * 新增楼盘
+    * @param realestate 楼盘信息
+    * @return Realestate 添加成功后的楼盘信息
+    */
+    Realestate createRealestate(Realestate realestate);
+    
+    /**
+    * 查询楼盘
+    * @param id 楼盘id
+    * @return Realestate 楼盘信息
+    */
+    Realestate findRealestate(int id);
+    
+    /**
+    * 修改楼盘信息
+    * @param id 楼盘id
+    * @param realestate 楼盘信息
+    * @return Realestate 修改成功后的楼盘信息
+    */
+    Realestate updateRealestate(int id, Realestate realestate);
+    
+    /**
+    * 删除楼盘
+    * @param id 楼盘id
+    */
+    void removeRealestate(int id);
+    
+    /**
+    * 查询所有楼盘
+    * @return List<Realestate> 所有楼盘列表
+    */
+    List<Realestate> indexRealestates();
+    
+    /**
+    * 新增建筑楼
+    * @param realestateId 楼盘id
+    * @param building 建筑楼信息
+    * @return Building 添加成功后的建筑楼信息
+    */
+    Building createBuilding(int realestateId, Building building);
+    
+    /**
+    * 查询建筑楼
+    * @param id 建筑楼id
+    * @return Building 建筑楼信息
+    */
+    Building findBuilding(int id);
+    
+    /**
+    * 更改建筑楼信息
+    * @param id 建筑楼id
+    * @param building 建筑楼信息
+    * @return Building 更改成功后的建筑楼信息
+    */
+    Building updateBuilding(int id, Building building);
+    
+    /**
+    * 删除建筑楼
+    * @param id 建筑楼id
+    */
+    void removeBuilding(int id);
+    
+    /**
+    * 查询某一楼盘下的所有建筑楼
+    * @param realestateId 楼盘id
+    * @return List<Building> 建筑楼列表
+    */
+    List<Building> indexBuildings(int realestateId);
+    
+    /**
+    * 新增房源信息
+    * @param buidingId 建筑楼id
+    * @param house 房源信息
+    * @return House 添加成功后的房源信息
+    */
+    House createHouse(int buidingId, House house);
+    
+    /**
+    * 查询房源信息
+    * @param id 房源id
+    * @return House 房源信息
+    */
+    House findHouse(int id);
+    
+    /**
+    * 更改房源信息
+    * @param id 房源id
+    * @param house 房源信息
+    * @return House 更改成功后的房源信息
+    */
+    House updateHouse(int id, House house);
+    
+    /**
+    * 删除房源信息
+    * @param id 房源id
+    */
+    void removeHouse(int id);
+    
+    /**
+    * 查询某一建筑楼下的所有房源
+    * @param buildingId 建筑楼id
+    * @return List<House> 所有房源列表
+    */
+    List<House> indexHouses(int buildingId);
+    
+    /**
+    * 锁定已售房源
+    * @param ids 已售房源id列表
+    * @return List<House> 锁定的房源列表
+    */
+    List<House> lockHousesForSale(List<Integer> ids);
+}
+```
+
+### Rest API调用示例
+点击[houserush-realestate Rest API文档](https://documenter.getpostman.com/view/5023270/SVYkwMZd?version=latest)查看Rest API调用示例。
+
+- 注意:示例中是通过Gateway网关服务调用的Realestate服务,所以示例调用接口较org.apache.servicecomb.samples.practise.houserush.realestate.api.RealestateApiRestImpl中声明的接口多含一个前缀/realestate.
+- 鉴权操作、获取用户Token操作请移步[houserush-gateway服务文档](https://github.com/apache/servicecomb-samples/tree/master/houserush/gateway)
+
+### 源码文件解析
+
+```yaml
+src/main:
+    /java: java源码文件所在目录
+        org.apache.servicecomb.samples.practise.houserush.realestate:
+            .aggregate: 项目实体类所在包,其中Building、House、Realestate类为JPA实体
+            .api: Rest接口定义及实现包
+                .RealestateApi: 接口定义
+                .RealestateApiRestImpl: 接口实现
+            .dao: 数据访问对象所在包,其中数据库操作都是Spring-Data-JPA实现
+            .service: 各种增删改查具体逻辑实现
+            .RealestateConfig: 微服务配置类
+            .RealestateApplication: 微服务启动类
+    /resources: 项目资源文件所在目录
+        /microservice.yaml: 微服务配置文件，其中关键内容在上文"快速开始"中已经提及。
+pom.xml: maven配置文件
+
+```
\ No newline at end of file
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateApplication.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateApplication.java
new file mode 100644
index 0000000..0cfb114
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateApplication.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate;
+
+import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+@SpringBootApplication
+@EnableServiceComb
+public class RealestateApplication {
+
+  public static void main(String[] args) {
+    configBeforeBoot();
+    SpringApplication.run(RealestateApplication.class, args);
+  }
+
+  private static void configBeforeBoot() {
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+    RestObjectMapperFactory.getRestObjectMapper().setDateFormat(simpleDateFormat);
+  }
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateConfig.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateConfig.java
new file mode 100644
index 0000000..b4136ae
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/RealestateConfig.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+
+@Configuration
+@EnableJpaRepositories(basePackages = "org.apache.servicecomb.samples.practise.houserush")
+public class RealestateConfig {
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Building.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Building.java
new file mode 100644
index 0000000..1c0a0c9
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Building.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "buildings")
+@SQLDelete(sql = "update buildings set deleted_at = now() where id = ?")
+@Where(clause = "deleted_at is null")
+public class Building {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private int id;
+
+  @JsonIgnore
+  @ManyToOne
+  @JoinColumn(name = "realestate_id")
+  private Realestate realestate;
+
+  @JsonIgnore
+  @OneToMany(mappedBy = "building")
+  private List<House> houses = new ArrayList<>();
+
+  private String name;
+
+  private Integer sequenceInRealestate;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date updatedAt;
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/House.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/House.java
new file mode 100644
index 0000000..3c47904
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/House.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.aggregate;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Entity
+@Table(name = "houses")
+@SQLDelete(sql = "update houses set deleted_at = now() where id = ?")
+@Where(clause = "deleted_at is null")
+public class House {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private int id;
+
+  @JsonIgnore
+  @ManyToOne
+  @JoinColumn(name = "building_id")
+  private Building building;
+
+  private String name;
+
+  private Integer layer;
+
+  private String state;
+
+  private Integer sequenceInLayer;
+
+  private BigDecimal price;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date updatedAt;
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Realestate.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Realestate.java
new file mode 100644
index 0000000..f936ade
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/aggregate/Realestate.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.aggregate;
+
+import lombok.Data;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+import org.springframework.data.annotation.CreatedDate;
+import org.springframework.data.annotation.LastModifiedDate;
+
+import javax.persistence.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Entity
+@Table(name = "realestates")
+@SQLDelete(sql = "update realestates set deleted_at = now() where id = ?")
+@Where(clause = "deleted_at is null")
+public class Realestate {
+  @Id
+  @GeneratedValue(strategy = GenerationType.AUTO)
+  private int id;
+
+  @OneToMany(mappedBy = "realestate")
+  private List<Building> buildings = new ArrayList<>();
+
+  private String name;
+
+  private String description;
+
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date deletedAt;
+
+  @CreatedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date createdAt;
+
+  @LastModifiedDate
+  @Temporal(TemporalType.TIMESTAMP)
+  private Date updatedAt;
+
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApi.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApi.java
new file mode 100644
index 0000000..ccef9c9
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApi.java
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.api;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Building;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.House;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Realestate;
+
+import java.util.List;
+
+public interface RealestateApi {
+  /**
+   * 新增楼盘
+   *
+   * @param realestate 楼盘信息
+   * @return Realestate 添加成功后的楼盘信息
+   */
+  Realestate createRealestate(Realestate realestate);
+
+  /**
+   * 查询楼盘
+   *
+   * @param id 楼盘id
+   * @return Realestate 楼盘信息
+   */
+  Realestate findRealestate(int id);
+
+  /**
+   * 修改楼盘信息
+   *
+   * @param id         楼盘id
+   * @param realestate 楼盘信息
+   * @return Realestate 修改成功后的楼盘信息
+   */
+  Realestate updateRealestate(int id, Realestate realestate);
+
+  /**
+   * 删除楼盘
+   *
+   * @param id 楼盘id
+   */
+  void removeRealestate(int id);
+
+  /**
+   * 查询所有楼盘
+   *
+   * @return List<Realestate> 所有楼盘列表
+   */
+  List<Realestate> indexRealestates();
+
+  /**
+   * 新增建筑楼
+   *
+   * @param realestateId 楼盘id
+   * @param building     建筑楼信息
+   * @return Building 添加成功后的建筑楼信息
+   */
+  Building createBuilding(int realestateId, Building building);
+
+  /**
+   * 查询建筑楼
+   *
+   * @param id 建筑楼id
+   * @return Building 建筑楼信息
+   */
+  Building findBuilding(int id);
+
+  /**
+   * 更改建筑楼信息
+   *
+   * @param id       建筑楼id
+   * @param building 建筑楼信息
+   * @return Building 更改成功后的建筑楼信息
+   */
+  Building updateBuilding(int id, Building building);
+
+  /**
+   * 删除建筑楼
+   *
+   * @param id 建筑楼id
+   */
+  void removeBuilding(int id);
+
+  /**
+   * 查询某一楼盘下的所有建筑楼
+   *
+   * @param realestateId 楼盘id
+   * @return List<Building> 建筑楼列表
+   */
+  List<Building> indexBuildings(int realestateId);
+
+  /**
+   * 新增房源信息
+   *
+   * @param buidingId 建筑楼id
+   * @param house     房源信息
+   * @return House 添加成功后的房源信息
+   */
+  House createHouse(int buidingId, House house);
+
+  /**
+   * 查询房源信息
+   *
+   * @param id 房源id
+   * @return House 房源信息
+   */
+  House findHouse(int id);
+
+  /**
+   * 更改房源信息
+   *
+   * @param id    房源id
+   * @param house 房源信息
+   * @return House 更改成功后的房源信息
+   */
+  House updateHouse(int id, House house);
+
+  /**
+   * 删除房源信息
+   *
+   * @param id 房源id
+   */
+  void removeHouse(int id);
+
+  /**
+   * 查询某一建筑楼下的所有房源
+   *
+   * @param buildingId 建筑楼id
+   * @return List<House> 所有房源列表
+   */
+  List<House> indexHouses(int buildingId);
+
+  /**
+   * 锁定已售房源
+   *
+   * @param ids 已售房源id列表
+   * @return List<House> 锁定的房源列表
+   */
+  List<House> lockHousesForSale(List<Integer> ids);
+}
\ No newline at end of file
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApiRestImpl.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApiRestImpl.java
new file mode 100644
index 0000000..482ead8
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/api/RealestateApiRestImpl.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.api;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Building;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.House;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Realestate;
+import org.apache.servicecomb.samples.practise.houserush.realestate.service.RealestateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestSchema(schemaId = "realestateApiRest")
+@RequestMapping("/")
+public class RealestateApiRestImpl implements RealestateApi {
+
+  @Autowired
+  private RealestateService realestateService;
+
+
+  @PostMapping("/realestates")
+  public Realestate createRealestate(@RequestBody Realestate realestate) {
+    return realestateService.createRealesate(realestate);
+  }
+
+  @GetMapping("/realestates/{id}")
+  public Realestate findRealestate(@PathVariable("id") int id) {
+    return realestateService.findRealestate(id);
+  }
+
+  @PutMapping("realestates/{id}")
+  public Realestate updateRealestate(@PathVariable("id") int id, @RequestBody Realestate realestate) {
+    realestate.setId(id);
+    return realestateService.updateRealestate(realestate);
+  }
+
+  @DeleteMapping("realestates/{id}")
+  public void removeRealestate(@PathVariable("id") int id) {
+    realestateService.removeRealestate(id);
+  }
+
+  @GetMapping("realestates")
+  public List<Realestate> indexRealestates() {
+    return realestateService.indexRealestates();
+  }
+
+  @PostMapping("realestates/{realestateId}/buildings")
+  public Building createBuilding(@PathVariable("realestateId") int realestateId, Building building) {
+    return realestateService.createBuilding(realestateId, building);
+  }
+
+  @GetMapping("buildings/{id}")
+  public Building findBuilding(@PathVariable("id") int id) {
+    return realestateService.findBuilding(id);
+  }
+
+  @PutMapping("buildings/{id}")
+  public Building updateBuilding(@PathVariable("id") int id, @RequestBody Building building) {
+    building.setId(id);
+    return realestateService.updateBuilding(building);
+  }
+
+  @DeleteMapping("buildings/{id}")
+  public void removeBuilding(@PathVariable("id") int id) {
+    realestateService.removeBuilding(id);
+  }
+
+  @GetMapping("realestates/{realestateId}/buildings")
+  public List<Building> indexBuildings(@PathVariable("realestateId") int realestateId) {
+    return realestateService.indexBuildings(realestateId);
+  }
+
+  @PostMapping("buildings/{buildingId}/houses")
+  public House createHouse(@PathVariable("buildingId") int buildingId, House house) {
+    return realestateService.createHouse(buildingId, house);
+  }
+
+  @GetMapping("houses/{id}")
+  public House findHouse(@PathVariable("id") int id) {
+    return realestateService.findHouse(id);
+  }
+
+  @PutMapping("houses/{id}")
+  public House updateHouse(@PathVariable("id") int id, House house) {
+    house.setId(id);
+    return realestateService.updateHouse(house);
+  }
+
+  @DeleteMapping("houses/{id}")
+  public void removeHouse(@PathVariable("id") int id) {
+    realestateService.removeHouse(id);
+  }
+
+  @GetMapping("buildings/{buildingId}/houses")
+  public List<House> indexHouses(@PathVariable("buildingId") int buildingId) {
+    return realestateService.indexHouses(buildingId);
+  }
+
+  @PutMapping("houses/lock_houses_for_sale")
+  public List<House> lockHousesForSale(@RequestBody List<Integer> ids) {
+    return realestateService.lockHousesForSale(ids);
+  }
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/BuildingDao.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/BuildingDao.java
new file mode 100644
index 0000000..f728fdc
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/BuildingDao.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Building;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface BuildingDao extends JpaRepository<Building, Integer> {
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDao.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDao.java
new file mode 100644
index 0000000..93b6940
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDao.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.House;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.persistence.LockModeType;
+import java.util.List;
+
+public interface HouseDao extends JpaRepository<House, Integer>, HouseDaoMore {
+  @Lock(LockModeType.PESSIMISTIC_WRITE)
+  @Query("SELECT h FROM House h WHERE h.id in (?1)")
+  List<House> findAllByIdInForUpdate(List<Integer> ids);
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoImpl.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoImpl.java
new file mode 100644
index 0000000..aec75b3
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoImpl.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.dao;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import java.util.List;
+
+public class HouseDaoImpl implements HouseDaoMore {
+  @PersistenceContext
+  private EntityManager em;
+
+  @Override
+  public int updateLockingStatesForHouses(List<Integer> ids) {
+    return em.createQuery("UPDATE House h set h.state = 'locking' where h.id in (?1)").setParameter(1, ids).executeUpdate();
+  }
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoMore.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoMore.java
new file mode 100644
index 0000000..6b82347
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/HouseDaoMore.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.dao;
+
+import java.util.List;
+
+public interface HouseDaoMore {
+  int updateLockingStatesForHouses(List<Integer> ids);
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/RealestateDao.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/RealestateDao.java
new file mode 100644
index 0000000..2df74e3
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/dao/RealestateDao.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.dao;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Realestate;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface RealestateDao extends JpaRepository<Realestate, Integer> {
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateService.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateService.java
new file mode 100644
index 0000000..525a797
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateService.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.service;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Building;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.House;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Realestate;
+
+import java.util.List;
+
+public interface RealestateService {
+  Realestate createRealesate(Realestate realestate);
+
+  Realestate findRealestate(Integer id);
+
+  Realestate updateRealestate(Realestate realestate);
+
+  void removeRealestate(Integer id);
+
+  List<Realestate> indexRealestates();
+
+  Building createBuilding(Integer realestateId, Building building);
+
+  Building findBuilding(Integer id);
+
+  Building updateBuilding(Building building);
+
+  void removeBuilding(Integer id);
+
+  List<Building> indexBuildings(Integer realestateId);
+
+  House createHouse(Integer buildingId, House house);
+
+  House findHouse(Integer id);
+
+  House updateHouse(House house);
+
+  void removeHouse(Integer id);
+
+  List<House> indexHouses(Integer buildingId);
+
+  List<House> lockHousesForSale(List<Integer> houseIds);
+
+}
diff --git a/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateServiceImpl.java b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateServiceImpl.java
new file mode 100644
index 0000000..85e5ccf
--- /dev/null
+++ b/houserush/realestate/src/main/java/org/apache/servicecomb/samples/practise/houserush/realestate/service/RealestateServiceImpl.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.realestate.service;
+
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Building;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.House;
+import org.apache.servicecomb.samples.practise.houserush.realestate.aggregate.Realestate;
+import org.apache.servicecomb.samples.practise.houserush.realestate.dao.BuildingDao;
+import org.apache.servicecomb.samples.practise.houserush.realestate.dao.HouseDao;
+import org.apache.servicecomb.samples.practise.houserush.realestate.dao.RealestateDao;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DataRetrievalFailureException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class RealestateServiceImpl implements RealestateService {
+  @Autowired
+  private RealestateDao realestateDao;
+
+  @Autowired
+  private BuildingDao buildingDao;
+
+  @Autowired
+  private HouseDao houseDao;
+
+  @Override
+  public Realestate createRealesate(Realestate realestate) {
+    return realestateDao.save(realestate);
+  }
+
+  @Override
+  public Realestate findRealestate(Integer id) {
+    return realestateDao.findOne(id);
+  }
+
+  @Override
+  @Transactional
+  public Realestate updateRealestate(Realestate realestate) {
+    int id = realestate.getId();
+    if (realestateDao.exists(id)) {
+      return realestateDao.save(realestate);
+    } else {
+      throw new DataRetrievalFailureException("cannot update the non-existed realestate");
+    }
+  }
+
+  @Override
+  public void removeRealestate(Integer id) {
+    realestateDao.delete(id);
+  }
+
+  @Override
+  public List<Realestate> indexRealestates() {
+    return realestateDao.findAll();
+  }
+
+  @Override
+  public Building createBuilding(Integer realestateId, Building building) {
+    Realestate realestate = realestateDao.findOne(realestateId);
+    if (null == realestate) {
+      throw new DataRetrievalFailureException("cannot create buildings for" +
+          " the not-existed realestate");
+    } else {
+      building.setRealestate(realestate);
+      return buildingDao.save(building);
+    }
+  }
+
+  @Override
+  public Building findBuilding(Integer id) {
+    return buildingDao.findOne(id);
+  }
+
+  @Override
+  @Transactional
+  public Building updateBuilding(Building building) {
+    int id = building.getId();
+    if (buildingDao.exists(id)) {
+      return buildingDao.save(building);
+    } else {
+      throw new DataRetrievalFailureException("cannot update the non-existed building");
+    }
+  }
+
+  @Override
+  @Transactional
+  public void removeBuilding(Integer id) {
+    buildingDao.delete(id);
+  }
+
+  @Override
+  public List<Building> indexBuildings(Integer realestateId) {
+    Realestate realestate = realestateDao.findOne(realestateId);
+    return realestate.getBuildings();
+  }
+
+  @Override
+  public House createHouse(Integer buildingId, House house) {
+    Building building = buildingDao.findOne(buildingId);
+    if (building != null) {
+      house.setBuilding(building);
+      return houseDao.save(house);
+    } else {
+      throw new DataRetrievalFailureException("cannot create house for the non-existed building");
+    }
+  }
+
+  @Override
+  public House findHouse(Integer id) {
+    return houseDao.findOne(id);
+  }
+
+  @Override
+  public House updateHouse(House house) {
+    int id = house.getId();
+    if (houseDao.exists(id)) {
+      return houseDao.save(house);
+    } else {
+      throw new DataRetrievalFailureException("cannot update the non-existed house");
+    }
+  }
+
+  @Override
+  public void removeHouse(Integer id) {
+    houseDao.delete(id);
+  }
+
+  @Override
+  public List<House> indexHouses(Integer buildingId) {
+    Building building = buildingDao.findOne(buildingId);
+    if (building != null) {
+      return building.getHouses();
+    } else {
+      throw new DataRetrievalFailureException("cannot index the houses for the non-existed building");
+    }
+  }
+
+  @Override
+  @Transactional
+  public List<House> lockHousesForSale(List<Integer> houseIds) {
+    List<House> houses = houseDao.findAllByIdInForUpdate(houseIds);
+    houses.forEach(house -> {
+      if (!"in_stock".equals(house.getState())) {
+        throw new InvocationException(400, "", "house " + house.getId() + " is not in_stock.");
+      }
+    });
+    houseDao.updateLockingStatesForHouses(houseIds);
+    return houses;
+  }
+}
diff --git a/houserush/realestate/src/main/resources/microservice.yaml b/houserush/realestate/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..5b20894
--- /dev/null
+++ b/houserush/realestate/src/main/resources/microservice.yaml
@@ -0,0 +1,43 @@
+#
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# all interconnected microservices must belong to an application wth the same ID
+APPLICATION_ID: houserush
+service_description:
+  # name of the declaring microservice
+  name: realestate
+  version: 0.0.11
+servicecomb:
+  service:
+    registry:
+      address: http://127.0.0.1:30100
+  rest:
+    address: 0.0.0.0:7771
+  handler:
+    chain:
+      Provider:
+        default: bizkeeper-provider
+spring:
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/realestate?characterEncoding=utf8&useSSL=false
+    username: root
+    password: root
+  jpa:
+    properties:
+      hibernate:
+        enable_lazy_load_no_trans: true
\ No newline at end of file
diff --git a/houserush/user-center/pom.xml b/houserush/user-center/pom.xml
index 52dc4f6..016e5be 100644
--- a/houserush/user-center/pom.xml
+++ b/houserush/user-center/pom.xml
@@ -17,12 +17,14 @@
   -->
 
 <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">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
   <parent>
     <artifactId>houserush</artifactId>
     <groupId>org.apache.servicecomb.samples.practice</groupId>
     <version>0.0.1-SNAPSHOT</version>
   </parent>
+
   <modelVersion>4.0.0</modelVersion>
 
   <artifactId>houserush-user-center</artifactId>
@@ -59,5 +61,4 @@
       </plugin>
     </plugins>
   </build>
-
 </project>
diff --git a/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterApplication.java b/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterApplication.java
new file mode 100644
index 0000000..edff407
--- /dev/null
+++ b/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterApplication.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.user.center;
+
+import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.springboot.starter.provider.EnableServiceComb;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+
+@SpringBootApplication
+@EnableServiceComb
+public class UserCenterApplication {
+
+  public static void main(String[] args) {
+    configBeforeBoot();
+    SpringApplication.run(UserCenterApplication.class, args);
+  }
+
+  private static void configBeforeBoot() {
+    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+    RestObjectMapperFactory.getRestObjectMapper().setDateFormat(simpleDateFormat);
+  }
+}
diff --git a/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterConfig.java b/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterConfig.java
new file mode 100644
index 0000000..e9ae84c
--- /dev/null
+++ b/houserush/user-center/src/main/java/org/apache/servicecomb/samples/practise/houserush/user/center/UserCenterConfig.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.samples.practise.houserush.user.center;
+
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class UserCenterConfig {
+}
diff --git a/houserush/user-center/src/main/resources/microservice.yaml b/houserush/user-center/src/main/resources/microservice.yaml
new file mode 100644
index 0000000..e568ad2
--- /dev/null
+++ b/houserush/user-center/src/main/resources/microservice.yaml
@@ -0,0 +1,34 @@
+#
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+# all interconnected microservices must belong to an application wth the same ID
+APPLICATION_ID: houserush
+service_description:
+# name of the declaring microservice
+  name: user-center
+  version: 0.0.2
+servicecomb:
+  service:
+    registry:
+      address: http://192.168.229.134:30100
+  rest:
+    address: 0.0.0.0:6877
+  handler:
+    chain:
+      Provider:
+        default: bizkeeper-provider
\ No newline at end of file
