SpringCloud之基本使用与nacos

本文介绍了SpringCloud的核心组件Eureka用于服务的注册与发现,以及Nacos的搭建过程,包括创建父项目、配置YML文件、启动服务等步骤。通过Eureka,订单服务可以找到库存、仓储和积分服务进行调用。同时,文章还讨论了服务调用的方法,包括消费者如何通过Nacos实现负载均衡和调用路径的动态配置。
摘要由CSDN通过智能技术生成

一、SpringCloud概念

业务场景介绍:
        开发一个电商网站,要实现支付订单的功能,流程如下:
        创建一个订单之后,如果用户立刻支付了这个订单,我们需要将订单状态更新为“已支付”
        扣减相应的商品库存
        通知仓储中心,进行发货
        给用户的这次购物增加相应的积分
服务分析
        订单服务、库存服务、仓储服务、积分服务
流程调用
        用户针对一个订单完成支付之后,就会去找订单服务,更新订单状态
        订单服务调用库存服务,完成相应功能
        订单服务调用仓储服务,完成相应功能
        订单服务调用积分服务,完成相应功能

 SpringCloud:

基本组件 

1、SpringCloud核心组件:Eureka
Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。
订单服务想要调用库存服务、仓储服务,或者是积分服务,怎么调用?
订单服务压根儿就不知道人家库存服务在哪台机器上啊!他就算想要发起一个请求,都不知道发送给谁,有心无力!

  Eureka Client:负责将这个服务的信息注册到Eureka Server中
Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

Spring Cloud核心组件:Feign

现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了,同时也监听着哪些端口号了。
但是新问题又来了:如何从订单服务跟其他服务建立网络连接,接着发送请求过去。

 Spring Cloud核心组件:Ribbon

集群服务:库存服务部署在了5台机器上
192.168.169:9000
192.168.170:9000
192.168.171:9000
192.168.172:9000
192.168.173:9000
Ribbon就是专门解决这个问题的。它的作用是负载均衡,会帮你在每次请求时选择一台机器,均匀的把请求分发到各个机器上
首先Ribbon会从 Eureka Client里获取到对应的服务注册表,也就知道了所有的服务都部署在了哪些机器上,在监听哪些端口号。
然后Ribbon就可以使用默认的Round Robin算法,从中选择一台机器

Spring Cloud核心组件:Hystrix
在微服务架构里,一个系统会有很多的服务。
以上面的业务场景为例:订单服务在一个业务流程里需要调用三个服务。
现在假设订单服务自己最多只有 100 个线程可以处理请求,然后呢,积分服务不幸的挂了,每次订单服
务调用积分服务的时候,都会卡住几秒钟,然后抛出 个超时异常

出现问题: 微服务架构中的服务雪崩问题
如果系统处于高并发的场景下,大量请求涌过来的时候,订单服务的 100 个线程都会卡在请求积分
服务这块。导致订单服务没有一个线程可以处理请求
然后就会导致别人请求订单服务的时候,发现订单服务也挂了,不响应任何请求了
Hystrix 是隔离、熔断以及降级的一个框架。
比如订单服务请求库存服务是一个线程池,请求仓储服务是一个线程池,请求积分服务是一个线程池。
每个线程池里的线程就仅仅用于请求那个服务
积分服务挂了
会导致订单服务里的那个用来调用积分服务的线程都卡死不能工作!
但是由于订单服务调用库存服务、仓储服务的这两个线程池都是正常工作的,所以这两个服务不会受到
任何影响。
----------------------------------------------------------------------
这个时候如果别人请求订单服务,订单服务还是可以正常调用库存服务扣减库存,调用仓储服务通知发
货。
只不过调用积分服务的时候,每次都会报错。但是如果积分服务都挂了,每次调用都要去卡住几秒钟!
所以我们直接对积分服务熔断不就得了,比如在 5 分钟内请求积分服务直接就返回了,不要去走网络请求
卡住几秒钟,这个过程,就是所谓的熔断!
那人家又说,兄弟,积分服务挂了你就熔断,好歹你干点儿什么啊!别啥都不干就直接返回啊?
没问题,咱们就来个降级:
每次调用积分服务,你就在数据库里记录一条消息,说给某某用户增加了多少积分,因为积分服务挂
了,导致没增加成功!
这样等积分服务恢复了,你可以根据这些记录手工加一下积分。这个过程,就是所谓的降级。

Spring Cloud核心组件:Zuul
这个组件是负责网络路由的。
一般微服务架构中都必然会设计一个网关在里面,像 android ios pc 前端、微信小程序、 H5 等等。
不用去关心后端有几百个服务,就知道有一个网关,所有请求都往网关走,网关会根据请求中的一些特
征,将请求转发给后端的各个服务。
有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全,等等。
组件总和
Eureka :各个服务启动时, Eureka Client 都会将服务注册到 Eureka Server ,并且 Eureka Client
可以反过来从 Eureka Server 拉取注册表,从而知道其他服务在哪里
Ribbon :服务间发起请求的时候,基于 Ribbon 做负载均衡,从一个服务的多台机器中选择一台
Feign :基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起请求
Hystrix :发起请求是通过 Hystrix 的线程池来走的,不同的服务走不同的线程池,实现了不同服务
调用的隔离,避免了服务雪崩的问题
Zuul :如果前端、移动端要调用后端系统,统一从 Zuul 网关进入,由 Zuul 网关转发请求给对应的服
流程
1. 请求统一通过 API 网关( Zuul )来访问内部服务 .
2. 网关接收到请求后,从注册中心( Eureka )获取可用服务
3. Ribbon 进行均衡负载后,分发到后端具体实例
4. 微服务之间通过 Feign 进行通信处理业务
5. Hystrix 负责处理服务超时熔断

springCloud 关系
Spring Cloud 包含很多子项目: Netflix Alibaba 两个标准使用最多
Spring Cloud Netflix 第一代
针对多种 Netflix 组件提供的开发工具包,其中包括 Eureka Ribbon Feign Hystrix Zuul
Archaius 等。
Netflix Eureka :一个基于 Rest 服务的服务治理组件,包括服务注册中心、服务注册与服务发现机
制的实现,实现了云端负载均衡和中间层服务器的故障转移。
Netflix Ribbon :客户端负载均衡的服务调用组件。
Netflix Hystrix :容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供
更强大的容错能力。
Netflix Feign :基于 Ribbon Hystrix 的声明式服务调用组件。
Netflix Zuul :微服务网关,提供动态路由,访问过滤等服务。
Netflix Archaius :配置管理 API ,包含一系列配置管理 API ,提供动态类型化属性、线程安全配置
操作、轮询框架、回调机制等功能。

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

「阿里开源组件」
Nacos :阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平
台。
Sentinel :面向分布式服务架构的轻量级流量控制产品,把流量作为切入点,从流量控制、熔断降
级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ :一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的
消息发布与订阅服务。
Dubbo Apache Dubbo™ 是一款高性能 Java RPC 框架,用于实现服务通信。
Seata :阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
「阿里商业化组件」
Alibaba Cloud ACM :一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产
品。
Alibaba Cloud OSS :阿里云对象存储服务( Object Storage Service ,简称 OSS ),是阿里云提供
的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访
问任意类型的数据。
Alibaba Cloud SchedulerX :阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、
高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
Alibaba Cloud SMS :覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速
搭建客户触达通道

 

SpringCloud 常用组件
Spring Cloud Netflix Eureka :服务注册中心。
Spring Cloud Zookeeper :服务注册中心。
Spring Cloud Consul :服务注册和配置管理中心。
Spring Cloud Netflix Ribbon :客户端负载均衡。
Spring Cloud Netflix Hystrix :服务容错保护。
Spring Cloud Netflix Feign :声明式服务调用。
Spring Cloud OpenFeign( 可替代 Feign) OpenFeign Spring Cloud Feign 的基础上支持了
Spring MVC 的注解,如 @RequesMapping 等等。 OpenFeign @FeignClient 可以解析 SpringMVC
@RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用
其他服务。
Spring Cloud Netflix Zuul API 网关服务,过滤、安全、监控、限流、路由。
Spring Cloud Gateway( 可替代 Zuul) Spring Cloud Gateway Spring 官方基于 Spring 5.0 Spring
Boot 2.0 Project Reactor 等技术开发的网关, Spring Cloud Gateway 旨在为微服务架构提供一种简
单而有效的统一的 API 路由管理方式。 Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目
标是替代 Netflix Zuul ,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,
例如:安全,监控 / 埋点,和限流等。
Spring Cloud Security :安全认证。
Spring Cloud Config :分布式配置中心。配置管理工具,支持使用 Git 存储配置内容,支持应用配置的
外部化存储,支持客户端配置信息刷新、加解密配置内容等。
Spring Cloud Bus :事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与
Spring Cloud Config 联合实现热部署。
Spring Cloud Stream :消息驱动微服务。
Spring Cloud Sleuth :分布式服务跟踪。
Spring Cloud Alibaba Nacos :阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置
管理和服务管理平台。
Spring Cloud Alibaba Sentinel :面向分布式服务架构的轻量级流量控制产品,把流量作为切入点,从
流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Spring Cloud Alibaba RocketMQ :一款开源的分布式消息系统,基于高可用分布式集群技术,提供低
延时的、高可靠的消息发布与订阅服务。
Spring Cloud Alibaba Dubbo Apache Dubbo™ 是一款高性能 Java RPC 框架,用于实现服务通信。
Spring Cloud Alibaba Seata :阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

二、nacos搭建

1、新建项目,将此项目作为父项目,给子类提供依赖(Maven项目)

2、cloud01项目导入依赖

 packing(打包类型,默认为jar)
pom : 父级项目(pom项目里没有java代码,也不执行任何代码,只是为了聚合工程或传递依赖用的)
jar : 内部调用或者是作服务使用
war : 需要部署的项目
dependencyManagement(管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号)
dependencyManagementdependencies区别:
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
如果不在子项目中声明依赖,是不会从父项目中继承下来的。
只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom。
另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
modules(用来管理同个项目中的各个模块)

<?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>org.example</groupId>
  <artifactId>Cloud_01</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>nacos_provider</module>
    <module>nacos_consumer</module>
  </modules>

  <name>Cloud_01 Maven Webapp</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.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    <spring-boot.version>2.4.1</spring-boot.version>
    <spring-cloud.version>2020.0.0</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency> <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
      <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>

3、下载nacos服务

①、nacos官网nacos官网

选择第二个

②、启动服务:

 咱们就使用cmd文件进行启动:startup.cmd

 

 ③、打开页面: 

会有一个地址,复制进去nacos的主界面,并且登录 

 ④、将自带的sql脚本导入数据库:

⑥、打开application.properties文件(这个文件在下载完nacos后的一个conf文件目录下面)

新增以下连接数据库内容:并重新启动

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?
characterEncoding=utf-8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

 2、新建子项目:生产者项目(此时新建的项目为Spring Initializr项目)

 ①、子项目需要认父:pom.xml(我们要去pom文件中修改,相当于找个爹)

<parent>
    <artifactId>Cloud_01</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.provider</groupId>
    <artifactId>code</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos_provider</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <artifactId>Cloud_01</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</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-boot.version>2.4.1</spring-boot.version>
    </properties>

    <dependencies>

    </dependencies>

    <dependencyManagement>

    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <mainClass>com.provider.code.NacosProviderApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

②、父项目需要认子:pom.xml(相当于上面,有人认你当爹,你要承认这个儿子)

<modules>
  <module>nacos_provider</module>
</modules>

③、配置yml文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        # host文件中配置
  application:
    name: nacos-provider
server:
  port: 8081

④、在启动类加入注解

@EnableDiscoveryClient

运行:

 成功,并在nacos中产生服务

3、新建子项目:消费者项目

①、子项目需要认父:pom.xml,将不需要的依赖删掉,如生产者的

<parent>
    <artifactId>Cloud_01</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

 ②、父项目需要认子:pom.xml

<modules>
  <module>nacos_provider</module>
  <module>nacos_consumer</module>
</modules>

③、配置yml文件

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: nacos-consumer
server:
  port: 8082

④、在启动类加入注解

@EnableDiscoveryClient

三、方法调用

例子:生产者生产物品,消费者拿

1、生产者

①、建个controller层:生产任务

package com.provider.code;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {

    @RequestMapping("/run")
    public  String run(){
        return "任务";
    }

}

 

2、消费者

①、 在启动类写域名访问的一个对象

package com.consumer.code;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {


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

    //RestTemplate  域名访问的一个对象
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

②、controller层调用对象:ConsumerController 

package com.consumer.code;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


@RestController
public class ConsumerController {

    private RestTemplate template;

    @Autowired
    public ConsumerController(RestTemplate template) {
        this.template = template;
    }

    @RequestMapping("/run")
    public String run(){
        //消费者找生产者读取一个任务(要做跨服务器访问)
        return template.getForObject("http://127.0.0.1:8081/run",String.class);
    }

}

 这样消费者也可以取到任务了

3、消费者调用路径写死的解决方案

①、去nacos中找到服务名称

②、将此名称放入路径中

return template.getForObject("http://nacos-provider/run",String.class); 

③、在消费者内导入依赖(负载均衡)

ribbon状态:停止更新
替代方案:Spring Cloud Loadbalancer

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>

④、在消费者的启动类NacosConsumerApplication导入注解

 达到负载均衡的目的

see  you

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值