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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】 跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】 跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】 跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】 跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】 跳转

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服务器上。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第1张图片

2)垂直应用架构

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

  • 电商系统(用户管理商品管理订单管理)
  • 后台系统(用户管理订单管理客户管理)
  • CMS系统(广告管理营销管理)
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第2张图片

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

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

缺点:

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

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

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

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

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第3张图片

4)SOA架构

在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture)是关健。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第4张图片
优点:

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

缺点:

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

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

优点:

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

缺点:

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

他说微服务其实是一种架构风格,我们在开发一个应用的时候这个应用应该是由一组小型服务组成,每个小型服务都运行在自己的进程内;小服务之间通过HTP的方式进行互联互通。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第6张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第7张图片
微服务架构常见的问题

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

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

对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一
个问题提供了相应的组件来解决它们。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第8张图片

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的架构图,就可以对这套模式有更清晰的认识:
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第9张图片
可以看到这个图中间就是各个 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:

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第10张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第11张图片
在这里插入图片描述

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

3、SpringCloud Alibaba定位

既然说 Sping Cloud是标准,那么自然少不了针对标准的实现。这里,为大家介绍下Spring Cloud Aibab a这套实现。先给出下面这张图帮助大家理解Sping Cloud Alitaba的定位:
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第12张图片
这里给大家这么一个公式,这个叫做:“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 作为一套标准,它的实现肯定不止一套,那么各套实现都有什么区别呢?我们来一起看一下下面这张图:
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第13张图片
可以发现Spring Cloud Alibaba是所有的实现方案中功能最齐全的。尤其是在Netlix停止更新了以后,Spring Cloud Alibaba依然在持续更新和迭代。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第14张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第15张图片
从18年7月份Sning Cloud Aitaba 正式提交代码开始,就得到了大家广泛的关注。截止今天,Spring Coud Alitaba一共获得了超过了15万的 sta 数,已经的领先于所有其他实现的总和根据今年X-lab开放实验室刚刚发布的《2020年微服务领域开源数字化报告》,Spring Cloud Alibaba已经成为最活跃Spring Cloud实现。

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第16张图片
数据来源《2020年微服务领域开源数字化报告》,公众号后台回复关键词“微服务报告"获取报告全文。

5、SpringCloud 各套实现对比

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

6、Spring Cloud Alibaba 用户数

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

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

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

经过了双十一的洗礼,其实整个这套框架它的这个稳定性可靠性都得到了印证。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第17张图片

二、基本分布式架构搭建

1、基于SpringBoot的父maven项目

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第18张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第19张图片
删除对应的src
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第20张图片

2、创建订单项目模块

在这里插入图片描述
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第21张图片

  • 创建订单项目
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第22张图片
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第23张图片
    完善依赖
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第24张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第25张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第26张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第27张图片

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、创建库存服务模块

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第28张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第29张图片

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

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第30张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第31张图片

@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、创建库存项目模块的启动类

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第32张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第33张图片

6、完善项目配置文件

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第34张图片

server:
  port: 8011

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第35张图片

server:
  port: 8010

7、启动项目

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第36张图片
IDEA 打开Run Dashboard
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第37张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第38张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第39张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第40张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第41张图片
浏览器访问:http://localhost:8010/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第42张图片

三、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
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第43张图片
    我们可以看到不同的SpringBoot版本对应的版本是多少

我们打开github的spring-cloud-alibaba
https://github.com/alibaba/spring-cloud-alibaba
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第44张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第45张图片
现在我们要确认一下SpringBoot的版本

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

2、完善项目的版本

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第46张图片


<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.0modelVersion>
    <modules>
        <module>ordermodule>
        <module>stockmodule>
    modules>

    <groupId>com.itbluebox.springcloudgroupId>
    <artifactId>springcloudalibabaartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>springcloudalibabaname>
    <description>springcloudalibabadescription>
    <packaging>pompackaging>

    <properties>
        <java.version>1.8java.version>
        <spring.cloud.alibaba.version>2.2.5.RELEASEspring.cloud.alibaba.version>
        <spring.boot.version>2.3.11.RELEASEspring.boot.version>
        <spring.cloud.version>Hoxton.SR8spring.cloud.version>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring.cloud.alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-parentartifactId>
                <version>${spring.boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

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

project>

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

https://start.aliyun.com/bootstrap.html
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第47张图片
直接在上述的页面当中选择对应内容就可以快速创建对应的内容
也可以通过IDEA集成的方式使用
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第48张图片
输入以下内容
https://start.aliyun.com/
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第49张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第50张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第51张图片
项目创建成功
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第52张图片

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

1、什么是Nacos

官方:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第53张图片
官网:https://nacos.io/zh-cn/index.html
集 注册中心+配置中心+服务管理 平台

Nacos的关键特性包括:

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

2、Nacos注册中心

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第54张图片

2)核心功能

Nacos Discovery官网
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第55张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第56张图片

服务注册发现: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 分区容错性
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第57张图片

3、Nacos Server部署和启动

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第58张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第59张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第60张图片
下载解压,因为在本地环境所以需要设置启动模式为但是,因为默认启动模式是集群

修改\nacos\bin下的startup.cmd
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第61张图片

set MODE="standalone"

查看\nacos\conf\application.properties
这里是配置访问地址和端口号
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第62张图片
这里是在集群环境下需要配置持久化存储mysql的地址
在这里插入图片描述
默认情况下,使用的是内存作为存储的

双击启动
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第63张图片
启动成功
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第64张图片
访问Nacos
http://192.168.1.5:8848/nacos/index.html
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第65张图片
用户名:nacos
密码:nacos
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第66张图片

4、搭建Nacos-client服务

1)创建Nacos客户端

复制order和stock
在这里插入图片描述
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第67张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第68张图片
修改并完善对应的pom文件
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第69张图片

<artifactId>order-nacosartifactId>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第70张图片

<module>ordermodule>
        <module>order-nacosmodule>
        <module>stockmodule>
        <module>stock-nacosmodule>

刷新一下maven
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第71张图片
颜色变了添加成功
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第72张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第73张图片


        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第74张图片


        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
3)设置上述对应的application.yml

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第75张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第76张图片

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客户端相关内容

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第77张图片
@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)启动对应刚刚添加的两个客户端

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第78张图片
打开nacos的服务列表
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第79张图片
查看到两个服务被注册
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第80张图片
点击详情可以查看到对应的状态
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第81张图片
我们将stock服务停止
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第82张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第83张图片
服务列表当中的stock也就停止了
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第84张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第85张图片
20秒以后
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第86张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第87张图片

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

我们重新启动运行两个项目
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第88张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第89张图片
http://localhost:8020/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第90张图片
抛出异常(我们没有添加负载均衡器)
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第91张图片
需要添加负载均衡器的注解
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第92张图片

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

再次访问:http://localhost:8020/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第93张图片

6、演示nacos的负载均衡

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第94张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第95张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第96张图片


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

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

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

}

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第97张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第98张图片
现在启动了两个Stock
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第99张图片
我们访问:http://localhost:8020/order/add
在这里插入图片描述
刷新页面
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第100张图片
上述每次刷新页面返回的结果都是不一样的,实现了负载均衡

7、yml的其他配置项

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第101张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第102张图片

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、新建命名空间

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第103张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第104张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第105张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第106张图片
服务列表可以进行分割管理
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第107张图片
我们在对应的配置文件当中就可以设置不同的命名空间
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第108张图片

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

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

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

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

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

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第109张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第110张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第111张图片
删除对应的内容
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第112张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第113张图片
**填写服务信息:**在创建服务的界面,填写以下必要的信息:

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

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

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

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

3、查看详情

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第114张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第115张图片
1、服务名(Service Name):服务名是在 Nacos 中唯一标识服务的名称。它用于在服务列表中区分不同的服务,使其能够被其他服务或客户端进行服务注册和发现。

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

3、保护阈值(Protect Threshold):保护阈值是与服务实例相关的保护机制。当服务实例的健康状态或可用性低于保护阈值时,Nacos 将不会将请求路由到该实例。这是为了保护系统的稳定性,避免将请求发送到不健康或不可用的服务实例,从而减少系统故障的风险。(雪崩保护)
雪崩保护:
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第116张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第117张图片
重新启动两个Stock

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

  • 临时阈值 spring.cloud.nacos.discovery.ephemeral: false,当服务宕机了也不会从服务列表当中剔除
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第118张图片

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

  • 权重:权重越大给微服务分配的权重就越大
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第122张图片
    对应设置服务下线就不会调用了
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第123张图片
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第124张图片
    启动项目
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第125张图片
    保证所有的服务都是上线并且健康状态
    Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第126张图片

4、元数据(Metadata):元数据是与服务实例关联的额外信息。它可以存储与实例相关的任何自定义信息,如版本号、环境标识、扩展配置等。通过元数据,可以为每个服务实例提供更多的描述性信息,帮助进行更精细化的服务管理和调度。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第127张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第128张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第129张图片
访问:http://localhost:8020/order/add

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第130张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第131张图片
我们停止运行8022端口
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第132张图片
再次访问:http://localhost:8020/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第133张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第134张图片
我们让8021下线
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第135张图片
我们再次访问:http://localhost:8020/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第136张图片

刷新页面
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第137张图片

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

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

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

4、订阅者列表

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第138张图片
对应的两个Java的服务进程

netstat -aon|findstr "55829"

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第139张图片

5、权限控制

用户管理,角色管理,权限管理
修改密码,新建用户
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第140张图片

6、集群管理

节点列表
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第141张图片

六、Nacos集群环境部署

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第142张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第143张图片

#使用外置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文件
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第144张图片
执行nacos-mysql.sql
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第145张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第146张图片

cd ../bin/

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第147张图片

vim startup.sh

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第148张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第149张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第150张图片

vim ./nacos8851/conf/application.properties

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第151张图片
然后分别启动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
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第152张图片
http://192.168.180.128:8851/nacos/index.html#/login
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第153张图片
http://192.168.180.128:8849/nacos/index.html#/login
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第154张图片

4、安装nginx

http://nginx.org/en/download.html
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第155张图片
下载完上传到Linux当中

tar -zxvf nginx-1.24.0.tar.gz

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第156张图片

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
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第157张图片

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

src/main/resources/application.yml
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第158张图片

server-addr: 192.168.180.128:8847

src/main/resources/application.yml
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第159张图片

server-addr: 192.168.180.128:8847

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第160张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第161张图片
https://nacos.io/zh-cn/docs/quick-start-docker.html
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第162张图片

七、微服务负载均衡器Ribbon

1、什么是Ribbon

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

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

你i 如SpringCloud 中的Ribbon,客户端会有一个服务器地址列表,在发送清求前通过负载均衡算法选择一个服务器,然后进行方问,这是客户端负载均衡;即在客户端就进行负载均衡算法分配
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第163张图片

2)服务端的负载均衡

仍例如Nginx,通过Nginx进行负载均衡,先发送请求,然后通过负载均衡算法,在多个服务器之间选择一个进行访问;即在服务器端再进行负载均衡算法分配。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第164张图片

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

2、Nacos使用Ribbon

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

3、Ribbon负载均衡策略

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第165张图片
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修改为
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第166张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第167张图片

order-ribbon</artifactId>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第168张图片

     order-ribbon</module>

在这里插入图片描述
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第169张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第170张图片

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();
    }
}

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第171张图片

  port: 8030

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第172张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第173张图片
启动order-ribbon
http://localhost:8030/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第174张图片
刷新页面
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第175张图片
刷新页面以后我们发现有重复的端口,因为当前模式是随机访问对应的端口,之前是轮训,现在是随机因此有同一个端口重复出现的概率
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第176张图片

2)配置文件

将刚刚添加到启动类上的内容给注释掉
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第177张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第178张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第179张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第180张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第181张图片
修改对应的权重,权重越高对应的访问频率就越高
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第182张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第183张图片
刷新页面我们发现对应22出现的概率比较高
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第184张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第185张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第186张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第187张图片
流量测试
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第188张图片

5、自定义负载均衡策略

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第189张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第190张图片

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

    }


}

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第191张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第192张图片
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第193张图片

    NFLoadBalancerRuleClassName: com.itbluebox.ribbon.rule.CustomRule

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第194张图片
http://localhost:8030/order/add
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第195张图片

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

当中自定义负载均衡器是在第一次调用的时候才加载对应的负载均衡器
下面我们设置为在启动的时候加载负载均衡器
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第196张图片

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
	<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>

<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-webartifactId>
dependency>
<! -- nacos服务注册与发现移除ribbon支持-->
<dependency>
	<groupId>com.alibaba.cloudgroupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
	<exclusions>
		<exclusion>
		<groupId>org.springframework.cloud
			<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
		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。
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第197张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第198张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第199张图片

<artifactId>order-loadbalanceartifactId>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第200张图片

 order-loadbalance</module>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第201张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第202张图片


        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <exclusions>
                
                <exclusion>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-stater-netflix-ribbonartifactId>
                exclusion>
            exclusions>
        dependency>


        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第203张图片

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第204张图片
访问:http://localhost:8031/order/add
在这里插入图片描述
Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】_第205张图片

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】 跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】 跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】 跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】 跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】 跳转

你可能感兴趣的:(Java,java,spring,cloud,开发语言)