SpringCloud-02-SpringCloud实战-创建简单的微服务demo
SpringCloud简介
SpringCloud:SpringCloud是基于SpringBoot的基础上构建的,用于快速构建分布式系统的通用模式的工具集
SpringCloud的特点:
- 约定优于配置
- 使用各种环境
- 隐藏组件的复杂性
- 开箱即用
- 轻量级的组件
- 组件丰富,功能齐全
- 灵活
SpringCloud的版本:
不同于大多数的Spring项目都是以“主版本号.次版本号.增量版本号.里程牌版本号”的形式,SringCloud采用的是特殊的版本号:SpringCloud利用的是英文单词SRX(X为数字)来命名版本号。其中英文单词可以理解为主版本,而SR则是:"ServiceRelease"表示Bug修复,而数字表示第几次。
例如 Edgware SR4则是表明Edgware版本的第四次bug修复
SpringCloud 技术以及工具
SpringCloud的开发之前需要我们了解如下的技术:
- java基础开发
- SpringBoot的基础开发
- Maven项目构建工具
服务提供者和服务消费者
在微服务中,我们可以用服务提供者和服务消费者来表示微服务之间的关系
服务提供者:提供服务的一方
服务消费者:调用服务的一方
下面我们利用IDEA来分布编写服务提供者和服务消费者
服务提供者:
1、新建一个Project
我们使用mybatis作为持久层框架,使用Mysql数据库
项目完成后如下:
2、编写pom文件,导入SpringCloud需要的依赖:
完整的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springbootdemo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!--<scope>runtime</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--添加spring cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencides</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、创建数据库以及对于的表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`phone` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES ('1', 'limi', '123', '123');
INSERT INTO `user` VALUES ('2', 'io', '123', '123');
4、创建用户实体类
package com.springbootdemo.demo.model;
public class User {
private Integer id;
private String username;
private String password;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
5、创建Dao层访问数据库
package com.springbootdemo.demo.mapper;
import com.springbootdemo.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
@Select(value="select * from user where id=#{id}")
public User select(Integer id);
}
6、创建service层和其实现层serviceImpl
UserService接口如下:
package com.springbootdemo.demo.service;
import com.springbootdemo.demo.model.User;
public interface UserService {
User select (Integer id );
}
UserServiceImpl接口实现如下:
package com.springbootdemo.demo.service.Impl;
import com.springbootdemo.demo.mapper.UserMapper;
import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User select (Integer id){
return userMapper.select(id);
}
}
7、创建Controller如下:
package com.springbootdemo.demo.controller;
import com.springbootdemo.demo.model.User;
import com.springbootdemo.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/select/{id}")
public User select(@PathVariable Integer id){
return userService.select(id);
}
}
8、编写application.yml配置文件如下:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#配置数据源
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
9、完整的项目结构如下显示:
10、在postman中访问http://127.0.0.1:8080/user/select/1,可以得到如下的结果:
服务消费者:
服务消费者主要使用的是RestTemplate来访问对应的微服务的api接口,从而查询到指定的微服务提供的数据
1、新建一个springcloude项目 主要的步骤和服务提供者的类似,并且其pom文件导入的依赖也和上面的相同。这里不再赘述:直接给出项目的完整的结构图:
注意:这里的pom不需要再和之前一样导入mybatis的依赖,否则会报数据库没有配置的错误,完整的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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springCloudDemo</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>-->
<!--<groupId>org.mybatis.spring.boot</groupId>-->
<!--<artifactId>mybatis-spring-boot-starter</artifactId>-->
<!--<version>2.0.0</version>-->
<!--</dependency>-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--添加spring cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencides</artifactId>
<version>Edgware.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、创建Pojo类
package com.springclouddemo.demo.pojo;
public class User {
private Integer id;
private String username;
private String password;
private String phone;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
3、application.yml的配置文件如下:
server:
# 注意这里的端口和服务提供者的不能是同一个端口
port: 8082
4、主启动类如下:
package com.springclouddemo.demo;
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 DemoApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
5、Controller创建如下:
package com.springclouddemo.demo.controller;
import com.springclouddemo.demo.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
public class Usercontroller {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/select/{id}")
public User select(@PathVariable Integer id){
return this.restTemplate.getForObject("http://localhost:8080/user/select/"+id,User.class);
}
}
6、启动:注意要先启动服务提供者,才可以启动服务消费者
然后在postman中访问服务消费者的端口:http://127.0.0.1:8082/user/select/1 注意:8082是服务消费者的端口,而8080是服务提供者的端口,但是这里我们通过服务消费者来访问服务提供者的服务,就是最简单的微服务的调用。
思考
我们这个简单demo中服务消费者使用服务提供者的微服务是利用RestTemplate的模板,我们的地址也是用的直接的地址:http://localhost:8080/user/sleect/{#id}。 但是在实际的开发过程中,这种硬编码的方式基本是不可取的,仔细想想要是我们服务提供者的服务地址发生了改变,我们的服务调用者就要重新修改地址然后来调用服务,是不是觉得非常的繁杂和低效,SpringCloud当然知道这个问题,所以给我们一个服务发现组件-来进行服务的注册和发现,但是这些要在Eureka,Zookeeper,那里我们在做讲解。