SpringClou微服务如何通过HTTP调用服务:
简介
是资源呈现出来的形式,比如上述URI返回的HTML或JSON,包括HTTP Header等; REST是一个无状态的架构模式,因为在任何时候都可以由客户端发出请求到服务端,最终返回自己想要的数据,当前请求不会受到上次请求的影响。也就是说,服务端将内部资源发布REST服务,客户端通过URL来定位这些资源并通过HTTP协议来访问它们。
项目结构
为了实现REST风格的设计我们需要首先构建一个空项目,在添加一个项目作为父项目,设计统一的版本。在父项目中我们设计统一的资源。
microservicecloud
父项目microservicecloud只有这一个XML来统一管理版本问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 <?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.hph.springcloud</groupId > <artifactId > microservicecloud</artifactId > <packaging > pom</packaging > <version > 1.0-SNAPSHOT</version > <modules > <module > microservicecloud-api</module > <module > microservicecloud-provider-dept-8001</module > <module > microservicecloud-consumer-dept-80</module > </modules > <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.1.47</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 >
microservicecloud-api
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?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 > microservicecloud</artifactId > <groupId > com.hph.springcloud</groupId > <version > 1.0-SNAPSHOT</version > </parent > <modelVersion > 4.0.0</modelVersion > <artifactId > microservicecloud-api</artifactId > <dependencies > <dependency > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > </dependency > </dependencies > </project >
microservicecloud-api只有这个类,为什么没有get,set呢,这是因为我们使用了lombok
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package com.hph.springcloud.entities;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;import java.io.Serializable;@SuppressWarnings ("serial" )@NoArgsConstructor @Data @Accessors (chain = true )public class Dept implements Serializable { private Long deptno; private String dname; private String db_source; public Dept (String dname) { super (); this .dname = dname; } }
在此之前我们需要执行 Maven install 来将这个公有使用的Bean安装到Maven依赖中。
microservicecloud-provider-dept-8001
新建一个MAVEN在microserviceclou中作为microserviceclou的子项目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 <?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 > microservicecloud</artifactId > <groupId > com.hph.springcloud</groupId > <version > 1.0-SNAPSHOT</version > </parent > <modelVersion > 4.0.0</modelVersion > <artifactId > microservicecloud-provider-dept-8001</artifactId > <dependencies > <dependency > <groupId > com.hph.springcloud</groupId > <artifactId > microservicecloud-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 >
mybatis.cfg.xml
1 2 3 4 5 6 7 8 9 10 11 12 <?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 >
config
application.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 server: port: 8001 mybatis: config-location: classpath:mybatis/mybatis.cfg.xml type-aliases-package: com.hph.springcloud.entities mapper-locations: - classpath: mybatis/mapper/**/*.xml spring: application: name: microservicecloud-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://192.168.1.110:3306/cloudDB01 username: root password: 123456 dbcp2: min-idle: 5 initial-size: 5 max-total: 5 max-wait-millis: 200
数据准备
1 docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
1 2 3 4 5 6 7 8 9 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 ) );
service
1 2 3 4 5 6 7 8 9 10 11 12 package com.hph.springcloud.service;import com.hph.springcloud.entities.Dept;import java.util.List;public interface DeptService { public boolean add (Dept dept) ; public Dept get (Long id) ; public List<Dept> list () ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package com.hph.springcloud.service;import com.hph.springcloud.dao.DeptDao;import com.hph.springcloud.entities.Dept;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@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(); } }
mapper
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <?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.hph.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 ="com.hph.springcloud.entities.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 >
DeptServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package com.hph.springcloud.service;import com.hph.springcloud.dao.DeptDao;import com.hph.springcloud.entities.Dept;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@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风格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 package com.hph.springcloud.controller;import com.hph.springcloud.entities.Dept;import com.hph.springcloud.service.DeptService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;@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
1 2 3 4 5 6 7 8 9 10 11 package com.hph.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); } }
microservicecloud-consumer-dept-80
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <?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 > microservicecloud</artifactId > <groupId > com.hph.springcloud</groupId > <version > 1.0-SNAPSHOT</version > </parent > <modelVersion > 4.0.0</modelVersion > <artifactId > microservicecloud-provider-dept-8001</artifactId > <dependencies > <dependency > <groupId > com.hph.springcloud</groupId > <artifactId > microservicecloud-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 >
application.yml
cfbeans
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.hph.springcloud.cfbeans;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;@Configuration public class ConfigBean { @Bean public RestTemplate getRestTemplate () { return new RestTemplate(); } }
controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package com.hph.springcloud.controller;import com.hph.springcloud.entities.Dept;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.RequestMethod;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import java.util.List;@RestController public class DeptController_Consumer { private static final String REST_URL_PREFIX = "http://localhost:8001" ; @Autowired private RestTemplate restTemplate; @RequestMapping (value = "/consume/dept/add" ,method = RequestMethod.POST) public boolean add (Dept dept) { return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add" ,dept,Boolean.class); } @RequestMapping (value = "/consumer/dept/get/{id}" ) public Dept get (@PathVariable("id" ) Long id) { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/" +id,Dept.class); } @SuppressWarnings ("unchecked" ) @RequestMapping (value = "/consumer/dept/list" ) public List<Dept> list () { return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list" ,List.class); } }
DeptConsumer80_App
1 2 3 4 5 6 7 8 9 10 11 package com.hph.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); } }
测试
我们首先启动`microservicecloud-provider-dept-8001
的服务提供端,然后启动microservicecloud-consumer-dept-80
消费端,注意我们在消费端仅仅只是编写了一个Controller和一个启动类,其他的什么也没有了。
然而当我们查询的时候时候可以发现服务可以使用这是为什么呢?这是因为我们添加了RestTemplate,它提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集。
使用restTemplate访问restful接口非常的简单粗暴无脑。(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
使用Postman发送
1 http://localhost/consume/dept/add?dname=数据中台
我们再调用一下查询方法
可以查询到数据了,一个简单的微服务通过HTTP调用服务就实现了。