首页 > 其他分享 >微服务架构

微服务架构

时间:2023-05-13 10:12:10浏览次数:37  
标签:product 服务 spring xyh 架构 com order

1. 微服务架构

1.1 单体应用架构

将项目所有模块(功能)打成jar或者war,然后部署一个进程

优点:
1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。
2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。

缺点:
1:系统启动慢,一个进程包含了所有的业务逻辑,涉及到的启动模块过多,导致系统的启动、重启时间周期过长;

2:系统错误隔离性差、可用性差,任何一个模块的错误均可能造成整个系统的宕机;

3:可伸缩性差:系统的扩容只能只对这个应用进行扩容,无法结合业务模块的特点进行伸缩。

4: 线上问题修复周期长:任何一个线上问题修复需要对整个应用系统进行全面升级。

5: 跨语言程度差

6: 不利于安全管理,所有开发人员都拥有全量代码。

小型项目适合单体应用架构. 比如:OA办公系统。管理类的项目 仓库管理系统。

1.2 微服务应用 70%

微服务架构论文: https://martinfowler.com/articles/microservices.html

译文: https://blog.csdn.net/qq_42261668/article/details/102839758

In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

简单来说,微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。

解读微服务特点:
1:微服务是一种项目架构思想(风格)

2:微服务架构是一系列小服务的组合(组件化与多服务)

3:任何一个微服务,都是一个独立的进程(独立开发、独立维护、独立部署)

4:轻量级通信http协议(跨语言,跨平台)

5:服务粒度(围绕业务功能拆分---模块拆分【系统管理服务】【日志服务】【焦虑测试】【抑郁测试系统】)

6:去中心化管理(去中心化"地治理技术、去中心化地管理数据)

1.3 微服务架构的优势

1.易于开发和维护
一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对比较简单,整个应用是由若干个微服务构建而成,所以整个应用也会维持在可控状态;

⒉.单个微服务启动较快
单个微服务代码量较少,所以启动会比较快;

3.局部修改容易部署
单体应用只要有修改,就要重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可;

4.技术栈不受限
在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈

5.按需伸缩

焦虑系统访问量大,只需要对焦虑系统进行扩展

1.4:微服务架构的缺点(挑战)

1、服务太多,导致服务间的依赖错综复杂,运维难度大

2、微服务放大了分布式架构的系列问题

  • 分布式事务(seata)

  • 分布式锁怎么处理(redisson) ,

  • 服务注册与发现(nacos) .

  • 依赖服务不稳定(sentinel)导致服务雪崩怎么办?

3、运维复杂度陡增,部署数量多、监控进程多导致整体运维复杂度提升。

springcloud来解决上面微服务面临的挑战

1.5. SpringCloud与微服务关系

  • Springcloud为微服务思想提供了完美的解决方案

  • Springcloud是一些列框架的集合体(服务的注册与发现【注册中心】、服务间远程调用、服务降级、服务熔断、服务限流、分布式事务等)

    一般我们说springc1oud 其实指的是Springc1oud-netflix,Springcloud并不是造轮子,只是把Netflix公司的组件做二次开发。
    

1.6: SpringBoot和SpringCloud关系

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调、整理、治理的框架,它将SpringBoot开发的单体整合并管理起来。
  • SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。

2. 创建微服务工程

2.1 创建一个父工程

src:可以删除

package:pom打包

(1)依赖

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xyh</groupId>
  <artifactId>xyh-parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>xyh-common</module>
    <module>xyh-product</module>
      <module>xyh-order</module>
  </modules>
  <!--父工程那么它的打包方式必须为pom打包-->
  <packaging>pom</packaging>
  <!--引入父依赖-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
  </parent>

  <!--定义版本号-->
  <properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version>
  </properties>
  <dependencyManagement>
    <!--管理了cloud版本-->
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--alibaba的版本-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>

2.2 公共模块

(1)依赖

     <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
    </dependencies>

(2)product实体类

order实体类

2.3 product商品微服务

    <dependencies>
        <dependency>
            <groupId>com.xyh</groupId>
            <artifactId>xyh-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

(2)配置文件

#端口号
server.port=8080

#数据源
spring.datasource.url=jdbc:mysql://localhost:3306/aaa_db?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

(3)主启动类

@SpringBootApplication
@MapperScan(basePackages = "com.xyh.product.dao")
public class ProductApp {
    public static void main(String[] args) {
        SpringApplication.run(ProductApp.class,args);
    }
}

(4)dao层

public interface ProductDao extends BaseMapper<Product> {
}

(5)service层

@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductDao productDao;

    @Override
    public Product findById(Integer pid) {
        Product product = productDao.selectById(pid);
        return product;
    }
}

(6)controller层

package com.xyh.product.controller;

import com.xyh.pojo.Product;
import com.xyh.product.service.ProductService;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * TODO
 *
 * @author 丁德成
 * @explain
 * @date 2023/5/12
 */
@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("/getById/{pid}")
    public Product getById(@PathVariable Integer pid){
        Product byId = productService.findById(pid);
        return byId;
    }
}

2.4 order订单微服务

(1)依赖

<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/maven-v4_0_0.xsd">
    <parent>
        <artifactId>xyh-parent</artifactId>
        <groupId>com.xyh</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>xyh-order</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.xyh</groupId>
            <artifactId>xyh-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

    </dependencies>
</project>

(2) 配置

#端口号
server.port=8090

#数据源
spring.datasource.url=jdbc:mysql://localhost:3306/aaa_db?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

(3)启动类

@SpringBootApplication
@MapperScan(basePackages = "com.xyh.order.dao")
public class OrderApp {
    public static void main(String[] args) {
        SpringApplication.run(OrderApp.class,args);
    }

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

(4)controller

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    //该类默认没有交给spring容器管理
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("save")
    public String save(Integer pid,Integer num){
        Order order = new Order();
        //用户信息--登录中获取
        order.setUid(1);
        order.setUsername("云天河");
        order.setNumber(num);

        //商品信息的设置: 远程调用商品微服务的接口。 基于Http协议进行远程调用。
        //两种基于http调用的方式: 第一种: 可以使用httclient工具jar 自己封装工具类
        //                    第二种方式: spring框架中提供了一个工具类。RestTemplate.

        Product product = restTemplate.getForObject("http://localhost:8080/product/getById/" + pid, Product.class);
        if(product==null){
            return "失败";
        }
        order.setPid(product.getPid());
        order.setPname(product.getPname());
        order.setPprice(product.getPprice());

        orderService.save(order);

        return "成功";
    }
}

标签:product,服务,spring,xyh,架构,com,order
From: https://www.cnblogs.com/beiluo1024/p/17396800.html

相关文章

  • 商业级别的ethercat主站源码(倍福架构),有文档。
    商业级别的ethercat主站源码(倍福架构),有文档。ID:1220000670391592121......
  • 免费搭建可访问的云服务
       免费配置就是这样的,虽然只有1核1g,但是对于初学者来说,已经够用了,用来练习nginx部署,tomcat部署,我本次主要使用这台服务器进行nginx的https部署测试。在阿里云购买一个域名,最便宜的是9元即可买到在freessl中免费申请一个ssl证书免费搞一个云服务器在服务器上面安装ngi......
  • Nacos Client 源码分析(二)服务订阅与推送消息处理
    1.概述在上一篇文章《NacosClient源码分析(一)事件的发布与订阅》分析了NacosClient的发布订阅机制,但我们现在还不清楚NotifyCenter的publishEvent方法是怎么被调用的以及客户端向服务端订阅服务的具体流程。下面我们对继续分析Nacos的源码。2.服务订阅还是从NacosNamin......
  • Linux注册为系统服务
    0x01创建一个新的systemd服务配置文件例如myscript.service:sudonano/etc/systemd/system/myscript.service0x02在文件中添加以下内容[Unit]Description=MyScriptServiceAfter=network.target[Service]ExecStart=/path/to/myscript.shRestart=always[Install]Wa......
  • Angular 服务器端渲染两个相关的 SERVER_REQUEST_URL 和 SERVER_REQUEST_ORIGIN
    下面这段代码有什么用?exportclassAppModule{constructor(@Optional()@Inject(SERVER_REQUEST_URL)protectedserverRequestUrl?:string,@Optional()@Inject(SERVER_REQUEST_ORIGIN)protectedserverRequestOrigin?:string){console.log({serverR......
  • linux安装ftp服务器
    ftp的安装一般用yum直接在线安装;yuminstall-yvsftpd不行就updateyumupdate1.查看ftp状态systemctlstatusvsftpd.service#启动ftpsystemctlstartvsftpd.service#查看下ftp的默认端口21,发现能正常启动ss-anp|grep21#因为还没配置好,先关闭ftpsyste......
  • 火山引擎智能外呼联合火山引擎VeDI升级服务,让企业精准营销不再难
    企业营销模式正在经历一场巨变。数字化营销早已替代传统的营销方式,成为企业营销的主流方式和发展战略中不可或缺的部分。然而随着数字化营销的普及,市场迈入存量竞争时代,获客成本也逐年攀升。面对营销过程中不断增加的资金投入和巨大的资源推广,企业开始在获客过程中强调拓客效率和......
  • Linux 服务器下Mysql自动备份 30天滚动存储 每天凌晨2点准时备份
    一、创建备份目录执行命令:在指定路径下创建备份目录cd/mnt/filemkdirdata_backup二、编写shell脚本放在/mnt/file/data_backup里创建.shshell脚本:touchbkmysql.sh打开脚本文件:vim bkmysql.sh脚本文件内容如下所示:login_user表示数据库用户名......
  • 服务器上安装Power BI Data Gateway
    安装时注意事项  服务器开通好网络策略,例如一些相关的目标地址和IP加到服务器防火墙里,服务器可以联网后,还需要做浏览器相关设置,如下:   1)浏览器Tools->Internetoptions->security->customlevel->Scripting->Enableactivescripting&enablescriptingofJavaapple......
  • 信捷plc,9伺服通用程序架构,程序已经升级,程序高度模块化,可轻易拓展十几二十多个轴,,plc是
    信捷plc,9伺服通用程序架构,程序已经升级,程序高度模块化,可轻易拓展十几二十多个轴,,plc是目前性价比最高的方案,60个点10轴高速脉冲输出,走s形,正弦曲线加减速。程序采用C语言+梯形图架构。玩转信捷系统。可运用于三菱,西门子,欧姆龙等PLC架构ID:8730672586435862......