SpringCloud学习笔记(二、单体架构实例)

简介: SpringCloud学习笔记(二、单体架构实例)

文章目录

单体架构实例

在Idea里新建一个SpringBoot项目, 这里选择SpringBoot 的版本依赖是 2.0.3.RELEASE。

  • 依赖
    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>edu.hpu</groupId>
  <artifactId>product-service</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>product-service</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
  <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>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional> <!-- 配置为true 热部署才有效 -->
    </dependency>
    <dependency>         <!--配置hutool工具包-->
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>4.3.1</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

  • 启动类ProducServicetApplication:
package edu.hpu;
import cn.hutool.core.util.NetUtil;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class ProductServiceApplication {
    public static void main(String[] args){
        int port=8080;         //端口号
        if(!NetUtil.isUsableLocalPort(port)){
            System.err.printf("端口%d被占用了,无法启动%n", port );
            System.exit(1);
        }
        new SpringApplicationBuilder(ProductServiceApplication.class).properties("server.port=" + port).run(args);
    }
}

  • 实体类Product:
package edu.hpu.pojo;
public class Product {
    private int id;
    private String name;
    private int  price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public Product(int id, String name, int price) {
        super();
        this.id = id;
        this.name = name;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
  • 服务层ProcuctService:
    为了降低代码量,这里数据直接放在内存里,不再引入数据库。
package edu.hpu.service;
import edu.hpu.pojo.Product;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class ProductService {
    public List<Product> listProducts(){
      List<Product> products=new ArrayList<>();
      products.add(new Product(1,"锤子",11));
      products.add(new Product(2,"斧头",23));
      products.add(new Product(3,"棒子",33));
      return products;
    }
}

  • 控制层ProductController:
package edu.hpu.controller;
import edu.hpu.pojo.Product;
import edu.hpu.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class ProductController {
    @Autowired
    private ProductService productService;
    @RequestMapping("/procucts")
    public Object products(Model m){
        List<Product> ps = productService.listProducts();
        m.addAttribute("ps", ps);
        return "products";
    }
}

  • 视图products.html:
    这里用的是thymeleaf模板来编写我们的前端
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        table {
            border-collapse:collapse;
            width:400px;
            margin:20px auto;
        }
        td,th{
            border:1px solid gray;
        }
    </style>
</head>
<body>
   <div id="container">
       <table>
           <thead>
           <th>编号</th>
           <th>名称</th>
           <th>价格</th>
           </thead>
           <tbody>
           <tr th:each="p: ${ps}">
               <td th:text="${p.id}"></td>
               <td th:text="${p.name}"></td>
               <td th:text="${p.price}"></td>
           </tr>
           </tbody>
       </table>
   </div>
</body>
</html>
  • 配置application.properties
#thymeleaf 配置
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.content-type=text/html
#缓存设置为false, 这样修改之后马上生效,便于调试
spring.thymeleaf.cache=false
#上下文
server.context-path=/

至此一个简单的单体式的MVC分层应用就创建成功了,运行,访问。

image.png

分析与比较

在引入微服务的架构之前,我们先对当前的单体应用做一个分析。

单体架构优点

便于开发,测试,部署也很方便,直接打成一个 jar 或者 war, 就全部搞定了

单体架构缺点

这个项目很简单,就做两件事: 1. 提供数据 2. 展示数据。

它把两个服务,提供数据和展示数据 放在了一起,这就会出现单体架构固有的缺点。

  1. 如果要修改数据部分的代码, 那么必须把整个项目重新编译打包部署。 虽然展示部分,什么都没变但是也会因为重新部署而暂时不能使用,要部署完了,才能使用。
  2. 如果提供数据部分出现了问题,比如有的开发人员改错了,抛出了异常,会导致整个项目不能使用,展示数据部分也因此受到影响。
  3. 性能瓶颈难以突破
    image.png

改进

上面是一个单体式的架构,现在用分布式和集群的思路,对其进行改造:

微服务

微服务简单说,一个 springboot 就是一个 微服务,并且这个 springboot 做的事情很单纯。 比如  product-service 这个项目,就可以拆成两个微服务,分别是 数据微服务,和视图微服务,其实就是俩 springboot,  只是各自做的事情都更单纯。

image.png

服务注册

有了微服务,就存在如何管理这个微服务,以及这两个微服务之间如何通信的问题,所以就要引入一个 微服务注册中心概念,这个微服务注册中心在 springcloud 里就叫做 eureka server, 通过它把就可以把微服务注册起来,以供将来调用。

image.png

服务访问

在业务逻辑上, 视图微服务 需要 数据微服务 的数据,所以就存在一个微服务访问另一个微服务的需要。

而这俩微服务已经被注册中心管理起来了,所以 视图微服务 就可以通过 注册中心定位并访问 数据微服务了。

在后续教程里,会演示微服务的相互调用。

image.png

分布式

当前这个架构可以说是分布式,原来是在一个 springboot里就完成的事情,现在分布在多个 springboot里做,这就是初步具备 分布式雏形了。

image.png

集群

原来数据微服务只有这一个springboot, 现在做同样数据微服务的,有两个 springboot, 他们提供的功能一模一样,只是端口不一样,这样就形成了集群。

那么集群有什么好处呢?

  1. 比起一个 springboot, 两个springboot 可以分别部署在两个不同的机器上,那么理论上来说,能够承受的负载就是 x 2. 这样系统就具备通过横向扩展而提高性能的机制。
  2. 如果 8001 挂了,还有 8002 继续提供微服务,这就叫做高可用 。
    image.png

这样一个简单的微服务的架构就搭建出来了,接下来的学习就围绕这个架构来实现和完善。

参考:

【1】、分布式和集群 / SpringCloud / SpringCloud系列教材 (一)- 介绍

【2】、分布式和集群 / SpringCloud / SpringCloud系列教材 (二)- 单体架构例子


目录
相关文章
|
7月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
11月前
|
存储 缓存 分布式计算
高内存场景必读!阿里云r7/r9i/r8y/r8i实例架构、性能、价格多维度对比
阿里云针对高性能需求场景,一般会在活动中推出内存型r7、内存型r9i、内存型r8y和内存型r8i这几款内存型实例规格的云服务器。相比于活动内的经济型e和通用算力型u1等实例规格,这些内存型实例在性能上更为强劲,尤其适合对内存和计算能力有较高要求的应用场景。这些实例规格的云服务器在处理器与内存的配比上大多为1:8,但它们在处理器架构、存储性能、网络能力以及安全特性等方面各有千秋,因此适用场景也各不相同。本文将为大家详细介绍内存型r7、r9i、r8y、r8i实例的性能、适用场景的区别以及选择参考。
|
自然语言处理 JavaScript Java
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS架构介绍
HarmonyOS采用分层架构设计,从下至上分为内核层、系统服务层、框架层和应用层。内核层支持多内核设计与硬件驱动;系统服务层提供核心能力和服务;框架层支持多语言开发;应用层包括系统及第三方应用,支持跨设备调度,确保一致的用户体验。
1368 81
|
10月前
|
运维 监控 Java
初创代购选单体,千万级平台用微服务:一张表看懂架构选型红线
在跨境电商代购系统年交易额超3.2万亿元的背景下,本文对比微服务与单体架构的技术原理、适用场景及实战案例,结合性能、运维、成本等维度,为企业提供架构选型指南,助力实现高效扩展与稳定运营。
|
11月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
909 0
|
存储 弹性计算 运维
阿里云通用算力型U1实例怎么样?u1实例技术架构、场景适配与优惠价格参考
阿里云服务器ECS 通用算力型u1实例2核4G,5M固定带宽,80G ESSD Entry盘,企业用户专享优惠价格199元1年,很多用户关心这个款云服务器怎么样?阿里云通用算力型U1实例自推出以来,凭借独特的"均衡算力+智能调度"设计理念,在IaaS市场开辟出差异化的竞争赛道。本文将通过技术架构解析、典型场景适配分析、全生命周期成本测算三个维度,全面解构这款热门云服务器实例的核心价值,以供参考和选择。
|
存储 开发框架 缓存
YashanDB实例架构
YashanDB实例架构
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
存储 JavaScript 开发工具
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】
本次的.HarmonyOS Next ,ArkTS语言,HarmonyOS的元服务和DevEco Studio 开发工具,为开发者提供了构建现代化、轻量化、高性能应用的便捷方式。这些技术和工具将帮助开发者更好地适应未来的智能设备和服务提供方式。
基于HarmonyOS 5.0(NEXT)与SpringCloud架构的跨平台应用开发与服务集成研究【实战】

热门文章

最新文章