SpringCloud - 02使用REST实现服务通信
(1)项目框架
工程项目POM文件
<packaging>pom</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <mysql.version>5.1.43</mysql.version> <druid.version>1.1.19</druid.version> <spring.boot.version>2.3.6.RELEASE</spring.boot.version> <spring.cloud.version>Hoxton.SR9</spring.cloud.version> <spring.cloud.eureka.server.version>2.2.6.RELEASE</spring.cloud.eureka.server.version> <spring.cloud.eureka.client.version>2.2.6.RELEASE</spring.cloud.eureka.client.version> <spring.cloud.config.version>2.2.6.RELEASE</spring.cloud.config.version> <spring.cloud.ribbon.version>2.2.6.RELEASE</spring.cloud.ribbon.version> <spring.cloud.feign.version>2.2.6.RELEASE</spring.cloud.feign.version> <spring.cloud.hystrix.version>2.2.6.RELEASE</spring.cloud.hystrix.version> <spring.cloud.hystrix.dashboard.version>2.2.6.RELEASE</spring.cloud.hystrix.dashboard.version> <spring.cloud.zuul.version>2.2.6.RELEASE</spring.cloud.zuul.version> <mybatis.spring.boot.version>2.1.0</mybatis.spring.boot.version> <lombok.version>1.18.12</lombok.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring.cloud.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>${spring.cloud.eureka.server.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>${spring.cloud.eureka.client.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>${spring.cloud.ribbon.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>${spring.cloud.config.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>${spring.cloud.config.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${spring.cloud.feign.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>${spring.cloud.hystrix.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>${spring.cloud.hystrix.dashboard.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> <version>${spring.cloud.zuul.version}</version> </dependency> </dependencies> </dependencyManagement>
服务框架:
- Project : 整体父工程,定义POM文件
- microservicecloud-api : 公共子模块Module, 封装的entity/接口/公共配置等
- microservicecloud-dept-provider : 部门微服务提供者Module
- microservicecloud-dept-consumer : 部门微服务消费者Module
(2)microservicecloud-api
Dept类
@Data public class Dept implements Serializable { private Long deptno; private String dname; private String db_source; }
(3)microservicecloud-dept-provider
(3.1)POM文件
<dependency> <groupId>com.bearpx</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</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-test</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
(3.2)application.yml配置文件
server: port: 8001 mybatis: config-location: classpath:mybatis/mybatis-config.xml type-aliases-package: com.bearpx.springcloud.entity mapper-locations: - classpath:mapper/*.xml spring: application: name: microservicecloud-dept-provider datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/clouddb01?useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: Mysql2020 dbcp2: min-idle: 5 initial-size: 5 max-total: 10 max-wait-millis: 200
(3.3)MyBatis配置文件mybatis-config.xml
<configuration> <settings> <setting name="cacheEnabled" value="true"/> </settings> </configuration>
(3.4)SQL语句
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(50), db_source varchar(50) ); 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());
(3.5)DeptDao接口及Dept.xml文件
@Mapper public interface DeptDao { public boolean addDept(Dept dept); public Dept findById(Long id); public List<Dept> findAll(); }
<?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.bearpx.springcloud.dept.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>
(3.6) DeptService/DeptServiceImpl类
@Service // import org.springframework.stereotype.Service; public class DeptServiceImpl implements DeptService { @Autowired private DeptDao deptDao; public boolean add(Dept dept) { return deptDao.addDept(dept); } public Dept get(Long id) { return deptDao.findById(id); } public List<Dept> list() { return deptDao.findAll(); } }
(3.7)DeptController类
@RestController @RequestMapping("/dept") public class DeptController { @Autowired private DeptService deptService; @RequestMapping(value = "/add", method = RequestMethod.POST) public boolean add(@RequestBody Dept dept){ return deptService.add(dept); } @RequestMapping(value = "/get/{id}", method = RequestMethod.GET) public Dept get(@PathVariable("id") Long id){ return deptService.get(id); } @RequestMapping(value = "/list", method = RequestMethod.GET) public List<Dept> list(){ return deptService.list(); } }
(3.8)主启动类
@SpringBootApplication public class DeptProviderApplication { public static void main(String[] args) { SpringApplication.run(DeptProviderApplication.class, args); } }
(4)microservicecloud-dept-consumer
(4.1)POM文件
<dependencies> <dependency> <groupId>com.bearpx</groupId> <artifactId>microservicecloud-api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
(4.2)ConfigBean类
- RestTemplate提供了多种便捷访问远程HTTP服务的方法,是一种访问RESTful服务模板类。
- 是Spring提供的用于访问REST服务的客户端模板工具集。
- restful接口:(url, requestMap, ResponseBean.class)-> REST请求地址、请求参数、HTTP响应被转换为对象类型
@Configuration public class ConfigBean { @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
(4.3)消费者Controller类
@RestController public class DeptConsumerController { private final static String REST_DEPT_URL_PREFIX ="http://localhost:8001"; @Autowired private RestTemplate restTemplate; @RequestMapping("/consumer/dept/add") public boolean add(Dept dept){ return restTemplate.postForObject(REST_DEPT_URL_PREFIX+"/dept/add", dept, Boolean.class); } @RequestMapping("/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id){ return restTemplate.getForObject(REST_DEPT_URL_PREFIX+"/dept/get/"+id, Dept.class); } @RequestMapping("/consumer/dept/list") public List<Dept> list(){ return restTemplate.getForObject(REST_DEPT_URL_PREFIX+"/dept/list", List.class); } }
(4.4)主启动类
@SpringBootApplication public class DeptConsumerApplication { public static void main(String[] args) { SpringApplication.run(DeptConsumerApplication.class, args); } }
(4.5)测试