springcloud初体验(真香)

一、微服务简介

Ⅰ、我对微服务的理解

微服务是软件开发的一种架构方式,由单一的应用小程序构成的小服务;一个软件系统由多个服务组成;在微服务中,服务是细粒度的,协议是轻量级的(部署简单、性能开销小)

Ⅱ、为什么要使用微服务?

随着时代的发展,单体架构(MVC三层模型)越来越不能满足企业的要求;业务规模的不断扩大、团队开发人员的增多,使得单体架构出现了以下几个问题:

(1)部署效率低(比如代码量非常多,依赖的包非常多,那么每一次编译打包、部署测试的时间就会很久)
(2)团队开发成本高(如果某个模块出现问题,可能就要多人修改)
(3)高可用性低(打成war包部署之后,如果某一块出现了问题,其他模块都会受到影响)
(4)一旦代码膨胀(简单了说你写的代码量大,但功能没实现几个,浪费资源),上线就会变慢

SOA(面向服务编程)便出现了

SOA简介

SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和协议联系起来。

虽然解决了服务的启动时间,但服务化也有很大的缺点

1、耦合度较高(一个依赖可能另一个模块,另外一个模块又可能依赖其他模块)
2、公司成本高(每一个模块都要由相应的人员或者团队维护)

2014年,随着容器化技术的成熟以及 DevOps 文化的兴起,微服务便应运而生了

微服务的特点

1.服务细粒度
2.协议轻量级
3.部署简单
4.服务的独立维护性


二、spring cloud

Ⅰ、springcloud介绍

springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体。

1.分布式/版本化配置
2.服务注册和发现
3.路由
4.服务到服务的通话
5.负载均衡
6.断路器
7.全局锁
8.领导选举和集群状态
9.分布式消息传递

SpringCloud的官网地址:https://spring.io/projects/spring-cloud#overview

Ⅱ、boot和cloud的版本选型

1.进入springcloud官方页面:https://spring.io/projects/spring-cloud#learn

2. LEARN->Reference Doc.

3. 版本选择


三、springcloud初级项目体验

最近发现网络上很多springcloud入门体验都是关于消费-订单的小Demo,那我当然不能落后了(菜是原罪😀)

PRE: 模拟服务间调用之流程分析

1、创建一个父项目(统一管理子模块依赖版本)
2、创建第一个子模块-----》订单服务模块
3、创建第二个子模块-----》客户消费模块

3.1、订单服务模块

编写代码之前应该先构思好流程,如果直接就去码代码,码了一会可能又要添添改改;还有可能做完项目之后又要对项目进行重构,这就是没有构思好流程。
1、技术选型
2、业务流程
3、核心业务分析
4、代码优化

Ⅰ、数据库表设计

Ⅱ、创建一个父工程

删除多余的文件,留下一个pom.xml文件

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>com.cloud</groupId>
    <artifactId>springcloud_all</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
    ## 创建了子模块之后会自动加入
     ##   <module>payment-module</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</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>8.0.19</mysql.version>
        <druid.version>1.2.4</druid.version>
        <mybatis.spring.boot.version>2.1.4</mybatis.spring.boot.version>
        <druid.spring.boot.version>1.2.4</druid.spring.boot.version>
        <springfox-swagger-ui.version>2.9.2</springfox-swagger-ui.version>
        <springfox-swagger2.version>2.9.2</springfox-swagger2.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--      spring-cloud 2020.0.2-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--      spring-cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${springfox-swagger-ui.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${springfox-swagger2.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Ⅲ、创建子订单模块

右键->New->Module



PaymentApplication启动类

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

Ⅲ、子模块代码编写

Ⅲ.Ⅰ、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_all</artifactId>
        <groupId>com.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.pay</groupId>
    <artifactId>payment-module</artifactId>
    <dependencies>
<!--        web+监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
<!--        mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
<!--        mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<!--        jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>

</project>

Ⅲ.Ⅱ、application.yml 配置文件编写

server:
  port: 8081

spring:
  application:
    name: payment-module
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: hao20001010
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.cloud.entity

Ⅲ.Ⅲ、Controller层编写

package com.cloud.controller;

import com.cloud.Service.PaymentService;

import com.cloud.entity.Payment;
import com.cloud.entity.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author:抱着鱼睡觉的喵喵
 * @date:2021/4/18
 * @description:
 */
@RestController
@Slf4j
@Api(value = "《----订单模块----》")
public class PaymentController {
    private static final Logger logger = LoggerFactory.getLogger(PaymentController.class);
    @Resource
    private PaymentService paymentService;

    /**
     * 创建订单模块
     * @api /payment/create
     * @param payment Payment实体类
     * @return  Result<></>
     */
    @ApiOperation(value = "创建订单")
    @PostMapping(value = "/payment/create")
    public Result create(@RequestBody Payment payment) {
        int result = paymentService.create(payment);
        logger.info("插入结果========》" +result);
        if (result > 0) {
            return new Result(200,"插入成功", result);
        } else {
            return new Result(500, "插入失败", null);
        }
    }

    /**
     * 订单查询模块
     * @api /payment/get/{id}
     * @param id  编号
     * @return Payment实体类
     */
    @GetMapping(value = "/payment/get/{id}")
    @ApiModelProperty(value = "订单查询")
    public Result getPaymentById(@PathVariable(value = "id") Integer id) {
        Payment payment = paymentService.getPaymentById(id);
        logger.info("订单查询结果=========>"+payment);
        if (payment != null) {
            return new Result(200, "查询成功", payment);
        } else {
            logger.error("订单插叙失败!请排查原因");
            return new Result(500, "查询失败,无该订单ID:"+id, null);
        }
    }
}

Ⅲ.Ⅳ、service层

public interface PaymentService {
    int create(Payment payment);
    Payment getPaymentById(@Param("id") Integer id);
}
@Service
public class PaymentServiceImpl implements PaymentService {

    @Resource
    private PaymentMapper paymentMapper;

    @Override
    public int create(Payment payment) {
        return paymentMapper.create(payment);
    }

    @Override
    public Payment getPaymentById(Integer id) {
        return paymentMapper.getPaymentById(id);
    }
}

Ⅲ.Ⅴ、mapper层

@Mapper
public interface PaymentMapper {
    int create(Payment payment);
    Payment getPaymentById(@Param("id") Integer id);
}

Ⅲ.Ⅵ、mapper.xml

<?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.cloud.mapper.PaymentMapper">
    <insert id="create" parameterType="payment" keyProperty="id" useGeneratedKeys="true">
        insert into payment(orders)values(#{orders})
    </insert>
    <select id="getPaymentById" parameterType="payment" resultMap="BaseResultMap" >
        select * from payment where id=#{id}
    </select>
    <resultMap id="BaseResultMap" type="payment">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <id column="orders" property="orders" jdbcType="VARCHAR"/>
    </resultMap>
</mapper>

Ⅳ、统一结果封装类及其实体类

@Data
public class Result<T> implements Serializable {
    private Integer code;
    private String message;
    private T data;

    public Result(){}

    public Result(Integer code, String msg) {
        this(code, msg, null);
    }
    public Result(Integer code, String msg, T data) {
        this.code = code;
        this.message = msg;
        this.data = data;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "Payment实体类")
public class Payment {

    @ApiModelProperty(value = "id")
    private Integer id;
    @ApiModelProperty(value = "订单信息")
    private String orders;
}

五、测试


3.2、消费服务模块

消费模块项目结构图

Payment、Result以及ConsumerApplication启动类和上面类似。

PRE:RestTemplate详解

RestTemplate是spring封装的一个服务端远程HTTP请求工具,支持常见的Rest请求(get、post等)
简单了说就是用来远程调用的,因为你订单模块是一个服务,消费模块又是一个单独的服务,两个服务端的端口号要进行交互,所以就有了RestTemplate

RestTemplate是服务端HTTP调用的
Jsonp是客户端调用的

Ⅰ、消费模块application.yml配置

server:
  port: 80

Ⅱ、配置类注入RestTemplate

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

@Configuration : 该注解类似于beans

@Bean:当然就类似于bean了

Ⅲ、ConsumerController

@RestController
@Api(value = "消费模块")
public class ConsumerController {

    private static final String CONSUMER_URL = "http://localhost:8081";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/create")
    @ApiOperation(value = "模拟添加")
    public Result<Payment> create(Payment payment) {
        return restTemplate.postForObject(CONSUMER_URL + "/payment/create", payment, Result.class);
    }

    @ApiOperation(value = "模拟获取")
    @GetMapping("/consumer/payment/get/{id}")
    public Result<Payment> getPayment(@PathVariable(value = "id") Integer id) {
        return restTemplate.getForObject(CONSUMER_URL + "/payment/get/" + id, Result.class);
    }
}

3.3、全局测试


到此结束!

到此这篇关于springcloud初体验(真香)的文章就介绍到这了,更多相关springcloud初体验内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 聊聊Spring Cloud Cli 初体验

    SpringBoot CLI 是spring Boot项目的脚手架工具.而本文的Spring Cloud cli则是基于SpringBoot Client的一个插件,用于支持Cloud相关的组件. 由于各种原因,目前用起来并不是很爽: repo 经常连不上 启动非常慢,要等半天 遇到问题排查不是很容易 但是,功能很有意思,值得期待.也许有一天变的像 docker swarm 那样直接启动分布式的服务,就完美了. SpringBoot Client文档: https://docs.spring.i

  • Spring Cloud Data Flow初体验以Local模式运行

    1 前言 Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅找不到很多中文资料,英文资料也一样少的可怜.这让探索的路更加艰辛,也更加有趣吧. Spring Cloud Data Flow是基于微服务的,专门用于流式和批式数据处理的框架. 2 基本概念 2.1 数据处理模式 数据处理有两种模式,分别是Streaming流式处理和Batch批次处理.Streaming是长时间一直存在的,你数据来了我就处理,没来我就等着,基于消

  • springcloud初体验(真香)

    一.微服务简介 Ⅰ.我对微服务的理解 微服务是软件开发的一种架构方式,由单一的应用小程序构成的小服务:一个软件系统由多个服务组成:在微服务中,服务是细粒度的,协议是轻量级的(部署简单.性能开销小) Ⅱ.为什么要使用微服务? 随着时代的发展,单体架构(MVC三层模型)越来越不能满足企业的要求:业务规模的不断扩大.团队开发人员的增多,使得单体架构出现了以下几个问题: (1)部署效率低(比如代码量非常多,依赖的包非常多,那么每一次编译打包.部署测试的时间就会很久) (2)团队开发成本高(如果某个模块出

  • 开源数据库设计神器chiner的安装及初体验介绍

    目录 一.关于 PowerDesigner 二.关于 chiner 三.安装 chiner 四.上手 chiner 01.导入导出 02.维护数据类型 03.维护数据表 04.维护关系图 五.尾声 今天我给大家推荐的这款国人开源的数据库设计工具 chiner,界面漂亮,功能强大,体验后给我的感觉是真香… 一.关于 PowerDesigner PowerDesigner 是一款功能非常强大的建模工具,可以和 Rational Rose 媲美.Rose 专攻 UML 对象模型的建模,之后才拓展到数据

  • DevEco Studio 2.0开发鸿蒙HarmonyOS应用初体验全面测评(推荐)

    在9月10日召开的华为开发者大会上,宣布了鸿蒙2.0系统正式面世,同时开启了Beta版本的测试和开源网站.对于开发者来说两个最关键的点值得关注:一个是Beta版的开发工具,一个是开源网站. 一.开源网站 在开发者大会上宣布将HarmonyOS源代码捐赠给中国开放原子开源基金会,并在大会上公布了鸿蒙系统的开源路线. 官网地址: OpenHarmony 官方源码地址 二.开发工具 鸿蒙使用基于Intellij IDEA深度定制研发的DevEco Studio作为其开发工具.官方下载地址如下: Dev

  • JavaScript入门初体验书写方式

    目录 javascript历史 javascript是什么? javascript的作用 浏览器执行js简介 javascript的组成 ECMAScript javascript初体验 行内式 内嵌JS 外部JS文件 结语 javascript历史 布兰登艾奇( Brendan Eich ,1961年-). 神奇的大哥在1995年利用10天完成 JavaScript 设计. 网景公司最初命名为 LiveScript ,后来在与 Sun 合作之后将其改名为 JavaScript .(很大部分也是

  • vue.js 初体验之Chrome 插件开发实录

    背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见的动画效果都封装起来了,非常实用.但是有时候在开发中,仅仅只是需要某一两个动画效果,把整个CSS文件都引入,这样不是太好. 需求就出现了,能不能有一个工具可以直接预览Animate.css对应的动画效果,并且生成对应的动画代码呢? 作为一个UI开发,平时跟Chrome浏览器打交道最多,于是就整了一个Chrome插件可以及时预览对应Animate.css中的动画效果并生成对应的动画代码,这样在实际开发中

  • NetCore1.1+Linux部署初体验

    NetCore1.1+Linux部署初体验 1.环境准备 Centaos7+Win10 虚拟机 Win10安装VS2017 注意勾选下.Net Core 3.Centaos安装netcore 1.1参见https://www.microsoft.com/net/core sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?linkid=848821 sudo m

  • Visual Studio for Mac版 初体验

    你喜爱的 IDE,现在可用于 Mac.因为在 Visual Studio for Mac 之前,已经有了 Visual Studio Code for Mac,那时候我们还以为 Visual Studio Code 就是 Visual Studio 的跨平台版本,但事实微软并不是这样想的,Visual Studio Code 相对于 Visual Studio 还是太简化了,企业级的应用开发 Visual Studio Code 还是有些力不从心,所以 Visual Studio for Mac

  • js原型链与继承解析(初体验)

    首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的对象可以共享其属性(下面的两个例子会详细介绍). function foo(){} fo

  • AJAX初体验之实战篇——打造博客无刷新搜索

    如果你对AJAX不是很了解,可以先看看这篇教程的前篇<AJAX初体验之上手篇>. 现在博客很流行,相信应该上网时间稍微长点的朋友都会在这或者在那的有一个自己的博客.对于一些有一定能力的朋友,可能更喜欢自己去下载一个博客程序来架设一个自己的博客,而不是使用一些博客网站提供的服务.而大部分博客程序所带的搜索功能是提交查询关键字到搜索页面,然后在后台生成搜索结果,再呈现给用户,这过程之中浪费了一些带宽,如博客的侧边栏.要节约这一些带宽,我们可以用AJAX来打造自己的无刷新日志搜索. 在本篇教程中,数

  • MyBatis入门初体验之使用大全(2)

    MyBatis简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) 1.所需jar包

随机推荐