SpringCloud笔记之Rest环境搭建

1. REST

1.1 REST的概念


  • Spring Cloud是基于HTTP的REST方式调用的
  • REST不是“rest”这个单词,而是Resource Representational State Transfer的缩写,通俗来讲就是:资源在网络中以某种表现形式进行状态转移
    1. Resource:资源,即数据(网络的核心)
    2. Representational:某种表现形式,比如用JSON、XML、JPEG等;
    3. State Transfer:状态变化,通过HTTP动词实现
  • REST描述的是在网络中 client 和 server 的一种交互形式,REST本身不实用,实用的是如何设计RestFul API(REST风格的网络接口)
  • Server提供的RestFul API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。
  • 用HTTP协议里的动词来实现资源的添加,修改。
  • Server和Clien之间传递某资源的一种表现形式,比如用JSON、XML传输文本,或者用JPG,WebP传输图片等
  • 用HTTP Status Code传递Server 的状态信息。比如最常用的200表示成功,500表示Server内部错误等

1.2 HTTP动词


  1. GET(SELECT):从服务器获取资源(一项或多项)
  2. POST(CREATE):在服务器新建一个资源
  3. PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)
  4. PATCH(UPDATE):在服务器更新资源(客户端提提供改变的属性)
  5. DELETE(DELETE):从服务器删除资源

比如:

GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

1.3 REST的优点

  1. 提高用户界面的便捷性(操作简单)
  2. 通过简化服务器提高可伸缩性(高性能,低成本)
  3. 允许组件分别优化(可以让服务端和客户端分别进行改进和优化)
  4. 提高可见性(可以单独考虑每个请求)
  5. 提高可靠性(更容易从局部故障中修复)
  6. 提高可扩展性(降低了服务器资源使用)
  7. 减少交互次数,减少交互的平均延迟

2. Rest环境搭建

一个父工程带着多个Module子模块
MicroServiceCloud父工程(Project)下初次带着3个子模块(Module)

  • microservicecloud-api 【封装的整体entity/接口/公共配置等】
  • microservicecloud-consumer-dept-80 【服务提供者】
  • microservicecloud-provider-dept-8001 【服务消费者】

2.1 创建父工程

  • 新建父工程项目springcloud,切记Packageing是pom模式
  • 主要是定义pom文件,将后续各个子模块公共的jar包统一提取出来,类似一个抽象父类
    在这里插入图片描述

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.haust</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>
        <module>springcloud-consumer-dept-80</module>
    </modules>

    <!--打包方式  pom-->
    <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.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>0.2.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springCloud的依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--SpringBoot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.4.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--数据库-->
            <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>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

2.2 创建子模块


父工程为springcloud,其下有多个子module
在这里插入图片描述

  • springcloud-api : 只放实体类(Dept)
  • springcloud-provider-dept-8001:提供者,负责给消费者提供接口
  • springcloud-consumer-dept-80 : 消费者,负责从提供者中调用接口

2.3 api接口


springcloud-api

Dept.java

/**
 * @author qin jin
 * @date 2022/9/18 18:36
 */
@Data
@NoArgsConstructor
@Accessors( chain = true ) // 链式写法
public class Dept implements Serializable {
    private Long deptno;
    private String dname;
    private String db_source;

    public Dept(String dname){
        this.dname = dname;
    }

}

2.4 提供者


springcloud-provider-dept-8001

在这里插入图片描述

DeptController.java

/**
 * @author qin jin
 * @date 2022/9/18 19:56
 */

//提供Restful 服务!
@RestController
public class DeptController {

    @Autowired
    private DeptService deptService;

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


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

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

2.5 消费者


springcloud-consumerdept-80

springcloud-consumerdept-80访问springcloud-provider-dept-8001下的controller使用REST方式

DeptConSumerController.java

/**
 * @author qin jin
 * @date 2022/9/18 21:54
 */
@RestController
public class DeptConsumerController {
    //消费者 不应该有service层 ,应该调用提供者的接口
    //RestTemplate

    @Autowired
    private RestTemplate restTemplate;//提供多种便捷访问远程http服务的方法,简单的Restful模板

    private static final String REST_URL_PREFIX = "http://localhost:8001";

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

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

    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list",List.class);
    }
}

使用RestTemplete先需要放入Spring容器中


ConfigBean .java

@Configuration
public class ConfigBean {//@Configuration -- spring  applicationContext.xml

    //配置负载均衡实现RestTemplate
    // IRule
    // RoundRobinRule 轮询
    // RandomRule 随机
    // AvailabilityFilteringRule : 会先过滤掉,跳闸,访问故障的服务~,对剩下的进行轮询~
    // RetryRule : 会先按照轮询获取服务~,如果服务获取失败,则会在指定的时间内进行,重试
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

springcloud-provider-dept-8001的dao接口调用springcloud-api模块下的pojo,可使用在springcloud-provider-dept-8001的pom文件导入springcloud-api模块依赖的方式:

<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
    <groupId>com.xawl</groupId>
    <artifactId>springcloud-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

springcloud-consumer-dept-80和springcloud-provider-dept-8001的pom.xml和父工程下的依赖基本一样

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JAVA开发区

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

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

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

打赏作者

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

抵扣说明:

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

余额充值