1.简单介绍
我们会使用一个Dept部门模块做一个微服务通用案例Consumer消费者(Client)通过REST调用Provider提供者(Server)提供的服务。回忆Spring,SpringMVC,MyBatis等以往学习的知识。Maven的分包分模块架构复习
一个父工程带着多个子Module子模块
SpringCloud父工程(Project)下初次带着3个子模块(Module)
springcloud-api 【封装的整体entity / 接口 / 公共配置等】
springcloud-provider-dept-8001【服务提供者】
springcloud-consumer-dept-80【服务消费者】
2.创建项目
1.SpringCloud版本选择
2.父项目的创建
pom.xml文件:
-
<?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.csh</groupId>
-
<artifactId>springcloud</artifactId>
-
<version>1.0-SNAPSHOT</version>
-
<modules>
-
<module>springcloudapi</module>
-
<module>springcloud-provide-dept-8001</module>
-
<module>springcloud-consumer-dept-80</module>
-
<module>springcloud-eureka-7001</module>
-
<module>springcloud-eureka-7002</module>
-
<module>springcloud-eureka-7003</module>
-
<module>springcloud-provide-dept-8002</module>
-
<module>springcloud-provide-dept-8003</module>
-
<module>springcloud-consumer-dept-feign-80</module>
-
<module>springcloud-provide-dept-Hystrix-8001</module>
-
<module>springcloud-consumer-hystrix-dashboard-9001</module>
-
<module>springcloud-zuul-gateway-9527</module>
-
</modules>
-
<packaging>pom</packaging>
-
<properties>
-
<junit.version>4.12</junit.version>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<maven.comiler.source>1.8</maven.comiler.source>
-
<maven.comiler.target>1.8</maven.comiler.target>
-
</properties>
-
<dependencyManagement>
-
<dependencies>
-
<!– springcloud–>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-dependencies</artifactId>
-
<version>Greenwich.SR1</version>
-
<type>pom</type>
-
<scope>import</scope>
-
</dependency>
-
<!– springboot–>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-dependencies</artifactId>
-
<version>2.1.4.RELEASE</version>
-
<type>pom</type>
-
<scope>import</scope>
-
</dependency>
-
<!– 数据库连接–>
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>5.1.47</version>
-
</dependency>
-
<!– 德鲁依连接池–>
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>druid</artifactId>
-
<version>1.1.10</version>
-
</dependency>
-
<dependency>
-
<groupId>org.mybatis.spring.boot</groupId>
-
<artifactId>mybatis-spring-boot-starter</artifactId>
-
<version>1.3.2</version>
-
</dependency>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version> ${junit.version}</version>
-
</dependency>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
<version>1.16.10</version>
-
</dependency>
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback</artifactId>
-
<version>1.2.3</version>
-
</dependency>
-
</dependencies>
-
</dependencyManagement>
-
</project>
这里注意的是Packageing是pom模式主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父类
3.创建api公共模块
首先是pom.xml文件:
-
<?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>springcloud</artifactId>
-
<groupId>com.csh</groupId>
-
<version>1.0-SNAPSHOT</version>
-
</parent>
-
<modelVersion>4.0.0</modelVersion>
-
<artifactId>springcloudapi</artifactId>
-
<properties>
-
<maven.compiler.source>8</maven.compiler.source>
-
<maven.compiler.target>8</maven.compiler.target>
-
</properties>
-
<!– springboot的相关的配置–>
-
<dependencies>
-
<dependency>
-
<groupId>org.projectlombok</groupId>
-
<artifactId>lombok</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-feign</artifactId>
-
<version>1.4.7.RELEASE</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-hystrix</artifactId>
-
<version>1.4.7.RELEASE</version>
-
</dependency>
-
</dependencies>
-
</project>
然后是pojo层实体类的dept的编写:
-
package com.csh.springcloud.pojo;
-
import lombok.AllArgsConstructor;
-
import lombok.Data;
-
import lombok.NoArgsConstructor;
-
import lombok.ToString;
-
import lombok.experimental.Accessors;
-
import java.io.Serializable;
-
@Data
-
@NoArgsConstructor
-
@AllArgsConstructor
-
@ToString
-
@Accessors(chain=true)
-
public class Dept implements Serializable {
-
private int deptno;
-
private String dname;
-
private String db_source;
-
public Dept(String dname) {
-
this.dname = dname;
-
}
-
}
相对应的数据库是:
4.创建provider模块
首先是pom.xml文件:
-
<?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>springcloud</artifactId>
-
<groupId>com.csh</groupId>
-
<version>1.0-SNAPSHOT</version>
-
</parent>
-
<modelVersion>4.0.0</modelVersion>
-
<artifactId>springcloud-provide-dept-8001</artifactId>
-
<dependencies>
-
<!– 自定义的模块–>
-
<dependency>
-
<groupId>com.csh</groupId>
-
<artifactId>springcloudapi</artifactId>
-
<version>1.0-SNAPSHOT</version>
-
</dependency>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.mybatis.spring.boot</groupId>
-
<artifactId>mybatis-spring-boot-starter</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>com.alibaba</groupId>
-
<artifactId>druid</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>ch.qos.logback</groupId>
-
<artifactId>logback-core</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-test</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-devtools</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-jetty</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-eureka</artifactId>
-
<version>1.4.7.RELEASE</version>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-config</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-actuator</artifactId>
-
</dependency>
-
</dependencies>
-
<properties>
-
<maven.compiler.source>8</maven.compiler.source>
-
<maven.compiler.target>8</maven.compiler.target>
-
</properties>
-
<!–用于配置maven加载src-mai-java中的xml文件 ** 代表多层目录加载,一个 * 只能加载一层目录–>
-
<build>
-
<resources>
-
<resource>
-
<directory>src/main/java</directory>
-
<includes>
-
<include>**/*.xml</include>
-
</includes>
-
<filtering>false</filtering>
-
</resource>
-
</resources>
-
</build>
-
</project>
然后是application.yml的编写:
-
server:
-
port: 8001
-
mybatis:
-
type-aliases-package: com.csh.springcloud.pojo
-
mapper-locations: classpath:mybatis/mapper/**.xml
-
spring:
-
application:
-
name: springcloud-provider-dept
-
datasource:
-
type: com.alibaba.druid.pool.DruidDataSource # 数据源
-
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动
-
url: jdbc:mysql://localhost:3306/db01 #数据库名称
-
username: root
-
password: root
-
dbcp2:
-
min-idle: 5 #数据库连接池的最小维持连接数
-
initial-size: 5 #初始化连接数
-
max-total: 5 #最大连接数
-
max-wait-millis: 200 #等待连接获取的最大超时时间
编写部门的dao接口:
-
package com.csh.dao;
-
import org.apache.ibatis.annotations.Mapper;
-
import org.springframework.stereotype.Repository;
-
import com.csh.springcloud.pojo.Dept;
-
import java.util.List;
-
@Mapper
-
@Repository
-
public interface DeptDao {
-
public boolean adddept(Dept dept);
-
public Dept queryByid(int id);
-
public List<Dept> queryall();
-
}
相对应的mapper文件:(mybatis\mapper\DeptDao.xml)
-
<?xml version=”1.0″ encoding=”UTF-8″ ?>
-
<!DOCTYPE mapper
-
PUBLIC “-//mybatis.org//DTD Mapper 3.0//EN”
-
“http://mybatis.org/dtd/mybatis-3-mapper.dtd”>
-
<mapper namespace=”com.csh.dao.DeptDao”>
-
<insert id=”adddept” parameterType=”com.csh.springcloud.pojo.Dept”>
-
insert into dept (deptno,dname,db_source) values (#{deptno},#{dname},#{db_source})
-
</insert>
-
<select id=”queryByid” parameterType=”int” resultType=”com.csh.springcloud.pojo.Dept”>
-
select * from dept where deptno=#{deptno}
-
</select>
-
<select id=”queryall” resultType=”com.csh.springcloud.pojo.Dept”>
-
select * from dept
-
</select>
-
</mapper>
创建Service服务层接口:
-
package com.csh.springcloud.service;
-
import com.csh.springcloud.pojo.Dept;
-
import java.util.List;
-
public interface DeptService {
-
public boolean adddept(Dept dept);
-
public Dept queryByid(int id);
-
public List<Dept> queryall();
-
}
ServiceImpl实现类:
-
package com.csh.springcloud.service;
-
import com.csh.dao.DeptDao;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.stereotype.Service;
-
import com.csh.springcloud.pojo.Dept;
-
import java.util.List;
-
@Service
-
public class DeptServiceImpl implements DeptService{
-
@Autowired
-
DeptDao deptDao;
-
@Override
-
public boolean adddept(Dept dept) {
-
return deptDao.adddept(dept);
-
}
-
@Override
-
public Dept queryByid(int id) {
-
return deptDao.queryByid(id);
-
}
-
@Override
-
public List<Dept> queryall() {
-
return deptDao.queryall();
-
}
-
}
DeptController提供REST服务:
-
package com.csh.controller;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.web.bind.annotation.PathVariable;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RestController;
-
import com.csh.springcloud.pojo.Dept;
-
import com.csh.springcloud.service.DeptService;
-
import java.util.List;
-
@RestController
-
@RequestMapping(“/dept”)
-
public class DeptController {
-
@Autowired
-
private DeptService deptService;
-
@RequestMapping(“/add”)
-
public boolean addone()
-
{
-
return deptService.adddept(new Dept(“78798789789789”));
-
}
-
@RequestMapping(“/find/{id}”)
-
public Dept findbyid(@PathVariable(“id”) int id)
-
{
-
return deptService.queryByid(id);
-
}
-
@RequestMapping(“/selectall”)
-
public List<Dept> findall()
-
{
-
return deptService.queryall();
-
}
-
}
最后一步是编写DeptProvider的主启动类:
-
package com.csh;
-
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
-
import org.springframework.boot.SpringApplication;
-
import org.springframework.boot.autoconfigure.SpringBootApplication;
-
import org.springframework.boot.web.servlet.ServletRegistrationBean;
-
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-
import org.springframework.context.annotation.Bean;
-
import javax.servlet.ServletRegistration;
-
@SpringBootApplication
-
public class DeptProvider8001 {
-
public static void main(String[] args) {
-
SpringApplication.run(DeptProvider8001.class,args);
-
}}