谷粒商城-基础篇(后端)

一、项目架构图

项目微服务架构图

微服务划分图

二、分布式基础概念

1)微服务

微服务架构风格,就像是把一个单独的应用程序开发成一套小服务,每个小服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP API 这些服务围绕业务能力来构建,    并通过完全自动化部署机制来独立部署,这些服务使用不同的编程语言书写,以及不同数据存储技术,并保持最低限度的集中式管理。

简而言之:拒绝大型单体应用,基于业务边界进行服务拆分,每个服务独立部署运行。

2)集群&分布式&节点

       集群是个物理状态,分布式是个工作方式。
       只要是一堆机器,也可以叫做集群,他不是不是一起协作干活,这谁也不知;
《分布式系统原理与范型》定义:
“分布式系统是若干独立计算机的集合,这些计算机对于用户来说像但各相关系统”
分布式系统 (distributed system) 是建立网络之上的软件系统。

       分布式是指:将不同的业务分布在不同的地方。
       集群指的是:将几台服务器集中在一起,实现同一业务。


       例如:京东是一个分布式系统,众多业务运行在不同的机器上,所有业务构成一个大型的业务集群。每一个小的业务,比如用户系统,访问压力大的时候一台服务器是不够的,我们就应该将用户系统部署到多个服务器,也就是每个一业务系统也可以做集群化;


       分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。
      节点:集群中的一个服务器

3)远程调用

       在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要互相调用,我们称之为远程调用。
       SpringCloud 中使用 HTTP+JSON 的方式来完成远程调用

4)负载均衡

       分布式系统中,A  服务需要调用 B 服务,B 服务在多台机器中都存在, A 调用任意一个服务器均可完成功能。
       为了使每一个服务器都不要太或者太闲,我们可以负载均衡调用每一个服务器,提升网站的健壮性。
       常见的负载均衡算法:
       轮询:为第一个请求选择键康齿中的每一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环
       最小连接:优先选择链接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式

5)服务注册/发现&注册中心

A服务调用B服务,A服务并不知道B服务当前在哪几台服务器有,哪些正常的,哪些服务已经下线。解决这个问题可以引入注册中心;

如果某些服务下线,我们其他人可以实时的感知到其他服务的状态,从而避免调用不可用的服务

6)配置中心

每一个服务最终都有大量配置,并且每个服务都可能部署在多台服务器上,我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的位置。
配置中心用来集中管理微服务的配置信息
 

7)服务熔断&服务降级

在微服务架构中,微服务之间通过网络进行通信,存在相互依赖;当其中一个服务不可用时,有可能会造成雪崩效应,要防止这种情况,必须要有容错机制来保护服务

1、服务熔断
       设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启断路保护机制,后来的请求不再去调用这个服务,本地直接返回默认的数据

2、服务降级
       在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心业务降级运行,降级:某些服务不处理,或者简单处理【抛异常,返回NULL,调用 Mock数据,调用 FallBack 处理逻辑】

8)API网关

在微服务架构中,API Gateway 作为整体架构的重要组件,他抽象了微服务中都需要的公共功能,同时它提供了客户端负载均衡,服务自动熔断,灰度发布,统一认证,限流监控,日志统计等丰富功能,帮助我们解决很多 API 管理的难题
 

三、环境搭建

1)安装linux虚拟机

2)虚拟机安装mysql、redis

四、服务创建

五、SpringCloud Alibaba

1)简介

       Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
        依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
 

2)为什么要使用 

3)SpringClouid的几大痛点

SpringCloud部分组件停止维护和更新,给开发带来不便;
SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用

4)SpringCloud Alibaba的优势

阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用
成套的产品搭配完善的可视化界面给开发运维带来极大的便利
搭建简单,学习曲线低。

5)SpringCloud Alibaba技术搭配方案

SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册)
SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理)
SpringCloud - Ribbon: 负载均衡
SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)
SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断)
SpringCloud - Gateway:  API 网关 (webflux 编程模式)
SpringCloud - Sleuth:调用链监控
SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案

5.1、SpringCloud Alibaba - Nacos [作为注册中心]

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境
Nacos 文档地址: https://nacos.io/zh-cn/docs/quick-start.html

下载 nacos-server:https://github.com/alibaba/nacos/releases

启动 nacos-server
- cmd 运行startup.cmd 文件
- 访问localhost:8848/nacos/
- 使用默认的账号/密码: nacos/nacos 登录

1)服务注册到Nacos

1、首先,修改 ,引入nacos作为服务注册/发现中心的依赖
 

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>

       在公共服务common的pom.xml文件中引入nacos依赖,其他微服务如果需要将服务注册到nacos,引入公共服务common依赖即可。

2、在应用的 /resource /application.properties 中配置 Nacos Server地址

服务注册中心地址:spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

3、在服务启动类上使用@EnableDiscoveryClient 开启服务注册发现功能

 @SpringBootApplication
 @EnableDiscoveryClient //开启服务注册发现
 public class ProviderApplication {

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

4、启动应用、观察 nacos 服务列表是否已经注册上服务

注意每一个应用都应该有名字,这样才能往册上去。修改pplicaion.propertes文件
服务注册名称:spring.application.name: 服务名(例:gulimall-order)
服务端口:server.port=8000

5、注册更多的服务上去,测试使用 feign 远程

Nacos 使用三步

1)、导包

2)、写配置,指定 nacos 地址,指定应用的名字

3)、开启服务注册发现功能 @EnableDiscoveryClient

Feign 使用三步

1)、导包 openfeign

2)、开启 @EnableFeignClients 功能

3)、编写接口,进行远程调用

5.2、SpringCloud Alibaba - Nacos [作为配置中心]

使用步骤与Nacos作为注册中心一样

pom.xml 引入 Nacos Config Starter

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

在应用的 resource 下 bootstrap.properties

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

在 nacos 中添加配置:

Data ID 改成 gulimall-coupon.properties 默认规则 用户名.应用名.properties
在应用中使用@Value 和 @RefreshScope,配置中心数据更改,服务随即获得更新

@RefreshScope // 刷新对应controller
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String name;

    @Value("${coupon.user.age}")
    private Integer age;
    @RequestMapping("/test")
    public R test() {
        return R.ok().put("name",name).put("age",age);
    }

Nacos进阶

核心概念

1)、命名空间:
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 DatalD的配置。Namespace  的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

2)、配置集

一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

2.1)、配置集ID:

Nacos 中的某个配置集的 ID,配置集 ID 是组织划分配置的维度之一,**Data ID** 通常用于组织划分系统的配置集,一个系统或者应用可以包含多个配置集,一个系统应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识,Data ID 通常采用类 Java 包 如 ( com.taobao.tc.refund.log.level ) 的命名规则保证全局唯一性,此命名规则非强制

2.2)、配置分组:

Nacos 中的一组配置集,是组织配置的维度之一,通过一个有意义的字符串,(如 Buy 或 Trade ) 对配置集进行分组,从而区分 Data ID 相同的配置集,当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用,DEFAULT_GROUP 配置分组的常见场景,不同的应用或组件采用了相同的配置类型,如 database_url 配置和 MQ_topic 配置

3)、bootstrap.properties 配置

```properties
spring.application.name=gulimall-coupon # 服务的名称
spring.cloud.nacos.config.server-addr=127.0.0.1:8848  # 服务注册地址
spring.cloud.nacos.config.namespace=ae34901c-9215-4409-ae61-c6b8d6c8f9b0  # 命名空间地址
#spring.cloud.nacos.config.group=111 # 对应分组

spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml  # 配置集指定data_id
spring.cloud.nacos.config.ext-config[0].group=dev   # 配置集指定 group 分组
spring.cloud.nacos.config.ext-config[0].refresh=true #是否动态刷新在配置中心修改后,微服务自动刷新
/**
 * 1、如何使用 Nacos作为配置中心统一管理配置
 *  1.1 引入依赖
 *     <dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 *      </dependency>
 *  1.2 创建一个bootstrap.properties
 *      spring.application.name=gulimall-coupon
 *      spring.cloud.nacos.config.server-addr=127.0.0.1:8848
 *  1.3 需要给配置中心默认添加一个叫 数据集 (Data Id) gulimall-coupon.properties 默认规则 用户名.应用名.properties
 *  1.4 给 应用名.properties 添加任何配置
 *  1.5 动态获取配置
 *      @RefreshScope: 动态获取并刷新配置
 *      @Value$("${配置项的名字}")
 * 如果配置中心和当前应用的配置文件中都配置了相同的配置文件,优先使用配置中心的文件
 *
 * 2、细节
 *      1、命名空间:配置隔离:
 *          默认:public(保留空间);默认新增的所有配置都在 public 空间
 *          1、开发 测试 生产 利用命名空间来做环境隔离
 *          注意: 在bootstrap.properties配置上 需要使用哪个命名空间下的配置
 *              spring.cloud.nacos.config.namespace=b1e89ce0-784f-4a80-9de0-e9b080eeaca5
 *          2、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
 *
 *
 *      2、配置集:所有配置的集合
 *
 *      3、配置集ID:类似文件名
 *          Data ID:类型文件名
 *
 *      4、配置分组:
 *      默认所有的配置都属于 DEFAULT_GROUP
 *
 * 每个微服务创建自己的命名空间,使用配置分组区分环境,dev、test、prod
 *
 * 3、同时加载多个配置集
 *      1、微服务任何配置信息,任何配置文件多可以放在配置中心中
 *      2、只要在 bootstrap.properties 说明加载配置中心中哪些配置文件即可
 *      3、@Value,@ConfigurationProperties...
 *      以前SpringBoot的任何方式从配置文件中获取值,都能使用
 *      配置中心有的优先使用配置中心的
 * /

微服务基础总结

1、分布式基础概念 
      微服务、注册中心、配置中心、远程调用、Feign、网关 
2、基础开发 
      SpringBoot2.0、SpringCloud、Mybatis-Plus、Vue组件化、阿里云对象存储 
3、环境 
      Vagrant、Linux、Docker、MySQL、Redis、逆向工程&人人开源 
4、开发规范 
     数据校验JSR303、全局异常处理、全局统一返回、全局跨域处理 
     枚举状态、业务状态码、VO与TO与PO划分、逻辑删除 
     Lombok:@Data、@Slf4j

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值