Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】

news2024/11/23 17:21:42

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】

    • 一、微服务介绍
      • 1、系统架构演变
        • 1)单体应用架构
        • 2)垂直应用架构
        • 3)分布式
        • 4)SOA架构
        • 5)微服务框架
        • 6)常见微服务架构
      • 2、SpringCloud Alibaba介绍
      • 3、SpringCloud Alibaba定位
      • 4、SpringCloud 各套实现对比
      • 5、SpringCloud 各套实现对比
      • 6、Spring Cloud Alibaba 用户数
    • 二、基本分布式架构搭建
      • 1、基于SpringBoot的父maven项目
      • 2、创建订单项目模块
      • 3、创建库存服务模块
      • 4、创建订单项目模块的启动类
      • 5、创建库存项目模块的启动类
      • 6、完善项目配置文件
      • 7、启动项目
    • 三、SpringCloud Alibaba环境搭建
      • 1、SpringCloud Alibaba 依赖 Java 环境来运行。还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
      • 2、完善项目的版本
      • 3、通过阿里云的脚手架快速搭建项目(尝试)
    • 四、Alibaba微服务组件Nacos注册中心
      • 1、什么是Nacos
      • 2、Nacos注册中心
        • 1)注册中心演变及其设计思想
        • 2)核心功能
      • 3、Nacos Server部署和启动
      • 4、搭建Nacos-client服务
          • 1)创建Nacos客户端
          • 2)添加nacos服务注册发现的依赖
          • 3)设置上述对应的application.yml
          • 4)配置nacos客户端相关内容
          • 5)启动对应刚刚添加的两个客户端
      • 5、在order-nacos当中通过服务名称调用stock-nacos
      • 6、演示nacos的负载均衡
      • 7、yml的其他配置项
    • 五、Nacos管理界面详细介绍
      • 1、新建命名空间
      • 2、服务列表当中创建不同的服务
      • 3、查看详情
      • 4、订阅者列表
      • 5、权限控制
      • 6、集群管理
    • 六、Nacos集群环境部署
      • 1、预备环境准备
      • 2、下载源码或者安装包
      • 3、单机搭建伪集群
        • 1)单机搭建伪集群,复制nacos安装包,修改为`nacos8849`,`nacos8850`,`nacos8851`
        • 2)以nacos8849为例,进入nacos8849目录
          • 2.1 修改`conflapplication.properties`的配置,使用外置数据源要使用`mysql5.7+`
          • 2.1 将`conflcluster.conf.example`改为`cluster.conf`、添加节点配置
      • 3、单机搭建伪集群
      • 4、安装nginx
      • 5、修改微服务项目当中的yml
    • 七、微服务负载均衡器`Ribbon`
      • 1、什么是Ribbon
        • 1)客户端的负载均衡
        • 2)服务端的负载均衡
        • 3)常见的负载均衡算法
      • 2、Nacos使用Ribbon
      • 3、Ribbon负载均衡策略
      • 4、修改默认负载均衡策略
        • 1)配置类
        • 2)配置文件
      • 5、自定义负载均衡策略
        • 1)默认调用的时候启动对应的负载均衡器
        • 2)启动的时候加载负载均衡器
    • 八、微服务负载均衡器`LoadBalancer`
      • 1、什么是SpringCloud LoadBalancer
      • 2、RestTemplate整合LoadBalancer
        • 1)引入依赖
        • 2)复制一个工程用于演示
        • 3)排除ribbon依赖,添加loadbalanncer依赖

一、微服务介绍

1、系统架构演变

随着互联网的发展,网站应用的规模也在不断的扩大,进而导致系统架构也在不断的进行变化。从互联网早起到现在,系统架构大体经历了下面几个过程:单体应用架构—>垂直应用架构—>分布式架构—>SOA架构—>微服务架构,当然还有悄然兴起的Service Mesh(服务网格化)。
接下来我们就来了解一下每种系统架构是什么样子的,以及各有什么优缺点。

1)单体应用架构

互联网早期,一般的网站应用流量较小,只需一个应用,将所有功能代码都部署在一起就可以,这样可以减少开发、部署和维护的成本。

比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。
在这里插入图片描述

2)垂直应用架构

随着访问量的逐渐增大,单一应用只能依靠增加节点来应对,但是这时候会发现并不是所有的模块都会有比较大的访问量.还是以上面的电商为例子,用户访问量的增加可能影响的只是用户和订单模块,但是对消息模块
的影响就比较小.那么此时我们希望只多增加几个订单模块,而不增加消息模块. 此时单体应用就做不到了,垂直应用就应运而生了.所谓的垂直应用架构,就是将原来的一个应用拆成互不相干的几个应用,以提升效率。比如我们可以将上面电商的单体应用拆分成:

  • 电商系统(用户管理商品管理订单管理)
  • 后台系统(用户管理订单管理客户管理)
  • CMS系统(广告管理营销管理)
    在这里插入图片描述

这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台和CMS的节点。
优点:

  • 系统拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水扩展.
  • 一个系统的问题不会影响到其他系统,提高容错率

缺点:

  • 系统之间相互独立,无法进行相互调用。
  • 系统之间相互独立,会有重复的开发任务

3)分布式

当垂直应用越来越多,重复的业务代码就会越来越多。

这时候,我们就思考可不可以将重复的优代码抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢?这就产生了新的分布式系统架构。

它将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑。

表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。

在这里插入图片描述

4)SOA架构

在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture)是关健。
在这里插入图片描述
优点:

  • 使用治理中心(ESBldubbo)解决了服务间调用关系的自动调节

缺点:

  • 服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩)
  • 服务关系复杂,运维、测试部署困难

5)微服务框架

微服务架构在某种程度上是面向服务的架构SOA继续发展的下一步,它更加强调服务的"彻底拆分"。
在这里插入图片描述
微服务架构与SOA架构的不同
微伤务架的比 SOA架的粒度会更加情细,让专业的人去做专业的事情(专注),目的提高效率,每个服务于服务之间互不影响,微服务架构中,每个服务必须独立部署,微服务架构更加轻巧,轻量级SOA架构中可能数据库存储会发生共享,微服务强调独每个服务都是单独数据库,保证每个服务于服务之间互不影响.项目体现特征微服务架构比SOA架构更加适合与互联网公司敏捷开发、快速迭代版本,因为粒度非常精细。

优点:

  • 服务原子化拆分、独立打包、部署和升级、保证每个微服务清晰的任务划分、利于扩展
  • 微服务之间采用Restful等轻量级http协议相互调用

缺点:

  • 分布式系统开发的技术成本高(容错、分布式事务等)
  • 复杂性更高。各个微服务进行分布式独立部署,当进行模块调用的时候,分布式将会变得更加麻烦。

他说微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTP的方式进行互联互通。
在这里插入图片描述
在这里插入图片描述
微服务架构常见的问题

一旦采用微服务系统架构,就势必会遇到这样几个问题:

  • 这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除]) 【nacos】
  • 这么多小服务,他们之间如何通讯?【restful rpc dubbo feign】
  • 这么多小服务,客户端怎么访问他们?(网关) 【gateway】
  • 这么多小服务,一旦出现问题了,应该如何自处理?(容错) 【sentinel】
  • 这么多小服务,一旦出现问题了,应该如何排错? (链路追踪) 【skywalking】

对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一
个问题提供了相应的组件来解决它们。
在这里插入图片描述

6)常见微服务架构

1.dubbo: zookeeper +dubbo + SpringMVC/SpringBoot

  • 配套通信方式: rpc
  • 注册中心:zookeeper / redis·配置中心: diamond

2.SpringCloud:全家桶+轻松嵌入第三方组件(Netflix)

  • 配套通信方式: http restful
  • 注册中心: eruka / consul
  • 配置中心: config
  • 断路器: hystrix·网关:zuul
  • 分布式追踪系统: sleuth + zipkin

3.SpringCloud Alibaba

  • Spring Cloud以微服务为核心的分布式系统构建标准

分布式系统中的常见模式给了Sping Cloud一个清浙的定位,即"模式",也就是说 Sping Cloud是针对分布式系统开发所做的通用抽象,是标准摸式的实现。

这个定义非常抽象,看完之后并不能知E道Sping Cloud具体包含什么内容。

再来看一下 Spring官方给出的一个High Light的架构图,就可以对这套模式有更清晰的认识:
在这里插入图片描述
可以看到这个图中间就是各个 Micvsevce,也就是我们的这个微服务的实现,周边周围的话就是去国绦这个微服务来去做各种辅助的信息事情。

我们如分布式追踪、服务注册、配置服务等,都络微服务运行时所依硕的必不可少的的支持性功能。

我们可以得出这样一个结论: Spring Cloud是以微服务为核心的分布式系统的一个构建标准。

2、SpringCloud Alibaba介绍

Sping Cou Aliaba致力于提供微服务开发的一站式解决方案。此项目包含开发微服务架构的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发微服务架构。

依托Spring Clou Altaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud 应用接入阿里分布式应用解决方案,通过阿里中间件来迅速搭建分布式应用系统。

根据.Jakarta2019年的调研很告,SpingBoot拥有非常高的占比。熟悉 Jva语言的同学,应该对Sping框架都不会陌生。其倡导的依赖倒置、面向切面编程等特性已经形成了Java语言的事实标准,几乎所有三
方框架都会提供对Spring框架的支持。

Spring Based Framework 已经成为Java语言下的事实标准Architectures for implementing Java systems in the cloud:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Spring Based Framework已经成为Java语言下的事实标准
  • 也是构建微服务的首选框架

3、SpringCloud Alibaba定位

既然说 Sping Cloud是标准,那么自然少不了针对标准的实现。这里,为大家介绍下Spring Cloud Aibab a这套实现。先给出下面这张图帮助大家理解Sping Cloud Alitaba的定位:
在这里插入图片描述
这里给大家这么一个公式,这个叫做:“3 加 2”。
3 指的就是图中深色的部分,其实它就是 Spring Cloud 标准,一共有 3 层。中间颜色最深的部分就是及整个微服务最核心的内容,包括了“ RPC 调用”以及“服务注册与发现”。第二层,也就是围绕着核心的这一圈,是一些辅助微服务更好的工作功能,包括了负载均衡、路由、网关、断路器,还有就是追踪等等这些内容。再外层的话,主要是一些分布式云环境里通用能力。

“3 加 2”中的“2”,指的就是上图中最外面这一圈。这一部分就是这个我们 Spring Cloud Alibaba 的一个定义,它其实包含两个部分的内容:

右上部分是对于 Spring Cloud 标准的实现。

例如,我们通过 Dubbo 实现了 RPC 调用功能,通过 Nacos 实现了“服务注册与发现”、“分布式配
置”,通过 Sentinel 实现了断路器等等,这里就不一一列举了。

左下部分是我们 Spring Cloud Alibaba 对阿里云各种服务的集成。可能很多同学会有这样的一个问题:为什么要加上这一部分呢?此时回头审视一下 Spring Cloud ,它仅仅是一个微服务的一个框架。但是在实际生产过程中,单独使用微服务框架其实并不足以支撑我们去构建一个完整的系统。

所以这部分是用阿里帮助开发者完成微服务以外的云产品集成的功能。

这里可能会很多同学会有这么一个担心:是不是使用了 Spring Cloud Alibaba,就会被阿里云平台绑定呢?在此,我们明确的告诉大家,这是不会的。

为什么这么说呢?如上面说的,“3 加 2”中的 2 是被分为两个部分的。其中对 Spring Cloud 的实现是完全独立的,开发者可以只是用这部分实现运行在任何云平台中。

当然,另一部分,由于天然是对阿里云服务的集成,这部分是和平台相关的。这里给开发者充分的自由,选择只是用其中的部分还是全部产品。

当然,我们也非常欢迎开发者选择使用阿里云的全套服务,我们也会尽量保证使用整套产品时的连贯性与开发的便利性。

4、SpringCloud 各套实现对比

Spring Cloud 作为一套标准,它的实现肯定不止一套,那么各套实现都有什么区别呢?我们来一起看一下下面这张图:
在这里插入图片描述
可以发现Spring Cloud Alibaba是所有的实现方案中功能最齐全的。尤其是在Netlix停止更新了以后,Spring Cloud Alibaba依然在持续更新和迭代。
在这里插入图片描述
在这里插入图片描述
从18年7月份Sning Cloud Aitaba 正式提交代码开始,就得到了大家广泛的关注。截止今天,Spring Coud Alitaba一共获得了超过了15万的 sta 数,已经的领先于所有其他实现的总和根据今年X-lab开放实验室刚刚发布的《2020年微服务领域开源数字化报告》,Spring Cloud Alibaba已经成为最活跃Spring Cloud实现。

在这里插入图片描述
数据来源《2020年微服务领域开源数字化报告》,公众号后台回复关键词“微服务报告"获取报告全文。

5、SpringCloud 各套实现对比

可以看到除了围绕着 Spring Cloud 的标准实现以外,还有包括的数据、资源、消息、缓存等各种类型的服务。在不同类型的服务下,也有很多具体的产品可供用户选择。
在这里插入图片描述
这里罗列典型而非全部产品。更多的内容,可以参考阿里云官网

6、Spring Cloud Alibaba 用户数

截止到今天,Spring Cloud Alibaba 获得了数超过 1.5w 的 star 数。

同时在 Github 上的项目依赖,就是对 Spring Cloud Alibaba 产生依赖关系的产品,也超过了 6000。

最重要的,使用 Spring Cloud Alibaba 的公司超过 1000 家。当然不只是外部的公司在使用,阿里内部也在使用。

经过了双十一的洗礼,其实整个这套框架它的这个稳定性可靠性都得到了印证。
在这里插入图片描述

二、基本分布式架构搭建

1、基于SpringBoot的父maven项目

在这里插入图片描述
在这里插入图片描述
删除对应的src
在这里插入图片描述

2、创建订单项目模块

在这里插入图片描述
在这里插入图片描述

  • 创建订单项目
    在这里插入图片描述
    在这里插入图片描述
    完善依赖
    在这里插入图片描述

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在这里插入图片描述

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在这里插入图片描述
在这里插入图片描述

package com.itbluebox.order.controller;

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

@RestController
@RequestMapping("/order")
public class OrderController {

    @RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        return "Hello world";
    }

}

3、创建库存服务模块

在这里插入图片描述
在这里插入图片描述

@RestController
@RequestMapping("/stock")
public class StockController {
    @RequestMapping("/reduct")
    public String reduct(){
        System.out.println("扣减库存");
        return "扣减库存";
    }
}

4、创建订单项目模块的启动类

在这里插入图片描述
在这里插入图片描述

@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }
}

5、创建库存项目模块的启动类

在这里插入图片描述
在这里插入图片描述

6、完善项目配置文件

在这里插入图片描述

server:
  port: 8011

在这里插入图片描述

server:
  port: 8010

7、启动项目

在这里插入图片描述
IDEA 打开Run Dashboard
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
浏览器访问:http://localhost:8010/order/add
在这里插入图片描述

三、SpringCloud Alibaba环境搭建

1、SpringCloud Alibaba 依赖 Java 环境来运行。还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit JDK 1.8+;下载 & 配置。 1.8.0_131
  2. Maven 3.2.x+;下载 & 配置。 3.6.1
    浏览器打开下面的接口
    https://start.spring.io/actuator/info
    在这里插入图片描述
    我们可以看到不同的SpringBoot版本对应的版本是多少

我们打开github的spring-cloud-alibaba
https://github.com/alibaba/spring-cloud-alibaba
在这里插入图片描述

在这里插入图片描述
现在我们要确认一下SpringBoot的版本

Spring Cloud Alibaba:Spring Cloud Alibaba 2.2.5.RELEASE
Spring Boot:Spring Boot 2.3.2.RELEASE
Spring Cloud:Hoxton.SR8

2、完善项目的版本

在这里插入图片描述

<?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>
    <modules>
        <module>order</module>
        <module>stock</module>
    </modules>

    <groupId>com.itbluebox.springcloud</groupId>
    <artifactId>springcloudalibaba</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloudalibaba</name>
    <description>springcloudalibaba</description>
    <packaging>pom</packaging>

    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version>
        <spring.boot.version>2.3.11.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR8</spring.cloud.version>
    </properties>

    <dependencies>
        <!--SpringBoot基本场景启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--SpringBoot 测试的场景启动-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <!--Spring Cloud alibaba的版本管理, 通过dependency完成继承-->
        <dependencies>
            <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>
            <!--SpringBoot的版本管理-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--Spring Cloud的版本管理-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、通过阿里云的脚手架快速搭建项目(尝试)

https://start.aliyun.com/bootstrap.html
在这里插入图片描述
直接在上述的页面当中选择对应内容就可以快速创建对应的内容
也可以通过IDEA集成的方式使用
在这里插入图片描述
输入以下内容
https://start.aliyun.com/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
项目创建成功
在这里插入图片描述

四、Alibaba微服务组件Nacos注册中心

1、什么是Nacos

官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。
在这里插入图片描述
官网:https://nacos.io/zh-cn/index.html
集 注册中心+配置中心+服务管理 平台

Nacos的关键特性包括:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

2、Nacos注册中心

1)注册中心演变及其设计思想

在这里插入图片描述

2)核心功能

Nacos Discovery官网
在这里插入图片描述
在这里插入图片描述

服务注册发现:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。

Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。

服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。

默认5s发送一次心跳。

服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。

leader raft

服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存服务

健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)

主流的注册中心
CAP C 一致性 A可用性 P 分区容错性
在这里插入图片描述

3、Nacos Server部署和启动

下载源码编译
源码下载地址: https://github.com/alibaba/nacos/可以用

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
下载解压,因为在本地环境所以需要设置启动模式为但是,因为默认启动模式是集群

修改\nacos\bin下的startup.cmd
在这里插入图片描述

set MODE="standalone"

查看\nacos\conf\application.properties
这里是配置访问地址和端口号
在这里插入图片描述
这里是在集群环境下需要配置持久化存储mysql的地址
在这里插入图片描述
默认情况下,使用的是内存作为存储的

双击启动
在这里插入图片描述
启动成功
在这里插入图片描述
访问Nacos
http://192.168.1.5:8848/nacos/index.html
在这里插入图片描述
用户名:nacos
密码:nacos
在这里插入图片描述

4、搭建Nacos-client服务

1)创建Nacos客户端

复制order和stock
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改并完善对应的pom文件
在这里插入图片描述

<artifactId>order-nacos</artifactId>

在这里插入图片描述

<module>order</module>
        <module>order-nacos</module>
        <module>stock</module>
        <module>stock-nacos</module>

刷新一下maven
在这里插入图片描述
颜色变了添加成功
在这里插入图片描述

2)添加nacos服务注册发现的依赖

在这里插入图片描述

<!--nacos服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

在这里插入图片描述

<!--nacos服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
3)设置上述对应的application.yml

在这里插入图片描述

server:
  port: 8020
  # 应用名称 (nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

在这里插入图片描述

server:
  port: 8021
  # 应用名称 (nacos会将该名称当做服务名称) stock-nacos
spring:
  application:
    name: stock-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
4)配置nacos客户端相关内容

在这里插入图片描述
@EnableDiscoveryClient可以加也可以不加

package com.itbluebox.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
//@EnableDiscoveryClient
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }
}

5)启动对应刚刚添加的两个客户端

在这里插入图片描述
打开nacos的服务列表
在这里插入图片描述
查看到两个服务被注册
在这里插入图片描述
点击详情可以查看到对应的状态
在这里插入图片描述
我们将stock服务停止
在这里插入图片描述
在这里插入图片描述
服务列表当中的stock也就停止了
在这里插入图片描述
在这里插入图片描述
20秒以后
在这里插入图片描述

5、在order-nacos当中通过服务名称调用stock-nacos

在这里插入图片描述

@RequestMapping("/add")
    public String add(){
        System.out.println("下单成功");
        String msg = restTemplate.getForObject("http://stock-service/stock/reduct", String.class);
        return "Hello world"+msg;
    }

我们重新启动运行两个项目
在这里插入图片描述
在这里插入图片描述
http://localhost:8020/order/add
在这里插入图片描述
抛出异常(我们没有添加负载均衡器)
在这里插入图片描述
需要添加负载均衡器的注解
在这里插入图片描述

 @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }

再次访问:http://localhost:8020/order/add
在这里插入图片描述

6、演示nacos的负载均衡

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


@RestController
@RequestMapping("/stock")
public class StockController {

    @Value("${server.port}")
    String port;

    @RequestMapping("/reduct")
    public String reduct(){
        System.out.println("扣减库存");
        return "扣减库存:"+port;
    }

}

在这里插入图片描述

server:
  port: 8022
  # 应用名称 (nacos会将该名称当做服务名称) stock-nacos
spring:
  application:
    name: stock-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

在这里插入图片描述
现在启动了两个Stock
在这里插入图片描述
我们访问:http://localhost:8020/order/add
在这里插入图片描述
刷新页面
在这里插入图片描述
上述每次刷新页面返回的结果都是不一样的,实现了负载均衡

7、yml的其他配置项

在这里插入图片描述
在这里插入图片描述

server:
  port: 8022
  # 应用名称 (nacos会将该名称当做服务名称) stock-nacos
spring:
  application:
    name: stock-service
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      discovery:
        username: nacos
        password: nacos
        # namespace: public # 相同特征的服务进行归类分组管理
        #ephemeral: true  #永久实例  默认=true(临时实例)当服务宕机 超过心跳 就会将服务剔除掉
        #ephemeral: false 永久实例当前实例即使挂掉,也依旧存在该实例,不会在20-30秒以后挂掉
        #service:默认读取${spring.application.name},也可以通过该选项配置
        #group:默认 DEFAULT_GROUP 更细的相同特征的服务进行归类分组管理
        #weight:通常要结合 安装 权重的负载均衡策略,权重越高分配的流量越大
        #metadata : version = 1 #可以结合元数据做扩展

五、Nacos管理界面详细介绍

1、新建命名空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
服务列表可以进行分割管理
在这里插入图片描述
我们在对应的配置文件当中就可以设置不同的命名空间
在这里插入图片描述

在 Nacos 中,命名空间(Namespace)是一个逻辑上的隔离单位,它将服务和配置信息划分为不同的组。不同命名空间之间具有完全的隔离性,每个命名空间都拥有自己的服务注册表、配置数据和访问权限。

通过将服务和配置信息划分到不同的命名空间中,可以实现以下几个作用:

1、逻辑隔离:不同命名空间之间的服务和配置信息相互隔离,可以将不同业务领域、不同环境(如开发、测试、生产)的服务和配置进行有效分离。这样可以确保不同命名空间中的服务不会相互干扰,提高系统的稳定性和安全性。

2、权限控制:每个命名空间可以配置自己的访问权限,只有具有相应权限的用户或服务可以访问该命名空间中的服务和配置信息。这样可以实现对不同团队或不同角色的访问进行精细化的控制,提高系统的安全性。

3、灰度发布:通过在不同命名空间中部署不同版本的服务,可以实现灰度发布的功能。例如,可以将新版本的服务部署到一个命名空间中进行测试和验证,待验证通过后再将其发布到其他命名空间中,逐步推广到整个系统。这样可以有效降低发布新版本的风险,提高系统的可靠性和稳定性。

2、服务列表当中创建不同的服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除对应的内容
在这里插入图片描述
在这里插入图片描述
**填写服务信息:**在创建服务的界面,填写以下必要的信息:

1、服务名(Service Name):为服务指定一个唯一的名称。
2、集群名称(Cluster Name):指定服务所属的集群名称,通常使用默认值即可。
3、IP 地址(IP):填写服务的 IP 地址。
4、端口(Port):填写服务的端口号。
5、命名空间(Namespace):选择服务所属的命名空间。
6、健康检查地址(Health Check URL):填写服务的健康检查地址,用于检查服务的健康状态。
可以根据需要,填写其他可选信息,如权重、元数据等。

**保存服务:**填写完服务信息后,点击 “保存” 按钮,完成服务的创建。

创建服务后,它将显示在服务列表中,并可通过 Nacos 进行服务的注册和发现。

你可以在服务列表页面对服务进行管理,如编辑服务信息、删除服务、查看服务的实例列表等。

3、查看详情

在这里插入图片描述
在这里插入图片描述
1、服务名(Service Name):服务名是在 Nacos 中唯一标识服务的名称。它用于在服务列表中区分不同的服务,使其能够被其他服务或客户端进行服务注册和发现。

2、分组(Group):分组是对服务进行逻辑上的分类和组织。通过将服务划分到不同的分组中,可以更好地管理和组织服务,使其更易于查找和维护。在 Nacos 中,分组的设置可以帮助实现服务的逻辑隔离和权限控制。(命名空间是比分组更大的分类方式,分组更加细的分类方式)

3、保护阈值(Protect Threshold):保护阈值是与服务实例相关的保护机制。当服务实例的健康状态或可用性低于保护阈值时,Nacos 将不会将请求路由到该实例。这是为了保护系统的稳定性,避免将请求发送到不健康或不可用的服务实例,从而减少系统故障的风险。(雪崩保护)
雪崩保护:
在这里插入图片描述
在这里插入图片描述
重新启动两个Stock

  • 保护阈值 设置 0-1之间的值,例如可以设置0.5

  • 临时阈值 spring.cloud.nacos.discovery.ephemeral: false,当服务宕机了也不会从服务列表当中剔除
    在这里插入图片描述

  • 永久阈值 spring.cloud.nacos.discovery.ephemeral: true,当服务宕机了也不会从服务列表当中剔除
    在这里插入图片描述
    在这里插入图片描述
    这里我们强制8022端口对应的服务停止运行
    在这里插入图片描述
    对应的服务状态依旧存在。
    在这里插入图片描述
    如果设置保护阈值
    健康实例/总实例数 < 保护阈值(依旧会把不健康的服务提供给服务,预防高峰期间的并发)
    1/2 < 0.6

  • 权重:权重越大给微服务分配的权重就越大
    在这里插入图片描述
    对应设置服务下线就不会调用了
    在这里插入图片描述
    在这里插入图片描述
    启动项目
    在这里插入图片描述
    保证所有的服务都是上线并且健康状态
    在这里插入图片描述

4、元数据(Metadata):元数据是与服务实例关联的额外信息。它可以存储与实例相关的任何自定义信息,如版本号、环境标识、扩展配置等。通过元数据,可以为每个服务实例提供更多的描述性信息,帮助进行更精细化的服务管理和调度。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
访问:http://localhost:8020/order/add

在这里插入图片描述
在这里插入图片描述
我们停止运行8022端口
在这里插入图片描述
再次访问:http://localhost:8020/order/add
在这里插入图片描述
在这里插入图片描述
我们让8021下线
在这里插入图片描述
我们再次访问:http://localhost:8020/order/add
在这里插入图片描述

刷新页面
在这里插入图片描述

5、服务路由类型(Service Routing Type):根据你的提问,没有提供服务路由类型的信息。
服务路由类型是用于描述服务实例的路由策略,它决定了请求将如何被路由到不同的服务实例。
例如,随机路由将请求随机分发到可用的实例,轮询路由按照轮询顺序依次分发请求。
服务路由类型可以根据系统的需求进行配置,以实现负载均衡和流量控制等功能。

6、集群(Cluster):集群用于标识服务所属的不同实例集合。
在 Nacos 中,可以为同一个服务创建多个集群,每个集群可以包含相同或不同的服务实例。
通过将服务部署到不同的集群中,可以实现高可用性和负载均衡的策略。
在提供服务时,Nacos 可以根据集群的配置选择合适的实例进行路由。

7、元数据过滤(Metadata Filter):元数据过滤功能用于在服务列表中根据元数据进行过滤和筛选服务。通过指定特定的元数据键值对,可以仅获取包含特定元数据的服务。这对于按照自定义的标签或属性对服务进行分类、查询和选择非常有用。元数据过滤功能可以帮助用户根据实际需求快速定位和筛选出符合条件的服务。

4、订阅者列表

在这里插入图片描述
对应的两个Java的服务进程

netstat -aon|findstr "55829"

在这里插入图片描述

5、权限控制

用户管理,角色管理,权限管理
修改密码,新建用户
在这里插入图片描述

6、集群管理

节点列表
在这里插入图片描述

六、Nacos集群环境部署

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
在这里插入图片描述

1、预备环境准备

请确保是在环境中安装使用:
1、64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
2、64 bit JDK 1.8+;下载.配置。
3、Maven 3.2.x+;下载.配置。
4、3个或3个以上Nacos节点才能构成集群。

2、下载源码或者安装包

你可以通过两种方式来获取 Nacos。
从 Github 上下载源码方式
在Linux Centos7当中

cd /usr/local/
mkdir nacos
cd nacos/
wget https://github.com/alibaba/nacos/releases/download/1.4.1/nacos-server-1.4.1.tar.gz

等待下载完成

tar -zxvf nacos-server-1.4.1.tar.gz

得到
在这里插入图片描述

3、单机搭建伪集群

1)单机搭建伪集群,复制nacos安装包,修改为nacos8849,nacos8850nacos8851

mv nacos nacos8849
cp -r nacos8849 nacos8850
cp -r nacos8849 nacos8851

在这里插入图片描述

2)以nacos8849为例,进入nacos8849目录

cd nacos8849
cd conf
2.1 修改conflapplication.properties的配置,使用外置数据源要使用mysql5.7+
vim application.properties

在这里插入图片描述

#使用外置mysql数据源
spring.datasource.platform=mysql
###Count of DB:
db.num=1
###Connect URL of DB :
db.url.O=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout-1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&usesSL=false&serverTimezone=UTC
db.user.O=root
db.password . 0=root

在这里执行我们下载好的nacos包当中对应的SQL文件
在这里插入图片描述
执行nacos-mysql.sql
在这里插入图片描述

2.1 将conflcluster.conf.example改为cluster.conf、添加节点配置
cp cluster.conf.example cluster.conf

在这里插入图片描述

cd ../bin/

在这里插入图片描述

vim startup.sh

在这里插入图片描述

JAVA_OPT="${JAVA_OPT} -server -Xms521m -Xms512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

启动nacos8849

[root@localhost bin]# ./startup.sh

在这里插入图片描述

tail -f ../logs/start.out

在这里插入图片描述

3、单机搭建伪集群

cd /usr/local/nacos
cp ./nacos8849/conf/application.properties ./nacos8850/conf/application.properties
cp ./nacos8849/conf/application.properties ./nacos8851/conf/application.properties
cp ./nacos8849/conf/cluster.conf ./nacos8850/conf/cluster.conf
cp ./nacos8849/conf/cluster.conf ./nacos8851/conf/cluster.conf
cp ./nacos8849/bin/startup.sh ./nacos8850/bin/startup.sh
cp ./nacos8849/bin/startup.sh ./nacos8851/bin/startup.sh
vim ./nacos8850/conf/application.properties

在这里插入图片描述

vim ./nacos8851/conf/application.properties

在这里插入图片描述
然后分别启动8850和8851

sh ./nacos8850/bin/startup.sh
sh ./nacos8851/bin/startup.sh

分别访问对应的nacos访问,查看自己Linux订单IP地址

http://192.168.180.128:8850/nacos/index.html#/login
在这里插入图片描述
http://192.168.180.128:8851/nacos/index.html#/login
在这里插入图片描述
http://192.168.180.128:8849/nacos/index.html#/login
在这里插入图片描述

4、安装nginx

http://nginx.org/en/download.html
在这里插入图片描述
下载完上传到Linux当中

tar -zxvf nginx-1.24.0.tar.gz

在这里插入图片描述

cd /usr/local/nginx-1.24.0
./configure
make
make install
vim /usr/local/nginx/conf/nginx.conf

在这里插入图片描述

upstream nacoscluster {
	server 127.0.0.1:8850;
	server 127.0.0.1:8849;
	server 127.0.0.1:8851;
}
server {
	listen	8847;
	server_name localhost;
	
	location /nacos/ {
		proxy_pass http://nacoscluster/nacos/;
	}
}

启动nginx

cd /usr/local/nginx/sbin/
./nginx

访问:http://192.168.180.128:8847/nacos/index.html#/login
在这里插入图片描述

5、修改微服务项目当中的yml

src/main/resources/application.yml
在这里插入图片描述

server-addr: 192.168.180.128:8847

src/main/resources/application.yml
在这里插入图片描述

server-addr: 192.168.180.128:8847

安装之前的方式启动相关的微服务
在这里插入图片描述
http://192.168.180.128:8847/nacos/index.html#/serviceManagement?dataId=&group=&appName=&namespace=

在这里插入图片描述

在这里插入图片描述
https://nacos.io/zh-cn/docs/quick-start-docker.html
在这里插入图片描述

七、微服务负载均衡器Ribbon

1、什么是Ribbon

目前主流的负载方案分为以下两种:

  • 集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如F5),也有软件的(比如Nginx).。客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡。
    SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户觉的负载均工具,Ribbon客户式组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,R
    ibbon会自动基于某种规则
    (轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。

1)客户端的负载均衡

你i 如SpringCloud 中的Ribbon,客户端会有一个服务器地址列表,在发送清求前通过负载均衡算法选择一个服务器,然后进行方问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配
在这里插入图片描述

2)服务端的负载均衡

仍例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
在这里插入图片描述

3)常见的负载均衡算法

  • 随机,通过随机选择服务进行执行,一般这种方式使用较少;
  • 轮训,负载均衡默认实现方式,请求来之后排队处理;
  • 加权轮训,通过对服务器性能的分型,给高配置,低负载的服务器分配更高的权重,均衡各个服务器的压力;
  • 地址Hash,通过客户端请求的地址的HASH值取模映射进行服务器调度。ip —>hash
  • 最小链接数,即使请求均衡了,压力不一定会均衡,最小连接数法就是根据服务器的情况,比如I请求积压数等参数,将请求分配到当前压力最小的服务器上。最小活跃数

2、Nacos使用Ribbon

nacos-discovery依赖了Ribbon,可以不用再引入Ribbon依赖

3、Ribbon负载均衡策略

在这里插入图片描述
IRule
这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。
AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,就是我们上文所说的负载均衡器,负载均衡器的功能我们在上文已经说的很详细了,这里
就不再赘述,这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。

  • RandomRule
    看名字就知道,这种负载均衡策路就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象,然后在它重写的choose方法又调用了choose(LoadBalancer lb, Object key)这个重载的choose方法,在这个重载的choose方法中,每次利用random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。

  • RoundRobinRule
    RoundRobinRule这种负载均衡策略叫做线性轮询负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)函数整体逻辑是这样的:开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetNodulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No availble alive servers after 10 trie from load bal:ancer: XXXX。

  • RetryRule(在轮询的基础上进行重试)
    看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRabinRule,然后在RetryRule的choose(LoadBalancerlb,Object key)方法
    中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为nul或者已经失效,则在失效时间deadlinee之前不断的进行重试
    (重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。

  • WeightedResponseTimeRule(权重一nacos的NacosRule,Nacos还扩展了一个自己的基于配置的权重扩展)WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展,WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫
    DynamicServerlWleightTrask的定时任务,默认情况下每隔30秒会计算一次各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。

  • ClientConfigEnabledRoundRobinRule
    ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule, choose方法还是采用了RoundRobinRule的choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。

  • BestAvailableRule
    BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据(oadBalancerStats中保存
    的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。

  • ZoneAvoidanceRule(默认规则,复合判断server所在区域的性能和server的可用性选择服务器。)ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以。

  • AvaiailtyPredicate为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询(RoundRobinRule)的方式从过游结果中
    选择一个出来。

  • AvailabilityFilteringRule (先过滤掉故障实例,再选择并发较小的实例)
    过滤掉一直连接失败的被标记为crcuittriped的后端Sever,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤sever的逻辑,其实就是检查status里记录的各个Server的运行状态。

4、修改默认负载均衡策略

全局配置:调用其他微服务,一律使用指定的负载均衡算法

1)配置类

复制之前的order-nacos修改为
在这里插入图片描述
在这里插入图片描述

<artifactId>order-ribbon</artifactId>

在这里插入图片描述

     <module>order-ribbon</module>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package com.itbluebox.ribbon;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RibbonRandomRuleConfig {

    //方法名一定要叫iRule
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

在这里插入图片描述

  port: 8030

在这里插入图片描述

package com.itbluebox.order;

import com.itbluebox.ribbon.RibbonRandomRuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
//@EnableDiscoveryClient
@RibbonClients(value = {
        @RibbonClient(name = "stock-service",configuration = RibbonRandomRuleConfig.class)
})
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        RestTemplate restTemplate = builder.build();
        return restTemplate;
    }
}

在这里插入图片描述
启动order-ribbon
http://localhost:8030/order/add
在这里插入图片描述
刷新页面
在这里插入图片描述
刷新页面以后我们发现有重复的端口,因为当前模式是随机访问对应的端口,之前是轮训,现在是随机因此有同一个端口重复出现的概率
在这里插入图片描述

2)配置文件

将刚刚添加到启动类上的内容给注释掉
在这里插入图片描述
在这里插入图片描述

stock-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改对应的权重,权重越高对应的访问频率就越高
在这里插入图片描述

在这里插入图片描述
刷新页面我们发现对应22出现的概率比较高
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
流量测试
在这里插入图片描述

5、自定义负载均衡策略

1)默认调用的时候启动对应的负载均衡器

在这里插入图片描述
在这里插入图片描述

package com.itbluebox.ribbon.rule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class CustomRule extends AbstractLoadBalancerRule {

    @Override
    public Server choose(Object o) {
        //获取当前请求的服务的实例
        ILoadBalancer loadBalancer = this.getLoadBalancer();
        //获得当前请求的服务实例
        List<Server> reachableServers = loadBalancer.getReachableServers();
        int random = ThreadLocalRandom.current().nextInt(reachableServers.size());
        Server server = reachableServers.get(random);
        return server;
    }
    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }


}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    NFLoadBalancerRuleClassName: com.itbluebox.ribbon.rule.CustomRule

在这里插入图片描述
http://localhost:8030/order/add
在这里插入图片描述

2)启动的时候加载负载均衡器

当中自定义负载均衡器是在第一次调用的时候才加载对应的负载均衡器
下面我们设置为在启动的时候加载负载均衡器
在这里插入图片描述

ribbon:
  eager-load:
    # 开启ribbon饥饿加载
    enabled: true
    # 配置mall-user使用ribbon饥饿加载,多个使用逗号非分割
    clients: stock-service

八、微服务负载均衡器LoadBalancer

1、什么是SpringCloud LoadBalancer

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,用来替代Ribbon.
Spring官方提供了两种负载均衡的客户端
RestTemplate
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程
ttp服务的方法,能够大大提高客户端的编写效率。默认情况下,RestTemplate默认依赖jdk的HTTP连接工具。

WebClient
WebCient是从Sprng WVebFlox 5 O城版本开始提供的一个非阻塞的基于响应式‘期程的进行Hti请求的客户端工具。它的响应式编的基于Reaco的]。WebClenm中提供了标崔-tp请求方式对应的ge. :
ost、put、delete等方法,可以用来发起相应的请求。

2、RestTemplate整合LoadBalancer

1)引入依赖

<dependency>
	<groupId>org.springframework.cloud</ groupId>
	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--提供了RestTemplate支持-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<! -- nacos服务注册与发现移除ribbon支持-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	<exclusions>
		<exclusion>
		<groupId>org.springframework.cloud</ groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</exclusion>
	</exclusions>
</dependency>

注意: nacos-discovery中引入了ribbon,需要移除ribbon的包如果不移除,
也可以在yml中配置不使用ribbon

spring:
	application:
		name: mall-user-loadbalancer-demo
	cloud:
		nacos:
			discovery:
				server-addr: 127.0.0.1:8848
			#不使用ribbon
		loadbalancer:
			ribbon:
			enabled: false

原理:默认情况下,如果同时拥有RtbtonLcdBalancrdCin和lBlocinaLcedalancrClen,为了保韩向后兼容性,将使用RbtoL oadBalancedClen。要覆盖它,可以设置sring coud.loadcbalane.ribbon.enabled属性为false。
在这里插入图片描述

2)复制一个工程用于演示

在这里插入图片描述

在这里插入图片描述

<artifactId>order-loadbalance</artifactId>

在这里插入图片描述

 <module>order-loadbalance</module>

在这里插入图片描述

3)排除ribbon依赖,添加loadbalanncer依赖

在这里插入图片描述

<!--nacos服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <!--将ribbon排除-->
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-stater-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--添加loadbalanncer依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

在这里插入图片描述

server:
  port: 8031
  # 应用名称 (nacos会将该名称当做服务名称)
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 192.168.180.128:8847
      discovery:
        username: nacos
        password: nacos
        namespace: public
    loadbalancer:
      ribbon:
        enabled: false

在这里插入图片描述
访问:http://localhost:8031/order/add
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/684327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言督学训练营 第十四天】二叉树真题实战 ----- 层序建树、前中后序遍历、求树的WPL

文章目录 前言树概念二叉树层序建树四种遍历二叉树的方式层次遍历前序遍历中序遍历后续遍历 真题实战&#xff01; 前言 今天进行总结的是考研408有关二叉树的基础知识&#xff0c;是王道C语言督学营的第十四天&#xff0c;随着课程的深入&#xff0c;代码实战的难度慢慢的上来…

MyCat01——如何实现MySQL中的主从复制

1 问题 数据对于我们来说是一项最重要的资产&#xff0c;因为数据丢失带来的损失&#xff0c;对于一家公司来说&#xff0c;有时也是毁灭性的。 那么如何确保数据安全&#xff0c;不因断电或系统故障带来数据丢失呢&#xff1f; 当用户增加&#xff0c;对数据库的访问量也随…

推荐一款好用的时序预测工具——Alibaba DChain Forecast

前言 绝大部分行业场景&#xff0c;尤其是互联网、量化行业&#xff0c;每天都会产生大量的数据。金融领域股票价格随时间的走势&#xff1b;电商行业每日的销售额&#xff1b;旅游行业随着节假日周期变化的机票酒店价格等。我们称这种不同时间收到的&#xff0c;描述一个或多…

Ajax技术的秘密揭秘:异步传输,高效交互

文章目录 I. 什么是AjaxAjax的定义和起源Ajax与传统的Web应用程序之间的区别 II. Ajax的工作原理Ajax的基本原理Ajax如何通过异步传输实现无需刷新页面 III. Ajax的应用场景在Web应用程序中应用Ajax的优势Ajax在哪些场景中使用 IV. Ajax的组成部分和APIXHR对象FormData对象Fetc…

用postman进行web端自动化测试

目录 前言 一、抓包&#xff08;使用Charles抓包工具&#xff09; 二、选择请求方法 三、填写url地址 四、填写Header 五、填写body 六、断言&#xff08;Tests页&#xff09; 七、获取动态参数——例如token 八、设置静态参数&#xff08;请求地址、账号密码等&#x…

【Django-功能优化】存储、循环、操作选择对代码性能的影响

功能开发背景 港口货轮需要进行集装箱的装卸任务&#xff1a; 船上的每一个集装箱&#xff0c;可以用三个维度的坐标来唯一定位&#xff1a;(bay, column, layer)&#xff0c;这三个维度结合其他一些固有信息&#xff0c;构成了一个箱子的字段属性&#xff0c;存储在箱子数据表…

百度的人脸识别的技术

百度的人脸识别的技术 1.基本概念 分组&#xff1a;分组ID&#xff08;group_id&#xff09;&#xff1a;分组ID用于对一组相关的人脸进行分组和管理。你可以根据自己的需求&#xff0c;将不同的人脸数据分配到不同的分组中。例如&#xff0c; 你可以根据人员的职位、部门或其…

Nginx优化安全防盗链

1.Nginx的页面优化 1.1 Nginx的网页压缩 在Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。进行相关的配置修改&#xff0c;就能实现Nginx页面的压缩&#xff0c;达到节约带宽&#xff0c;提升用户访问速度 1.2 配置Nginx的图片缓存 当Nginx将网页数据返回给…

阿里云企业邮箱免费版、标准版、集团版和尊享版区别

阿里云企业邮箱版本分为免费版、标准版、集团版和尊享版&#xff0c;除了价格区别&#xff0c;功能方面有什么差异&#xff1f;如何选择企业邮箱版本&#xff1f;免费版0元适合初创型企业&#xff0c;标准版适合大、中、小型企业使用&#xff0c;涉及子公司之间邮箱通讯可以选择…

jQuery学习

原生实现计数器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

getopt_long 函数的使用

getopt_long 函数的使用网上已经有很多了&#xff0c;这里只是记录一下方便自己后续查找。首先函数原型声明&#xff1a; #include <getopt.h>int getopt_long(int argc, char *argv[],const char *optstring,const struct option *longopts, int *longindex); 函数是用…

Navicat使用导入向导批量插入数据到数据库

Mybatis,"可持久层数据库框架" Html,"超文本标记语言" Css,"网页外设计语言" JavaScript,"用户行为交互" Jquery,"提升网页开发效率的一种框架" Vue,"前端开发框架" Vant,"前开发预装组件库" git,"…

SM2算法对比RSA算法,有哪些优势?

SM2算法和RSA算法都是公钥密码算法&#xff0c;SM2算法是一种更先进安全的算法&#xff0c;在安全性能、速度性能等方面都优于RSA算法&#xff0c;在我国商用密码体系中被用来替换RSA算法。国家密码管理局于2010年12月17日发布了SM2算法&#xff0c;并要求现有的基于RSA算法的电…

《面试1v1》Redis基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

Golang/Python 调用 openAI 的API 详解

学习目标&#xff1a; OpenAI API介绍 学习如何通过 Golang 使用 OpenAI 的 API OpenAI 的常用的参数及其说明 了解OpenAI API 中令牌&#xff08;tokens) OpenAI API 提供了几个不同的终端点&#xff08;endpoints&#xff09;和模式&#xff08;modes&#xff09; 复杂和…

【已解决】Java 中导入excel时使用 trim() 无法去除空格的解决方法

使用trim无法去除空格的解决方法 一、问题描述二、原因分析三、解决方案方案一&#xff1a;使用正则表达式方案二&#xff1a;使用String.strip()方案三&#xff1a;使用 hutool的 StrUtil.trim()方法 四、总结 一、问题描述 在excel导入操作时&#xff0c;读取cell中的字符串…

自学Python 69 Selenium八大元素定位方法(新版BY方法)

Python Selenium八大元素定位方法(新版BY方法) 文章目录 Python Selenium八大元素定位方法(新版BY方法)前言一、常用的八种定位方法&#xff08;新旧对比&#xff09;二、查看网页元素三、八大元素定位示例1、id定位2、name定位3、class定位4、tag定位5、link定位6、partial_li…

MySQL - 第9节 - MySQL内外连接

目录 1.内连接 2.外连接 2.1.左外连接 2.2.右外连接 3.简单案例 1.内连接 • 表的连接分为内连接和外连接。 • 内连接实际上就是利用where 子句对两种表形成的笛卡儿积进行筛选&#xff0c;我们前面学习的查询都是内连接&#xff0c;也是在开发过程中使用的最多的连接查…

【C++】模板初级内容(函数模板,类模板)

文章目录 前言一、函数模板1.1 函数模板概念1.2函数模板格式1.3模板的原理&#xff1a;1.4函数模板的实例化 二、类模板2.1 类模板的定义格式2.2定义与声明分离要注意的点 前言 告诉编译器一个模子&#xff0c;让编译器根据不同的类型利用该模子来生成代码 模板分为函数模板与类…

MES系统常用的数据采集网关

随着制造业的数字化转型&#xff0c;MES&#xff08;制造执行系统&#xff09;在生产过程中的重要性日益凸显。MES系统作为连接企业资源和生产现场的桥梁&#xff0c;需要实时、准确地采集和整合工业设备的数据&#xff0c;以支持生产调度、质量管理、库存控制等关键业务。为了…