项目的基本搭建
git地址
当天的GIT地址:第一天项目搭建的GIT地址
第二天的博客地址
fastDFS文件上传、GateWay网关鉴权:第二天的博客
父工程的搭建(changgou_parent)
坐标的依赖
<!--springboot的版本控制-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<properties>
<skipTests>true</skipTests>
</properties>
<!--依赖包-->
<dependencies>
<!--test 测试包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二级工程的创建(打包方式为pom)
a、changgou_service:下面放的是提供各个服务的微服务–服务提供者
b、changgou_service_api:服务提供者相对应的实体类和feign接口,一个服务提供者对应于一个api
b、changgou_web:提供视图(页面)的微服务
c、changou_gateway:商家后台网关,消费者前台网关
服务注册中心
-
1 pom文件坐标导入
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
-
2 yml配置文件的配置
server: port: 6868 eureka: client: register-with-eureka: false #是否将自己注册到eureka中 fetch-registry: false #是否从eureka中获取信息 service-url: defaultZone: http://127.0.0.1:${server.port}/eureka/ server: enable-self-preservation: false # 关闭自我保护机制 eviction-interval-timer-in-ms: 3000 # 检查服务的时间间隔
-
3 启动类加上两个注解
@EnableEurekaServer @SpringBootApplication
公共模块定义
changgou_common 通用代码
pom 文件的依赖
<dependencies>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- redis 使用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--fastJson使用-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.51</version>
</dependency>
<!--eureka-client 使用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
实现类四通用的实体类
- 1、page 处理分页的
- 2、pageResult封装分页数据的
- 3、 返回给页面的结果集
- 4、状态码
changgou_common_db:数据库通用配置
changgou_common_db依赖changgou_common
pom 文件的依赖
<dependencies>
<!--依赖了changgou_common 工程-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--通用mapper起步依赖-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
构建商品微服务
changgou_service下的changgou_service_goods
changgou_service_goods的pom文件依赖
<dependencies>
<!--依赖数据库模块 common_db-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou_common_db</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--依赖了service_goods_api 间接依赖了common模块-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou_service_goods_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
changgou_service_api下的changgou_service_goods_api
changgou_service_api的pom文件配置
<dependencies>
<!--feign 远程调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<scope>provided</scope>
</dependency>
<!--配合着通用mapper使用的-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
changgou_service_goods_api的pom配置文件
<!--依赖了changgou_common-->
<dependencies>
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
大致模块结构
代码编辑
changgou_service_goods类似provider
yml的配置
- 1、 mysql的数据源的配置
- 2、eureka将自己的服务以自己的application: name注册到服务注册中心上去
- 3、 feign的启动开关 启动
- 4、 请求的超时配置
server:
port: 9011
spring:
application:
name: goods
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.200.128:3306/changgou_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true #将自己ip地址注册上去
feign:
hystrix:
enabled: true #开启熔断的开关
#hystrix 配置
hystrix:
command:
default:
execution:
timeout:
#如果enabled设置为false,则请求超时交给ribbon控制
enabled: true
isolation:
strategy: SEMAPHORE
controler层的编写
-
1、 controller层和原来一样 使用restful风格来进行编写接口
service层的编写
-
2、 service层加上里 主要是通用mapper的api的使用的方法
//1、selectAll 查询所有的方法 List<Brand> brands = goodsDao.selectAll(); return brands; //2、selectByPrimaryKey 根据主键id查询 Brand brand = goodsDao.selectByPrimaryKey(id); return brand; //3、添加 goodsDao.insertSelective(brand); //4、修改 只会根据对象里有的值修改。为null的值不会修改 goodsDao.updateByPrimaryKeySelective(brand); //5、根据主键删除 goodsDao.deleteByPrimaryKey(id); //6、分页查询 PageHelper.startPage(page1, size); Page<Brand> page = (Page<Brand>) goodsDao.selectAll(); //7、条件查询 //相当于where条件 Example example = new Example(Brand.class); //封装条件 Example.Criteria criteria = example.createCriteria(); if (map != null) { //对品牌名称进行模糊查询 if (map.get("name") != null && !map.get("name").equals("")) { criteria.andLike("name", "%" + map.get("name") + "%"); } //对品牌缩写进行精确搜索 if (map.get("letter") != null && !map.get("letter").equals("")) { criteria.andEqualTo("letter", map.get("letter")); } } //相当于查询语句后面写了where 指定条件 List<Brand> brands = goodsDao.selectByExample(example); return brands;
dao的编写
-
3、 dao层继承了接口继承了Mapper接口 里面的泛型指定了Brand实体类
//继承接口 public interface GoodsDao extends Mapper<Brand> {}
全局异常拦截
-
4、全局异常处理 handler
/** * @Description: * @Version: V1.0 * * 全局异常捕获 */ @ControllerAdvice public class BaseExceptionHandler { //出现异常就被这个拦截掉返回给页面 @ExceptionHandler(value = Exception.class) @ResponseBody public Result error(Exception e) { e.printStackTrace(); return new Result(false, StatusCode.ERROR, "你的网络有问题,请等一会再连接"); } }
changgou_service_goods_api(提供java bean)
里面的Brand这个实体类
1、类上加了@Table这个注解里面的name属性指定了表的名称
2、Brand的属性值对应了表中的字段名称
3、指定主键
@Table(name = "tb_brand") //表的名称 public class Brand { @Id //指定主键 private Integer id;//品牌id private String name;//品牌名称 private String image;//品牌图片地址 private String letter;//品牌的首字母 private Integer seq;//排序
-
}
}
```
changgou_service_goods_api(提供java bean)
里面的Brand这个实体类
1、类上加了@Table这个注解里面的name属性指定了表的名称
2、Brand的属性值对应了表中的字段名称
3、指定主键
@Table(name = "tb_brand") //表的名称
public class Brand {
@Id //指定主键
private Integer id;//品牌id
private String name;//品牌名称
private String image;//品牌图片地址
private String letter;//品牌的首字母
private Integer seq;//排序