为了模拟微服务场景,学习中为了方便,先创建一个父工程,后续的工程都以这个工程为准,实用maven聚合和继承,统一管理子工程的版本和配置。
后续使用中只需要只有配置和版本需要自己规定之外没有其它区别。
微服务中分为服务提供者和服务调用者。
注意这里只是模拟微服务的实用,核心没有进行演示,比如Eureka注册中心等。
版本对应关系
需要注意的是boot的版本和cloud版本需要对应,可以看表对应。
1、创建父工程
正常的创建maven项目流程,然后编写pom.xml文件即可,将大部分需要用的配置定一下。
注意:这里的配置的是tkmybatis,cloud版本为Greenwich,boot版本为2.1.5,创建完之后记得刷新一下maven配置。
pom.xml
<?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.AE</groupId>
<artifactId>SpringCloud01</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<-- 以下是需要的大部分依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
<mapper.starter.version>2.1.5</mapper.starter.version>
<mysql.version>5.1.46</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>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper.starter.version}</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、创建服务提供者模块
在父项目中创建子模块,命名-例:user-service
当前模块主要是给其它的服务模块提供数据库的信息。
这里的pom.xml文件配置跟以前的大部分项目是差不多的。
2.1 pom.xml
<?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>
<parent>
<groupId>com.AE</groupId>
<artifactId>SpringCloud01</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>user-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 通用Mapper启动器 -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
2.2 编写application.yml配置文件
空项目可以通过 JBLSpringBootAppGen 插件生成项目入口Application.java文件和application.yml配置文件。
配置端口号和mysql的配置。
application.yml
# 端口号
server:
port: 9002
# 连接池
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username: root
password: 123456
mybatis:
type-aliases-package: com.AE.user.pojo # 别名扫描 指向你创建的pojo包
2.3 编写代码
2.3.1 实体类
@Data
@Table(name = "tb_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String userName;
private String password;
private String name;
}
2.3.2 mapper层
注意这里导入的是tk.mybatis的包,如果用的是正常的mybatis用法是不同的。该包里有很多已经实现的方法。
package com.AE.user.mapper;
import com.AE.user.pojo.User;
import tk.mybatis.mapper.common.Mapper;
public interface UserMapper extends Mapper<User> {
}
2.3.3 service层
用来处理业务。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id){
return userMapper.selectByPrimaryKey(id);
}
}
2.3.4 controller层
url访问
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return userService.queryById(id);
}
}
2.3.5 Application.java
注意MapperScan这里导入的也是tkmybatis里面的包。
@MapperScan("com.AE.user.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2.4 测试
在浏览器访问controller定义的url,例如:localhost:9002/user/1
页面返回数据库中数据即可
3、创建服务调用者模块
创建maven模块,跟user-service创建相同,空项目可以通过 JBLSpringBootAppGen 插件生成项目入口Application.java文件和application.yml配置文件。
3.1 pom.xml文件
因为这里只是处理业务,所以需要的不多,只需要能通过接口去访问其它服务获取信息即可。
<?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>
<parent>
<groupId>com.AE</groupId>
<artifactId>SpringCloud01</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
项目结构如下:
3.2 编写代码
3.2.1 启动器
spring提供了RestTemplate模板工具类,对基于HTTP的客户端进行了封装,并且实现了对象与json的序列化和反序列化。RestTemplate并没有限定HTTP的客户端类型,而是进行了抽 象,目前常用的3种都有支持:
HTTPClient
OkHTTP
JDK原生的URLConnection(默认的)
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.2.2 实体类
将服务提供者中的实体类粘贴过来即可,将与数据库有关的注解删掉即可。
3.2.3 controller层
直接调用RestTemplate模板中的方法即可进行访问获取数据。
@RestController
@RequestMapping("consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("{id}")
public User query(@PathVariable("id") Long id) {
String url = "http://localhost:9002/user/" + id;
return restTemplate.getForObject(url, User.class);
}
}
3.3 测试
在浏览器中输入controller中定义的url,要保证两个微服务全部开启。获取正确数据即可。