SpringCloud学习(还没进门篇。。)

    科技2024-10-08  19

    看B站尚硅谷周阳SpringCloud视频学习

    什么是微服务(解耦解耦!!)

    概念

    通常而言,微服务架构是一种架构模式(或者说一种架构风格),它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调,互相配置,为用户提供最终价值。

    服务之间采用轻量级的通信机制互相沟通,每个服务都围绕着具体的业务进行构建,并且能够被独立的部署到生产环境中。

    针对不同的服务,匹配适合的语言,工具进行管理,避免统一集中式的服务管理机制。

    微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事情,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,拥有自己独立的数据库。

    左:单体架构下,应用紧耦合,所有的变更必须一起上线,持续部署就是天方夜谭。 中:传统SOA架构允许单独的变更,但是每一个部分必须很谨慎地修改以免破坏整体架构设计。 右:在微服务架构下,开发可以独立地创建、维护和改进服务。服务之间通过API连接。


    微服务优缺点

    优点:

    单一职责原则(苹果手机===>>苹果+手机)每个服务足够内聚,足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求。开发简单,开发效率提高,一个服务可能就只干一件事微服务能够被小团队单独开发微服务是松耦合的,是有功能意义的服务,无论是在开发阶段还是部署阶段都是独立的微服务能使用不同的语言开发易于和第三方继承,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具(jenkins,Hudson,bamboo)微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。微服务允许你利用融合最新技术微服务只是业务逻辑的代码,不会和HTML,CSS或其他页面混合每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库(单独拿出来就能启动,虽然没什么用)

    缺点:

    开发人员要处理分布式系统的复杂性多服务运维难度,随着服务的增加,运维的压力也在增大系统部署依赖服务间通信成本数据一致性系统集成测试性能监控…

    微服务技术栈


    什么是SpringCloud

    SpringCloud基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件做高度抽象封装之外,还有一些选型中立的开源组件。

    SpringCloud为开发人员提供了快速构建分布式系统的一些工具,包括配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等等,他们都可以用SpringBoot的开发风格做到一键启动和部署。

    SpringCloud与SpringBoot的关系与区别(。。)

    SpringBoot专注于快速方便的开发单个个体微服务SpringCloud关注全局的服务治理框架SpringBoot可以离开SpringCloud单独开发,但SpringCloud离不开SpringBoot,属于依赖关系

    Dubbo和SpringCloud技术选型(。。)

    区别

    Dubbo 定位服务治理、Spring Cloud 是一个生态。

    最主要的区别就是通信方式了! Dubbo:使用RPC远程调用 SpringCloud:使用Rest API


    Rest和RPC对比

    微服务定义的服务间通信机制就是Http Rest

    RPC最主要的缺陷就是服务提供方和调用方式之间依赖太强,我们需要为每一个微服务进行接口的定义,并通过持续继承发布,需要严格的版本控制才不会出现服务提供和调用之间因为版本不同而产生的冲突

    REST是轻量级的接口,服务的提供和调用不存在代码之间的耦合, 只是通过一个约定进行规范,但也有可能出现文档和接口不一致而导致的服务集成问题,但可以通过swagger工具整合,是代码和文档一体化解决,所以REST在分布式环境下比RPC更加灵活


    本篇文章技术选型:

    心碎表示不维护了 红心表示本次学习使用


    创建项目

    1.maven项目

    2.修改字符编码

    3.注解生效激活

    4.java编译版本选8

    5.文件过滤

    dependencymanagement和dependencies的区别

    dependencyManagement里只是声明依赖,并不实现引入,而dependencies相对于dependencyManagement,所有声明在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。


    服务提供者模块

    1.写pom

    2.写yaml配置

    3. 主启动类

    4. 业务类

    1.建表SQL

    2.entities

    3.dao

    dao接口

    xml映射文件

    4.service

    接口PaymentService

    同PaymentDao

    实现类

    5.controller


    如何使用热部署工具devtools

    建议慎用,轻薄本就别用了。。

    1.添加jar包到子工程pom中

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>

    2.在父工程pom中添加配置

    <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>

    3.开启自动编译的选项

    4. 更新值

    Ctrl+Shift+Alt+/ 把complier.automake.allow.when.app.running 打勾 actionSystem.assertFocusAccessFromEdt 打勾

    5.重启IDEA

    客户端消费者模块

    1.建模块(OrderMain80)

    2.POM

    3.YML

    4.主启动

    前四个基本同上


    5.业务类

    config包

    (配置RestTemplate类)

    controller包

    消费者通过restTemplate调用服务提供者的方法。 他们仅仅通过CommonResult接口进行交互!

    感觉就是用了消费者的网址结果重定向到提供者的网址一样

    6.测试 (小心)

    插入成功但是值是null? 因为提供者的controller忘记加@RequestBody注解了(。。) 加完就可以了~~~


    Tips1:restTemplate

    传统情况下在java代码里访问restful服务,一般使用Apache的HttpClient。 由于过于繁琐,所以spring提供了一种简单便捷的模板类来进行操作,就是RestTemplate。

    使用restTemplate访问restful接口非常的简单粗暴无脑。

    url:请求地址requestMap:请求参数ResponseBean.class:HTTP响应转换被转换成的对象类型。

    工程重构

    实体类在消费者和提供者都会用到,所以是个重复的代码,我们应该把重复的代码提取出来!

    引入了hutool-all工具

    1.建立一个常用api模块(cloud-api-common)

    2.复制常用代码到api模块

    3.maven上传(clean+install)

    4.在子项目中导入pom坐标

    5.删除重复代码

    6.测试

    Processed: 0.010, SQL: 8