说明
SpringWeb
提供了一个 RestTemplate
模板工具类,对基于 Http
的客户端进行了封装,并且实现了对象与 json
的序列化和反序列化,非常方便。RestTemplate
并没有限定 Http
的客户端类型,而是进行了抽象,目前常用的3种都有支持
- HttpClient
- OkHttp
- JDK原生的URLConnection(默认的)
demo
既然RestTemplate
的目的是实现远程调用,那么就需要有一个服务的提供者,和一个服务的调用者,两者必须是独立运行的服务。
但是为了方便项目的学习,我们会创建一个聚合项目,然后把服务的提供者、调用者作为其中的两个模块。创建父工程
创建一个父工程,用来管理依赖,聚合子工程
此父工程是用来管理子工程的,所以可以删除src
目录,目录结构如下
在pom
文件中引入相关依赖,打包方式设置为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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it.learn</groupId>
<artifactId>restTemplate-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.12.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR5</spring-cloud.version>
<mysql.version>5.1.47</mysql.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
服务提供者
我们新建一个项目,对外提供查询用户的服务。
此工程为上述父工程的子工程
结构如下
导入相关依赖
新建<?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>restTemplate-demo</artifactId>
<groupId>com.it.learn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
配置文件,编写相关配置信息
编写server:
port: 8081
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.206.99:3306/db2?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false
username: root
password: root
application:
name: user-service # 服务的名称不能使用下划线
mybatis:
type-aliases-package: com.it.learn.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
com.it.learn: debug
UserServiceApplication
启动类
编写package com.it.learn;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.it.learn.mapper")
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class);
}
}
pojo
实体类
在表中有对应数据表package com.it.learn.pojo;
import lombok.Data;
@Data
public class User {
private Long id;
private String userName;
private String password;
private String name;
private int age;
private String email;
}
新建UserMapper
新建package com.it.learn.mapper;
import com.it.learn.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from tb_user where id = #{id}")
public User findUserById(@Param("id") Long id);
}
UserService
新建package com.it.learn.service;
import com.it.learn.pojo.User;
public interface UserService {
public User findUserById(Long id);
}
UserServiceImpl
新建package com.it.learn.service.impl;
import com.it.learn.mapper.UserMapper;
import com.it.learn.pojo.User;
import com.it.learn.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findUserById(Long id) {
return userMapper.findUserById(id);
}
}
UserController
服务提供者项目结构图package com.it.learn.web;
import com.it.learn.pojo.User;
import com.it.learn.service.UserService;
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;
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/{id}")
public User findUserById(@PathVariable("id") Long id){
return this.userService.findUserById(id);
}
}
启动项目,测试下, http://localhost:8081/user/5服务调用者
与上面类似,这里不再赘述,需要注意的是,我们调用user-service
的功能,因此不需要mybatis
相关依赖了。
新建完,结构如下pom
文件引入了web
的starter
依赖,而web
的starter
中会包含RestTemplate
相关依赖。
新建启动类,并且注册一个<?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>restTemplate-demo</artifactId>
<groupId>com.it.learn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 导入web启动器 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
RestTemplate
实例
新建package com.it.learn;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class UserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication .class);
}
// 注册RestTemplate的对象到Spring的容器中
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
pojo
实体类
新建package com.it.learn.pojo;
import lombok.Data;
@Data
public class User {
private Long id;
private String userName;
private String password;
private String name;
private int age;
private String email;
}
UserController
,在controller
中直接调用RestTemplate
,远程访问user-service
的服务接口RestTemplate
会向http://localhost:8081
地址发起请求,并且得到响应的JSON
数据。然后会将JSON
数据反序列化为User
类型。
项目结构图package com.it.learn.controller;
import com.it.learn.pojo.User;
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;
@RestController
@RequestMapping("consumer")
public class UserController {
// 发送基于http协议的远程过程调用(2个服务器相互调用)
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/{id}")
public User findUserById(@PathVariable("id") Long id){
String url = "http://127.0.0.1:8081/user/" + id;
User user = restTemplate.getForObject(url, User.class);
return user;
}
}
启动项目,进行测试,http://localhost:8080/consumer/6调用链路
项目demo:
restTemplate-demo