(超详细)SSM+SpringBoot+SpringCloud--Rest微服务简单案例(学习springcloud之前可以参考)
2018-12-18 08:51
423 查看
学习springcloud之前可以参考本文回顾基础知识,需要有Maven+springmvc+mybatis+mysql基础
1.Maven的分包分模块架构
一个Project带着多个Module子模块
ServiceCloud父工程(Project)管理依赖
包含3个子模块(Module)
- cloud-api:封装的整体Entity/接口/公共配置等
- cloud-provider-dept-8001:微服务落地的服务提供者
- cloud-consumer-dept-80:微服务调用的客户端使用
2.创建servicecloud父工程
idea创建一个maven项目,创建好后之后一个src文件和一个pom.xml文件
pom文件内容如下:
<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.shawn</groupId> <artifactId>service-cloud</artifactId> <version>1.0-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.18</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.0.4</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> <build> <finalName>service-cloud</finalName> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimit>$</delimit> </delimiters> </configuration> </plugin> </plugins> </build> <!--以下是和其他模块依赖,报错可以先注释掉--> <modules> <module>cloud-api</module> <module>cloud-provider-dept-8001</module> <module>cloud-consume-dept-80</module> </modules> </project>
servicecloud父工程主要是定义POM文件,将后续各个子模块公用的jar包等统一提出来,类似一个抽象父类
3.创建cloud-api 封装的整体Entity/接口/公共配置等
直接在父工程上点击右键创建新的Module
next下一步 再Finish
目录结构:
修改Pom文件:
<?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>service-cloud</artifactId> <groupId>com.shawn</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> <artifactId>cloud-api</artifactId> </project>
lombok
在项目中使用Lombok可以减少很多重复代码。比如说getter/setter/toString等方法的编写。
插件安装方法:打开IDEA的Setting –> 选择Plugins选项 –> 选择Browse repositories –> 搜索lombok –> 点击安装 –> 安装完成重启IDEA
如果安装不了可以选择去官网下载jar包,然后本地安装。
配合lombok创建部门Entity:
package com.shawn.springcloud.entites; import java.io.Serializable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @NoArgsConstructor //无参构造 @AllArgsConstructor//全餐构造 @Data //get/set方法 @Accessors(chain=true)//链式调用 public class Dept implements Serializable// entity --orm--- db_table { private Long deptno; // 主键 private String dname; // 部门名称 private String db_source;// 来自那个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库 public Dept(String dname) { super(); this.dname = dname; } }
4.创建cloud-provider-dept-8001 服务提供者
- 参照cloud-api创建cloud-provider-dept-8001工程
- 修改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> <artifactId>service-cloud</artifactId> <groupId>com.shawn</groupId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>cloud-provider-dept-8001</artifactId> <dependencies> <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity --> <groupId>com.shawn</groupId> <artifactId>cloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <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> <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>
- 新建yml文件,并配置信息
server: port: 8001 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路径 type-aliases-package: com.shawn.springcloud.entites # 所有Entity别名类所在包 mapper-locations: - classpath:mybatis/mapper/**/*.xml # mapper映射文件 spring: application: name: cloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型 driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包 url: jdbc:mysql://localhost:3306/clouddb01 # 数据库名称 username: root password: 123456 dbcp2: min-idle: 5 # 数据库连接池的最小维持连接数 initial-size: 5 # 初始化连接数 max-total: 5 # 最大连接数 max-wait-millis: 200 # 等待连接获取的最大超时时间
- 工程src/main/resources目录下新建mybatis文件夹后新建mybatis.cfg.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="cacheEnabled" value="true"/><!-- 二级缓存开启 --> </settings> </configuration>
- MySQL创建部门数据库脚本
新建数据库直接执行就可以了
DROP DATABASE IF EXISTS cloudDB01; CREATE DATABASE cloudDB01 CHARACTER SET UTF8; USE cloudDB01; CREATE TABLE dept ( deptno BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(60), db_source VARCHAR(60) ); INSERT INTO dept(dname,db_source) VALUES('开发部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('人事部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('财务部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('市场部',DATABASE()); INSERT INTO dept(dname,db_source) VALUES('运维部',DATABASE()); SELECT * FROM dept;
- DeptDao部门接口
@Mapper public interface DeptDao { public boolean addDept(Dept dept); public Dept findById(Long id); public List<Dept> findAll(); }
- 工程src/main/resources/mybatis目录下新建mapper文件夹后再建DeptMapper.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.shawn.springcloud.dao.DeptDao"> <select id="findById" resultType="Dept" parameterType="Long"> select deptno,dname,db_source from dept where deptno=#{deptno}; </select> <select id="findAll" resultType="Dept"> select deptno,dname,db_source from dept; </select> <insert id="addDept" parameterType="Dept"> INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE()); </insert> </mapper>
- DeptService部门服务接口
public interface DeptService { public boolean add(Dept dept); public Dept get(Long id); public List<Dept> list(); }
- DeptServiceImpl部门服务接口实现类
@Service public class DeptServiceImpl implements DeptService { @Autowired private DeptDao dao ; @Override public boolean add(Dept dept) { return dao.addDept(dept); } @Override public Dept get(Long id) { return dao.findById(id); } @Override public List<Dept> list() { return dao.findAll(); } }
- DeptController部门微服务提供者REST
@RestController public class DeptController { @Autowired private DeptService service; @RequestMapping(value="/dept/add",method=RequestMethod.POST) public boolean add(@RequestBody Dept dept) { return service.add(dept); } @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET) public Dept get(@PathVariable("id") Long id) { return service.get(id); } @RequestMapping(value="/dept/list",method=RequestMethod.GET) public List<Dept> list() { return service.list(); } }
- DeptProvider8001_App主启动类DeptProvider8001_App
@SpringBootApplication public class DeptProvider8001_App { public static void main(String[] args) { SpringApplication.run(DeptProvider8001_App.class,args); } }
- 构建完成,打开浏览器测试
http://localhost:8001/dept/get/2
http://localhost:8001/dept/list
补充一下项目结构:
5.创建cloud-consumer-dept-80 消费者
- 参照上文创建出maven工程cloud-consumer-dept-80
- 修改Pom文件
<?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>service-cloud</artifactId> <groupId>com.shawn</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <dependencies> <dependency><!-- 引入自己定义的api通用包,可以使用Dept部门Entity --> <groupId>com.shawn</groupId> <artifactId>cloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</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> <artifactId>cloud-consume-dept-80</artifactId> </project>
- 新增yml文件application.yml
server: port: 80
- 编写配置文件configbean(类似spring里面的applicationContext.xml写入的注入Bean)
package com.shawn.springcloud.cfgbeans; @Configuration public class ConfigBean { @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
- 新建DeptController_Consumer部门微服务消费者REST
package com.shawn.springcloud.controller; @RestController public class DeptController_Consumer { private static final String REST_URL_PREFIX = "http://localhost:8001"; @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/get/{id}") public Dept get(@PathVariable("id") Long id ){ return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id,Dept.class); } @RequestMapping("/consumer/dept/list") public List<Dept> list(){ return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class); } }
注:RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
使用:
restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表
REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
- 最后主启动类编写
package com.shawn.springcloud; @SpringBootApplication public class DeptConsumer80_App { public static void main(String[] args) { SpringApplication.run(DeptConsumer80_App.class, args); } }
6. 编写完成,最后进行测试
- 访问消费者接口(注意,是访问消费者的!80端口)
http://localhost/consumer/dept/get/2
- http://localhost/consumer/dept/list
END
阅读更多相关文章推荐
- SpringCloud学习教程二( 服务消费者rest+ribbon )
- SpringCloud SpringBoot mybatis 分布式微服务(九)Spring Boot中使用Spring-data-jpa让数据访问更简单
- SpringCloud SpringBoot mybatis 分布式微服务(二十九)Restdoc生成api文档
- 文档转载,可以参考。SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释
- SpringCloud(一):用springboot实现简单服务调用
- Spring Boot和Spring Cloud微服务架构学习(四)-Spring Cloud总结
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
- springboot一个项目多模块打包(终于可以了,网络上的能在仔细点吗)。参考了很多,来个详细的。
- spring-cloud学习笔记基于spring-boot2.0.3--服务提供与调用
- SpringCloud(1)---基于RestTemplate微服务项目案例
- 重拾后端之Spring Boot(一):REST API的搭建可以这样简单
- springboot+spring cloud实现简单的gateway注册服务
- Spring Boot和Spring Cloud微服务架构学习(五)-Docker总结
- spring boot / cloud (八) 使用RestTemplate来构建远程调用服务
- SpringBoot,SpringCloud,Docker构建微服务学习笔记
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
- 文档转载,可以参考。SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释
- 关于Spring-boot学习中对于@Controller和@RestController的简单记录
- 01.Spring Cloud学习笔记之使用IDEA+Spring Boot快速构建Rest服务
- SpringBoot,SpringCloud,Docker构建微服务学习笔记