乐优商城项目搭建并完成商品微服务部分业务
乐优商城项目搭建
自学乐优商城笔记
基础环境
技术选型
前端:
- HTML、CSS、JavaScript(基于ES6标准)
- JQuery
- Vue.js 2.0以及基于Vue的框架:Vuetify
- 前端构建工具:WebPack
- 前端安装包工具:NPM
- Vue脚手架:Vue-cli
- Vue路由:vue-router
- ajax框架:axios
- 基于Vue的富文本框架:quill-edito
后端:
- SpringMVC、Spring 5.0和MyBatis3
- Spring Boot 2.0.1版本
- Spring Cloud 最新版 Finchley.RC1
- Redis-4.0
- RabbitMQ-3.4
- Elasticsearch-5.6.8
- nginx-1.10.2:
- FastDFS - 5.0.8
- MyCat
- Thymeleaf
开发环境
- IDE:IntelliJ IDEA 2018.3.1
- JDK:jdk1.8.0_121
- 项目构建:maven 3.6.0
- 版本控制:git
访问域名
一级域名:www.leyou.com
二级域名:manage.leyou.com
,api.leyou.com
通过修改hosts
文件完成
项目搭建
搭建父工程
- 创建mvaen项目,不需要骨架
- GroupId:
com.leyou
- ArifactId:
parent
- 编写
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| <?xml version="1.0" encoding="UTF-8"?> <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"> <modelVersion>4.0.0</modelVersion>
<groupId>com.leyou</groupId> <artifactId>parent</artifactId> <version>1.0.0-SNAPSHOT</version>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RC1</spring-cloud.version> <mybatis.starter.version>1.3.2</mybatis.starter.version> <mapper.starter.version>2.0.2</mapper.starter.version> <druid.starter.version>1.1.9</druid.starter.version> <mysql.version>5.1.32</mysql.version> <pageHelper.starter.version>1.2.3</pageHelper.starter.version> <leyou.latest.version>1.0.0-SNAPSHOT</leyou.latest.version> <fastDFS.client.version>1.26.1-RELEASE</fastDFS.client.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.starter.version}</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>${mapper.starter.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pageHelper.starter.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>${fastDFS.client.version}</version> </dependency> </dependencies> </dependencyManagement>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
|
父工程主要为依赖管理
搭建微服务注册中心
- 创建maven项目,制定父工程为
com.leyou.parent
- GroupId:
com.leyou.common
- ArifactId:
ly-register
- 编写
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>parent</artifactId> <groupId>com.leyou</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<groupId>com.leyou.common</groupId> <artifactId>ly-register</artifactId> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> </project>
|
- 编写启动类
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.leyou.register;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer @SpringBootApplication public class LyRegister { public static void main(String[] args) { SpringApplication.run(LyRegister.class, args); } }
|
全类名:com.leyou.register.LyRegister
- 编写
application.yml
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| spring: application: name: ly-register server: port: 9999 eureka: client: fetch-registry: false register-with-eureka: false service-url: defaultZone: http://127.0.0.1:${server.port}/eureka server: enable-self-preservation: false eviction-interval-timer-in-ms: 5000
|
搭建微服务网关
- 创建maven项目
- GroupId:
com.leyou.common
- ArifactId:
ly-gateway
- 编写
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>parent</artifactId> <groupId>com.leyou</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <version>1.0.0-SNAPSHOT</version> <groupId>com.leyou.common</groupId> <artifactId>ly-gateway</artifactId>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
|
- 编写启动类
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.leyou;
import org.springframework.boot.SpringApplication; import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy @SpringCloudApplication public class LyGateway { public static void main(String[] args) { SpringApplication.run(LyGateway.class, args); } }
|
全类名:com.leyou.gateway.LyGateway
- 编写
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| server: port: 10001 spring: application: name: api-gateway eureka: client: service-url: defaultZone: http://127.0.0.1:9999/eureka zuul: prefix: /api ribbon: ConnectTimeout: 1000 ReadTimeout: 3500 MaxAutoRetriesNextServer: 0 MaxAutoRetries: 0 hystrix: command: default: execution: isolation: thread: timeoutInMillisecond: 9999
|
商品微服务搭建
商品微服务结构
也采用父子结构
- ly-item(父工程)
- ly-item-interface:主要内容为实体类和接口
- ly-item-service:主要内容为业务逻辑
创建商品微服务父工程
- 创建maven项目,其父工程为ly-parent
- GroupId:
com.leyou.service
- ArifactId:
ly-item
- 修改
pom.xml
中的打包方式为pom
1
| <packaging>pom</packaging>
|
创建商品微服务-interface
- 创建maven项目,其父工程为:ly-item
- GroupId:
com.leyou.service
- ArifactId:
ly-item-interface
创建商品微服务-service
- 创建maven项目
- GroupId:
com.leyou.service
- ArifactId:
ly-item-service
- 编写
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| <?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>ly-item</artifactId> <groupId>com.leyou.service</groupId> <version>1.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion>
<groupId>com.leyou.service</groupId> <artifactId>ly-item-service</artifactId> <version>1.0.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.starter.version}</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>${mapper.starter.version}</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pageHelper.starter.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.leyou.service</groupId> <artifactId>ly-item-interface</artifactId> <version>${leyou.latest.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> </project>
|
- 编写启动类
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.leyou.service;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication @EnableDiscoveryClient public class LyItemService { public static void main(String[] args) { SpringApplication.run(LyItemService.class, args); } }
|
- 编写
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server: port: 8001 spring: application: name: item-service datasource: url: jdbc:mysql://localhost:3306/leyou username: root password: 123456 hikari: maximum-pool-size: 30 minimum-idle: 10 eureka: client: service-url: defaultZone: http://127.0.0.1:99990/eureka
|
- 配置网关路由
启动测试
启动
查看注册中心
搭建通用微服务
主要包含:工具类,通用异常处理,通用bean
创建项目
- 创建maven项目
- GroupId:
com.leyou.common
- ArifactId:
ly-common
工具类
将准备好的工具类放入该项目中,也可以在要使用时再添加。
通用异常处理
- 新建异常信息枚举类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.leyou.common.enums;
import lombok.AllArgsConstructor; import lombok.Getter;
@Getter @AllArgsConstructor public enum LyExceptionEnum {
PARAM_CANNOT_BE_NULL(400, "参数不能为空") ; private int code; private String message; }
|
- 新建自定义异常类
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.leyou.common.exception;
import com.leyou.common.enums.LyExceptionEnum; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor;
@Getter @AllArgsConstructor @NoArgsConstructor public class LyException extends RuntimeException { private LyExceptionEnum lyExceptionEnum; }
|
- 新建自定义异常VO
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.leyou.common.vo;
import com.leyou.common.enums.LyExceptionEnum; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;
@Data @AllArgsConstructor @NoArgsConstructor public class LyExceptionResult { private int status; private String message; private long timestamp;
public LyExceptionResult(LyExceptionEnum lyExceptionEnum) { this.status = lyExceptionEnum.getCode(); this.message = lyExceptionEnum.getMessage(); this.timestamp = System.currentTimeMillis(); } }
|
- 编写通用异常处理器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.leyou.common.exception;
import com.leyou.common.vo.LyExceptionResult; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice public class LyExceptionHandler {
@ExceptionHandler(LyException.class) public ResponseEntity<LyExceptionResult> commonExceptionHandler(LyException e) { return ResponseEntity.status(e.getLyExceptionEnum().getCode()) .body(new LyExceptionResult(e.getLyExceptionEnum())); } }
|
编写测试
- 在
item-service
中定义controller类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.leyou.item.web;
import com.leyou.common.enums.LyExceptionEnum; import com.leyou.common.exception.LyException; import org.apache.commons.lang3.StringUtils; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class TestExceptionHandlerController { @PostMapping("/test/{msg}") public ResponseEntity<String> test(@PathVariable("msg")String msg) { if (StringUtils.isBlank(msg)) { throw new LyException(LyExceptionEnum.PARAM_CANNOT_BE_NULL); } return ResponseEntity.ok(msg); } }
|
测试结果