SpringCloud Rest学习环境搭建

SpringCloud Rest学习环境搭建

Rest风格的相关的介绍

REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAPXML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

springcloud简单介绍

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

springcloud项目的创建

springcloud的使用需要依赖sprinboot。springcloud的版本控制并没有采用版本号的控制而是采用了首字母命名的方式来完成的。

采用初始化的方式创建于springboot的创建的方式相同。

在开始学习的时候从maven项目的搭建开始学起。

去掉src文件建立父工程。

修改父工程的pom文件来导入springcloud开发所需要的相关的依赖。

导入springcloud相关的依赖

此时标签是父工程的管理类。在子模块中可以直接的导入而不需要使用其他的管理的方式来完成。

参考相应的官方的中文文档:https://www.springcloud.cc/spring-cloud-greenwich.html

在官方的中文文档当中找到对应的依赖导入部分的介绍,在maven仓库中找出对应的版本的信息。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>{spring-cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a65pWrVG-1632017165405)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210916112756316.png)]

父工程中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>org.example</groupId>
    <artifactId>springcloud-version-one</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--子模块-->
    <modules>
        <module>springcloud-api</module>
    </modules>

    <!--修改打包的方式-->
    <packaging>pom</packaging>
    <!--相关属性的配置配置相应的版本号的信息-->
    <properties>
        <juint.version>4.12</juint.version>
        <lombok.version>1.18.10</lombok.version>
    </properties>

    <!--springcloud对应的依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>runtime</scope>
            </dependency>

            <!--springboot相关的依赖jar包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--数据库相关的jar包-->
            <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.1.10</version>
            </dependency>
            <!--springboot的启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${juint.version}</version>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

在普通的maven项目中建立子模块并导入对应的依赖

建立的第一个子模块为springcloud-api这个服务用来管理springcloud的相关的微服务的信息,

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">
    <parent>
        <artifactId>springcloud-version-one</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>springcloud-api</artifactId>
    <!--当前的moudle自己需要的依赖如果-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

springcloud项目中需要使用的数据库表

建立springcloud1数据库,并在数据库中建立dept数据表,添加相应的数据

在这里插入图片描述
在这里插入图片描述
在spingcloud-api中创建pojo包并创建对应的bean,创建的bean需要实现序列化的接口完成对应的通信。

package com.kuang.springcloud.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 实体类springcloud中进行网络传输时需要
 * 完成序列化
 */
@Data
@NoArgsConstructor
@Accessors(chain = true)//链式写法(支持链式写法)
public class Dept implements Serializable {//实体类和orm表关系映射
    private long deptno;//主键
    private String dname;
    //这个数据存在哪个数据库的字段~微服务,一个服务对应一个数据库
    //同一个信息也可能存在不同的数据库
    private String db_source;
    
    public Dept(String dname){
        this.dname=dname;
    }
    /**
     *链式写法
     */
}

创建服务提供者的微服务进程springcloud-privoder-dept-8001

导入父工程中的相关的依赖环境。导入此服务所需要的依赖

<?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>org.example</groupId>
    <artifactId>springcloud-version-one</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--子模块-->
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>

    </modules>

    <!--修改打包的方式-->
    <packaging>pom</packaging>
    <!--相关属性的配置配置相应的版本号的信息-->
    <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.13.2</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <!--springcloud对应的依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</version>
                <type>pom</type>
                <scope>runtime</scope>
            </dependency>
            <!--springboot相关的依赖jar包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--数据库相关的jar包-->
            <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.1.10</version>
            </dependency>
            <!--springboot的启动器-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

配置application.yml配置文件的spring mybatis 和port相关的信息

server:
  port: 8001
mybatis:
  type-aliases-package: com.kuang.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/springcloud
    username: root
    password: 123456

在相对应的目录下创建mybatis相关的配置文件

<?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>
    <mappers>
        
    </mappers>
</configuration>

创建对应的mapper接口对象

package com.kuang.springcloud.mapper;

import com.kuang.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface DeptMapper {
    boolean addDept();
    Dept queryByid(Dept dept);
    List<Dept> queryAll();
}

结合mybatis绑定mapper接口
<?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>
    
</mapper>
出错点注意

在导入了mybatis整合springboot的包之后必须在springboot的配置文件中配置好数据库相关的信息。否则会报错

同时在写的时候还需要注意mybatis的xml文件所在的位置时在springboot的配置文件中所配置的位置


APPLICATION FAILED TO START


Description:

Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

Action:

Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

 <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
核心服务的编写

服务的编写和springboot的过程相同创建mapper接口service接口及其实现类,创建controller同时将各个接口进行自动的注入。完成对业务逻辑的操作。

package com.kuang.springcloud.controller;

import com.kuang.springcloud.pojo.Dept;
import com.kuang.springcloud.service.DeptServiceimpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class DeptController {

    //注入对应的接口
    @Autowired
    private DeptServiceimpl deptServiceimpl;

    @GetMapping("/dept/add")
    public boolean addDept(Dept dept) {
        return deptServiceimpl.addDept(dept);
    }

    @GetMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return deptServiceimpl.queryByid(id);
    }

    @GetMapping("/dept/list")
    public List<Dept> queryall() {
        return deptServiceimpl.queryAll();
    }
}

serviceimpl

package com.kuang.springcloud.service;
import com.kuang.springcloud.Mapper.DeptMapper;
import com.kuang.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class DeptServiceimpl implements DeptService {

    //注入对应的mapper接口
    @Autowired
    private DeptMapper deptMapper;

    @Override
    public boolean addDept(Dept dept) {
        return deptMapper.addDept(dept);
    }

    @Override
    public Dept queryByid(Long id) {
        return deptMapper.queryByid(id);
    }

    @Override
    public List<Dept> queryAll() {
        return deptMapper.queryAll();
    }
}

mapper接口和其绑定的文件

package com.kuang.springcloud.Mapper;

import com.kuang.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface DeptMapper {
    boolean addDept(Dept dept);

    Dept queryByid(Long id);

    List<Dept> queryAll();

}

<?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.kuang.springcloud.Mapper.DeptMapper">
    <insert id="addDept" parameterType="com.kuang.springcloud.pojo.Dept">
        insert into dept (dname,db_source)
        values (#{dname},DATABASE());
    </insert>

    <select id="queryByid" resultType="com.kuang.springcloud.pojo.Dept" parameterType="long">
        select * from dept where deptno = #{deptno};
    </select>

    <select id="queryAll" resultType="com.kuang.springcloud.pojo.Dept">
        select * from dept;
    </select>

</mapper>

最后完成测试功能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bP0aVIFN-1632017165418)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20210918174517981.png)]

创建服务消费者的微服务进程

导入服务消费者所需要的相关的依赖环境

<?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>springcloud-version-one</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-customer-dept-80</artifactId>
    <!--实体类+web-->
    <dependencies>
    <!--springcloud的api-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>springcloud-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>
</project>
RestTemplate 简介(这次学习的核心实现了不同服务之间的调用关系)

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用。

基础的用法不在详细的进行列举了,可以参考对应的文档

创建消费者的服务进程(对应的是80端口)

创建springboot的一个微服务启动项,通过配置文件配置其端口号为80端口号。

Springboot配置RestTemplate对象(完成服务之间的请求)

核心是使用两个注解来进行完成,@Configuration:相当于spring5中的application.xml配置文件的作用 @bean注解相当于在配置文件中使用的 标签

package com.kuang.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean { //相当于spring application.xml
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
创建对应的控制器
package com.kuang.springcloud.controller;


import com.kuang.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
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;

import java.util.List;

@RestController
public class DeptCousumerController {
    //理解消费者不应该具有service层
    //RestTemplate....供我们直接的调用
    //(url,实体,map,class<T>responseType)
    @Autowired
    private RestTemplate restTemplate;

    private static final String REST_URL_PREFXI = "http://localhost:9000";

    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept){
        return restTemplate.postForObject(REST_URL_PREFXI+"/dept/add",dept,Boolean.class);
    }

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") long id){
        return restTemplate.getForObject(REST_URL_PREFXI+"/dept/get/"+id,Dept.class);
    }


    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        System.out.println("接收请求");
        return restTemplate.getForObject(REST_URL_PREFXI+"/dept/list",List.class);
    }

}
创建springboot的启动类完成微服务的测试
package com.kuang.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeptCustomer {
    public static void main(String[] args) {
        SpringApplication.run(DeptCustomer.class,args);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值