1.创建父工程
2.父工程pom.xml文件内容
目录结构截图
pom.xml详情
<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.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.20</lombok.version> </properties>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.31</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> </dependencies> </dependencyManagement>
</project> |
3. springcloud-model-api公共子模块Module
约定 > 配置 > 编码
Maven Module 子模块
<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>
<!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 --> <parent> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <!-- 当前Module我自己叫什么名字 --> <artifactId>springcloud-model-api</artifactId>
<!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 --> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project> |
新建部门pojo且配合lombok使用
package com.jiangjy.springcloud.pojo;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors;
@AllArgsConstructor//全部带参构造器 @NoArgsConstructor//无参构造器 @Data//getter setter方法 @Accessors(chain=true)//链式结构 public class Dept implements Serializable{ private static final long serialVersionUID = 1L; private Long deptno;//主键 private String dname;//部门名称 private String db_source;//来自哪个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同的数据库 public Dept(String dname) { super(); this.dname = dname; }
}
|
数据库表及数据
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `dept`
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`deptno` bigint(20) NOT NULL AUTO_INCREMENT,
`dname` varchar(60) DEFAULT NULL,
`db_source` varchar(60) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('1', '法务部', DATABASE());
INSERT INTO `dept` VALUES ('2', '开发部', DATABASE());
INSERT INTO `dept` VALUES ('3', '人事部', DATABASE());
INSERT INTO `dept` VALUES ('4', '财务部', DATABASE());
INSERT INTO `dept` VALUES ('5', '市场部', DATABASE());
INSERT INTO `dept` VALUES ('6', '运维部', DATABASE());
INSERT INTO `dept` VALUES ('7', '后勤部', DATABASE());
当前子项目右键-Run As-Maven clean
mvn clean install后给其它模块引用,达到通用目的。 也即需要用到部门实体的话,不用每个工程都定义一份,直接引用本模块即可。 |
4. springcloud-model-provider-dept-8001 部门微服务提供者Module
创建子模块(生产者-供应商)
配置pom.xml
<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> <parent> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent>
<artifactId>springcloud-model-provider-dept-8001</artifactId>
<dependencies> <!-- 引入自己定义的api通用包,可以使用Dept部门pojo <version>${project.version}</version>灵活的版本 --> <dependency> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model-api</artifactId> <version>${project.version}</version> </dependency> <!-- 测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <!-- mysql驱动包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 阿里数据源 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <!-- 日志 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <!-- mybatis-spring整合 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- 内嵌的服务器容器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- 修改后立即生效,热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
</project> |
配置application.yml
server: port: 8001 #访问的端口号
#mybatis整合 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml #mybatis配置文件所在路径 type-aliases-package: com.jiangjy.springcloud.pojo #所有pojo别名类所在包 mapper-locations: - classpath:mybatis/mappers/*.xml #mapper映射文件
#spring整合 spring: application: name: springcloud-model-dept #项目对外暴露的访问名称 datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 driver-class-name: com.mysql.jdbc.Driver # mysql驱动包 com.mysql.jdbc.Driver的前身是org.gjt.mm.mysql.Driver, # 现在主要用com.mysql.jdbc.Driver,但为了保持兼容性保留了org.gjt.mm.mysql.Driver这个路径的引用。 url: jdbc:mysql://localhost:3306/springcloud01 # 数据库名称 username: root password: root dbcp2: min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化连接数 max-total: 5 # 最大连接数 max-wait-millis: 200 # 等待连接获取的最大超时时间
|
Dao层
package com.jiangjy.springcloud.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.jiangjy.springcloud.pojo.Dept;
@Mapper public interface DeptDao {
//查询所有 public List<Dept> findAll();
//根据Id查询 public Dept findById(Long id);
//添加 public boolean addDept(Dept dept); }
|
Dao 的mapper
<?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.jiangjy.springcloud.dao.DeptDao">
<select id="findAll" resultType="com.jiangjy.springcloud.pojo.Dept"> select deptno,dname,db_source from dept </select>
<select id="findById" resultType="com.jiangjy.springcloud.pojo.Dept"> select deptno,dname,db_source from dept where deptno=#{deptno} </select>
<insert id="addDept" parameterType="com.jiangjy.springcloud.pojo.Dept"> INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE()) </insert> </mapper> |
Service层
package com.jiangjy.springcloud.service;
import java.util.List;
import com.jiangjy.springcloud.pojo.Dept;
public interface DeptService {
// 查询所有 public List<Dept> getAll();
// 根据Id查询 public Dept getById(Long id);
// 添加 public boolean addDept(Dept dept); }
|
Service 实现层impl
package com.jiangjy.springcloud.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import com.jiangjy.springcloud.dao.DeptDao; import com.jiangjy.springcloud.pojo.Dept; import com.jiangjy.springcloud.service.DeptService;
@Service public class DeptServiceImpl implements DeptService {
@Autowired private DeptDao deptDao;
@Override public List<Dept> getAll() {
return deptDao.findAll(); }
@Override public Dept getById(Long id) {
return deptDao.findById(id); }
@Override public boolean addDept(Dept dept) { return deptDao.addDept(dept); }
}
|
Controller控制层
package com.jiangjy.springcloud.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;
import com.jiangjy.springcloud.pojo.Dept; import com.jiangjy.springcloud.service.DeptService;
@RestController public class DeptController {
@Autowired private DeptService deptService;
@RequestMapping(value="/dept/add",method = RequestMethod.POST) public boolean add(@RequestBody Dept dept) {
return deptService.addDept(dept); }
@RequestMapping(value="/dept/getById/{id}",method = RequestMethod.GET) public Dept getById(@PathVariable("id") Long id) {
return deptService.getById(id); }
@RequestMapping(value="/dept/getAll",method = RequestMethod.GET) public List<Dept> getAll() {
return deptService.getAll(); }
}
|
主启动类
package com.jiangjy.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class DeptProvider8001_APP {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_APP.class, args); } }
|
代码启动
数据展示
5.springcloud-model-consumer-dept-80部门微服务消费者Module
创建子模块 消费者
约定 > 配置 > 编码约定 > 配置 > 编码
Pom.xml文件
<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> <parent> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>springcloud-model-consumer-dept-80</artifactId> <description>部门微服务消费者</description>
<dependencies> <dependency><!-- 自己定义的api --> <groupId>com.jiangjy.springcloud</groupId> <artifactId>springcloud-model-api</artifactId> <version>${project.version}</version> </dependency> <!-- Ribbon相关,详情见文档 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 修改后立即生效,热部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
</project> |
application.yml 文件
server: port: 80 |
Ribbon详解 - 简书 https://www.jianshu.com/p/1bd66db5dc46
package com.jiangjy.springcloud.cfgbeans;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;
@Configuration public class ConfigBean { /** * //boot -->spring applicationContext.xml --- @Configuration配置 ConfigBean = applicationContext.xml * @return */ @Bean public RestTemplate geRestTemplate() { return new RestTemplate(); } } //@Bean //public UserServcie getUserServcie() //{ // return new UserServcieImpl(); //} //applicationContext.xml == ConfigBean(@Configuration) //<bean id="userServcie" class="com.jiangjy.service.impl.UserServiceImpl"> |
消费者控制层
package com.jiangjy.springcloud.controller;
import java.util.List;
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 org.springframework.web.client.RestTemplate;
import com.jiangjy.springcloud.pojo.Dept;
@RestController public class DeptController_Consumer {
public static final String REST_URL_PREFIX = "http://localhost:8001"; /** * 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 * (url, request, responseType)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。 */ @Autowired private RestTemplate restTemplate;
@RequestMapping("/consumer/dept/add") public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class); }
@RequestMapping("/consumer/dept/getById/{id}") public Dept getById(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/getById/"+ id, Dept.class); }
@SuppressWarnings("unchecked") @RequestMapping("/consumer/dept/getAll") public List<Dept> getAll() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/getAll", List.class); }
}
|
主启动类
package com.jiangjy.springcloud;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class DeptConsumer80_APP {
public static void main(String[] args) { SpringApplication.run(DeptConsumer80_APP.class, args); } }
|
运行结果图:
基础的微服务底层程序到此已基本完成