SpringCloud,Springcloudalibaba,SpringBoot,vue,SpringBoot+Vue,Shiro,Nacos,OpenFeign,GateWay

文章图片有缺,上传失败,需要的小伙伴可看视频,地址如下

<!-- springboot,springboot整合redis,整合rocketmq视频: -->
https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112

<!-- springcloudalibaba,openfeign,nacos,gateway,sso视频:-->
https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source=14d27ec13a4737c281b7c79463687112

<!-- vue+springboot前后端分离视频:-->
https://www.bilibili.com/video/BV1JLSEYJETc/?vd_source=14d27ec13a4737c281b7c79463687112

<!-- shiro视频:-->
https://www.bilibili.com/video/BV1YVUmYJEPi/?vd_source=14d27ec13a4737c281b7c79463687112

SpringCloud

一、微服务

随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?

1.1单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

单体架构的优缺点如下:

优点:

  • 架构简单
  • 部署成本低

缺点:

  • 耦合度高(维护困难、升级困难)

1.2 微服务

分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。并且各个服务之间可以相互调用

优点

​ 拆分粒度更小、服务更独立、耦合度更低

缺点

​ 服务调用关系错综复杂,提升部署难度

微服务这种方案需要技术框架来落地,全球的互联网公司都在积极尝试自己的微服务落地技术。在国内最知名的就是Dubbo和SpringCloud。

二、SpringCloud

2.1认识SpringCloud

SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

  • 其中常见的组件包括:
功能 组件
服务注册和发现 Eureka,Nacos,Consul
服务远程调用 Openfeign,Dubbo
统一配置管理 SpringCloudConfig,Nacos
服务链路监控 Zipkin,Sleuth
统一网关路由 SpringCloutGateway,Zuul
流控,降级,保护 Hystix,Sentinel
  • 兼容版本

    SpringCloud底层是依赖于SpringBoot的,并且有版本的兼容关系,如下:

2022.0.x aka Kilburn 3.0.x
Release Train Release Train
2021.0.x aka Jubilee 2.6.x, 2.7.x (Starting with 2021.0.3)
2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3)
Hoxton 2.2.x, 2.3.x (Starting with SR5)
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.5.x
Dalston 1.5.x

我们课堂学习的版本是2022.0.x,因此对应的SpringBoot版本是3.0.x版本。

新版本命名:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>2022.0.0</version>
    <type>pom</type>
    <scope>runtime</scope>
</dependency>

2.2使用SpringCloud

2.2.1搭建SpringCloud环境

准备t_order,t_user表

2.2.2远程调用

目前程序中我们可以通过订单ID查询到订单服务,订单对象TOrder中只存在用户ID,并没有用户的具体信息。

{
   
    "code": "1",
    "msg": "成功",
    "data": {
   
        "id": 1,
        "orderName": "铲车",
        "orderDate": "2023-04-22T07:06:40.000+00:00",
        "orderAddr": "莆田",
        "orderPrice": 99999.00,
        "userId": 2
    }
}

接下来我们需要做的是搭建用户服务,并且通过订单服务调用用户服务得到用户完整信息。

2.2.2.1调用流程

我们需要在order-service中 向user-service发起一个http的请求,调用http://localhost:8081/user?userId=?这个接口。

大概的步骤是这样的:

  • 修改order-service服务中的OrderController方法,根据Order对象中的userId查询User
  • 将查询的User填充到Order对象,一起返回
2.2.2.2 RestTemplete的使用

RestTemplate是Spring提供的用于访问Rest服务的客户端,它提供了很多可以方便访问远程http服务的方法,这些方法可以帮助开发人员减少编写客户端代码的工作量。

  • 导入依赖
     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.9.RELEASE</version>
      </dependency>
  • 编写配置类
@Configuration
public class RestTemplateConfig {
   
    @Bean
    public RestTemplate restTemplate() {
   
        return new RestTemplate();
    }
}
  • 注入RestTemplate
@Autowired
    private RestTemplate restTemplate;

1.1.4.提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

  • 完成Order服务代码补充

    注意:在调用过程中需要使用到fastjson进行对象转换

2.2.2.3提供者与消费者

在服务调用关系中,会有两个不同的角色:

服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)

服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)

但是,服务提供者与服务消费者的角色并不是绝对的,而是相对于业务而言。

如果服务A调用了服务B,而服务B又调用了服务C,服务B的角色是什么?

  • 对于A调用B的业务而言:A是服务消费者,B是服务提供者
  • 对于B调用C的业务而言:B是服务消费者,C是服务提供者

因此,服务B既可以是服务提供者,也可以是服务消费者。

2.3 Eureka注册中心

假如我们的服务提供者user-service部署了多个实例
大家思考几个问题:

  • order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?
  • 有多个user-service实例地址,order-service调用时该如何选择?
  • order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

2.3.1.Eureka的结构和作用

这些问题都需要利用SpringCloud中的注册中心来解决,其中最广为人知的注册中心就是Eureka。

Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件。

它主要包括两个组件:Eureka Server 和 Eureka Client

Eureka Client:

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)

Eureka Server:

Eureka Server提供服务注册服务, 各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息

回答之前的各个问题。

问题1:order-service如何得知user-service实例地址?

获取地址信息的流程如下:

  • user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册
  • eureka-server保存服务名称到服务实例地址列表的映射关系
  • order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取

问题2:order-service如何从多个user-service实例中选择具体的实例?

  • order-service从实例列表中利用负载均衡算法选中一个实例地址
  • 向该实例地址发起远程调用

问题3:order-service如何得知某个user-service实例是否依然健康,是不是已经宕机?

  • user-service会每隔一段时间(默认30秒)向eureka-server发起请求,报告自己状态,称为心跳
  • 当超过一定时间没有发送心跳时,eureka-server会认为微服务实例故障,将该实例从服务列表中剔除
  • order-service拉取服务时,就能将故障实例排除了

因此,接下来我们动手实践的步骤包括:

2.3.2搭建eureka-server

首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务

2.3.2.1引入eureka依赖

父项目引入SpringCloud依赖

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring-cloud.version>2021.0.3</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

引入SpringCloud为eureka提供的starter依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>3.1.5</version>
</dependency>

注意:在pom中引入了spring-boot-starter-web依赖,那么需要在eureka依赖中排除servlet-api,否则会冲突

<dependency></
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值