SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

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
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo
我们使用mybatis作为持久层框架,使用Mysql数据库
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo
项目完成后如下:
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo
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、完整的项目结构如下显示:
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

10、在postman中访问http://127.0.0.1:8080/user/select/1,可以得到如下的结果:

SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

服务消费者:

服务消费者主要使用的是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、启动:注意要先启动服务提供者,才可以启动服务消费者

SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo

然后在postman中访问服务消费者的端口:http://127.0.0.1:8082/user/select/1
注意:8082是服务消费者的端口,而8080是服务提供者的端口,但是这里我们通过服务消费者来访问服务提供者的服务,就是最简单的微服务的调用。
SpringCloud入门:02-SpringCloud实战-创建简单的微服务demo


思考

我们这个简单demo中服务消费者使用服务提供者的微服务是利用RestTemplate的模板,我们的地址也是用的直接的地址:http://localhost:8080/user/sleect/{#id}。
但是在实际的开发过程中,这种硬编码的方式基本是不可取的,仔细想想要是我们服务提供者的服务地址发生了改变,我们的服务调用者就要重新修改地址然后来调用服务,是不是觉得非常的繁杂和低效,SpringCloud当然知道这个问题,所以给我们一个服务发现组件-来进行服务的注册和发现,但是这些要在Eureka,Zookeeper,那里我们在做讲解。


今日分享:

如果打算爱一个人,你要想清楚,是否愿意为了他,放弃如上帝般*的心灵,从此心甘情愿有了羁绊。
——菲茨杰拉德 《了不起的盖茨比》