Spring Cloud Alibaba 扫盲

Posted 鞋破露脚尖儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Alibaba 扫盲相关的知识,希望对你有一定的参考价值。

Spring Cloud Alibaba 扫盲 

Netflix网飞公司 和 Spring Cloud 和 Spring Cloud Alibaba之间的爱恨情仇这里我们就不多BB了,今天总结一下Spring Cloud Alibaba各大组件的使用,做一个学习总结

更多详细详见官网 Go Spring Cloud Alibab

创建Maven父工程,贴入以下版本约束

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>3.0.0</version>
        </dependency>
        <!--spring boot 2.2.2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud Alibaba-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      
       <!--spring cloud Hoxton.SR1-->
        <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>Hoxton.SR1</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
      
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
            <scope>runtime</scope>
        </dependency>
        <!-- druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.spring.boot.version}</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement><build>
<pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.1.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-site-plugin</artifactId>
            <version>3.7.1</version>
        </plugin>
        <plugin>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
    </plugins>
</pluginManagement><plugins>
        <!--热部署配置, 后面没用,这个可以不用配-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
        </plugin><plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

Nacos = Eureka + Config + Bus

思想还是借鉴的Eureka的思想,大家可以当成Eureka来用,但功能只增不减

基础环境:JDK8 + Maven3.2+ (开发缺这两个环境 ?)

如果大家想在服务器上装Nacos的话,上面两个环境必须备好

Nacos windows下载安装:https://github.com/alibaba/nacos(版本随意)

下载后解压进入bin目录,双击startup.cmd即可启动服务,可以发现Nacos是Java开发的

  • 可以发现Nacos是单独部署的,而不是想Eureka、Config那样起服务

启动之后访问localhost:8848/nacos即可看到web页面

键入账号和密码,默认均为:nacos,登陆监控页面

此时一个注册中心和一个配置中心服务就算搭建成功,后面我们要使用的时候,对号入座即可

Nacos的服务注册

基于我要写完几大组件,不想参杂无关的冗余模块,所以这里我们演示一下注册中心的功能,写一个后面会用到的模块,让他注册进Nacos,后面被其他模块调用或者演示服务限流、降级、熔断等通用的服务,下面我们就创建一个支付模块:payment_8801

更多详细见官网 Go Nacos Discovery

创建一个maven项目,改pom,创yml,写入口函数,写接口,一步到位

  • 改pom

<dependencies>
    <!-- nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--监控 以json格式输出信息-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-hateoas</artifactId>
    </dependency>
</dependencies>
  • 创yml

server:
  port: 8801
spring:
  application:
    name: payment-server
  cloud:
    nacos:
      discovery:
       #配置注册中心的地址
        server-addr: localhost:8848#监控
management:
  endpoints:
    web:
      exposure:
        include: \'*\'
  • 写入口函数

@SpringBootApplication
@EnableDiscoveryClient //开启注册中心
public class PaymentApplication8801 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentApplication8801.class);
    }
}
  • 接口我们就不写了,我们这里只是演示一下注册中心

然后我们访问我们的Nacos的页面。如下所示,我们的服务已经在Nacos的服务列表上了,服务名和Eureka一样,都是默认使用项目名称

Nacos的配置中心

Config 配置中心 + Bus消息总线实现配置的实时刷新,Nacao打包一套带走

更多详细见官网 Go Nacos Config

继续创建一个Maven项目,改pom,创yml,写入口函数,写接口,一步到位

  • 改pom

<dependencies>
    <!-- SpringCloud ailibaba config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!-- SpringCloud ailibaba nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--web-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--监控 以json格式输出信息-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-hateoas</artifactId>
    </dependency>
</dependencies>
  • 创建yml

    • 这里会创建两个配置文件,bootstrap.yml 和 application.yml,这两者不做说明,大家应该懂吧

    bootstrap.yml 如下

server:
  port: 8888
​
spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848   #作为注册中心的地址
      config:
        server-addr: localhost:8848   #作为配置中心的地址
        file-extension: yaml          #指定yaml格式的配置
#监控
management:
  endpoints:
    web:
      exposure:
        include: \'*\'

application.yml配置如下

spring:
  profiles:
    active: dev  #表示拉取配置中心开发环境的配置文件

穿插一个特别说明:大家仔细看一下我配置的配置中心的属性

  • 首先配置了配置中心的地址,就是Nacos的地址

  • 然后我指定了一个读取配置文件的后缀为:yaml

  • 我选择了运行环境为dev 开发环境

就这三个配置,已经足够我去配置中心读取配置了,他是这么定位文件的呢?

  • Nacos关于自己的配置中心锁定文件有一套自己的定位方法

  • 项目名称 + “-” + 运行环境 + 后缀

  • 上面的配置中

    • 项目名称为: nacos-config

    • 运行环境我们选择的:dev

    • 指定了配置文件的后缀为:yaml (不能是yml,Nacos不能创建这个格式的文件)

  • 所以我们的配置文件应该为:nacos-config-dev.yaml

如果这里已经了解了的话,Nacos的web页面还可以配置一个命名空间和分组的功能,目的就是将各个配置文件分开来,一个命名空间有多个分组,每个分组里有多个配置文件,如果你设置了命名空间和分组,就得在上面的配置中加加两个配置,用来定位命名空间和分组的属性这个,如果我们不设置命名空间和分组,就是默认的,命名空间为public,分组为default,这个我们不用明文配置,默认读取。

一般我们在使用时,都会使用命名空间和分组,主要是隔离不同的配置,新加配置

namespace: 165e1f54-5249-521f-20d0-890d225974a  #命名空间编号,页面会显示
group: DEV_GROUP # 分组信息
  • 一般对于命名空间,我们会创建三个:开发,测试,生产,实现配置隔离

  • 而对于分组,可以把不同的微服务划分到一个组,统一管理

既然配置已经完成了,那我们就去配置中心创建一个配置文件吧

然后当然就是发布啦,发布后返回配置列表可以发现多了一个配置

配置文件就绪,读取配置就绪,下面我们就写一个接口测一测我们是否可以读取到配置文件中的数据吧,读取的就是我们刚刚配置的数据,注意那个头上的注解,他代替了Bus

@RestController
@RefreshScope  //支持nacos作为config配置中心的动态刷新,一个注解干掉Bus
public class NacosConfigController {
​
    //读取配置中心的数据
    @Value("${config.info}")
    private String info;
​
    //将配置中心读取到的配置暴露出去测试一下
    @GetMapping("/config/info")
    public String  test1(){
        return info;
    }
}

启动服务,测试我们的接口,如下所示,成功读取到了配置中心配置的属性

都到这一步了,不测测动态刷新就亏了,我们修改配置的version为2,保存后再次访问该接口,发现配置已经实现动态刷新,我们再也不需要通过Bus来打太极了

Nacos数据持久化

  • 生产环境中必配,目前只支持持久化到mysql,官方建议一主一从

  • 在Nacos中,内嵌了一个数据库derby,用作持久化数据,但是如果我们开启了多个Nacos节点,各内部的数据的一致性是不可保证的,所以集群部署的前提就是数据的一致性,而数据的一致性要求多节点使用同一个数据库。

因为我们现在是windows环境,Linux上操作一致

在我们的解压文件中下conf目录下有一个nacos-mysql.sql文件,这就是我们需要初始化数据库的建表语句,导入到mysql中,可能会有版本导致导入失败,这里各人解决

其次在conf下还有一个application.properties文件,在这里我们需要配置开启持久化数据到mysql,并配置mysql相关的连接信息,注释不用去打开,直接新增吧

spring.datasource.platform=mysql
​
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest   #更改用户名
db.password=youdontknow #更改密码
  • 数据库名要根据的数据库来定,数据库名无要求

  • 然后重启Nacos即可,发现之前的配置已经小时了,且控制台没报错就已经切换,如果还想确定是否已经切换了持久化源,可以新增一个配置,然后去数据库看数据是否已经持久化到数据库

Nacos的集群部署

在生产环境中,这种服务都是集群部署的,防止单点故障,保证高可用

讲道理,搭这个集群搞崩了我三台虚拟机,现在我本地虚拟机都还没配制好,淦

也不能怪Nacos,只能怪VMWare太脆弱,莫名其妙就崩了,后面再补上集群实操,这里就说说操着手法吧,有基础的我建议使用Docker搭建,简单方便

根据官方示意图Nacos的集群搭建需要三个Nacos + 一个nginx + 一个mysql(玩玩不用达主从),三个Nacos服务节点才能搭起集群,Nginx做最外层的访问入口和负载均衡

准备工作:

  • 三台服务器,每台3G内存,不然你就要走我的后路,内存不足,服务多的那台给4G

  • 每台服务器一个Nacos服务节点,Nginx和Mysql随便选一个节点部署

  • 三台服务器需要JDK环境 + Maven环境

  • 三台服务器均关闭防火墙,提醒一下

第一步:三台同步

  • 修改Nacos持久化源为数据库,上面已经说明过,三台统一使用一个数据库

第二步:三台同步

  • 修改conf目录下cluster.config.example 重命名为 cluster.config

  • 在其中键入参与集群的三台Nacos节点的ip:port,如下所示

  • 192.168.0.140:8848

    192.168.0.141:8848

    192.168.0.142:8848

依次启动三台服务,这其中可能会出现错误,在启动的控制台他会告诉你日志在哪,看看日志有没有抛出什么异常,目前我遇到过数据库连接不上,内存不够异常,均已修复

至于其他的异常,百度吧,后浪

第三步:配置Nginx

  • 无非就是配一个反向代理,proxy_pass upstream指向三台服务

  • 实现入口统一和负载均衡

  • 配置完,Nginx配置文件检查一把 ./nginx -t

  • 配置文件没错再重启 ./nginx -s reload

最后,访问Nginx监听的端口,成功访问Nacos的页面,搭建完成

Sentinel = Hystrix

说到Hystrix,我们就必须清清楚楚的明白什么是降级,什么是熔断,复制了一段以前学习Spring Cloud 时写的笔记,希望大家能够明白

服务熔断

  • 服务雪崩:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。

  • 雪崩效应:服务提供者因为不可用或者延迟高造成的服务调用者的请求线程阻塞,阻塞的请求会占用系统的固有线程数、IO等资源,当这样的被阻塞的线程越来越多的时候,系统瓶颈造成业务系统瘫痪崩溃,这种现象成为雪崩效应

  • 熔断机制:熔断机制是服务雪崩的一种有效解决方案,当服务消费者请求的服务提供者因为宕机或者网络延迟高等原因造成暂时不能提供服务时,采用熔断机制,当我们的请求在设定的最常等待响应阀值最大时仍然没有得到服务提供者的响应的时候,系统将通过断路器直接将吃请求链路断开,这种解决方案称为熔断机制

服务降级<

以上是关于Spring Cloud Alibaba 扫盲的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud alibaba gateway  nacos  503错误代码

Spring Cloud Alibaba环境搭建

几行代码就可以使用分布式配置中心,Spring Cloud Alibaba真香

Spring Cloud Alibaba全家桶——Spring Cloud Alibaba介绍

艿艿的 Spring Cloud Alibaba!开整~

Spring Cloud Alibaba系列教程——Spring Cloud Alibaba开篇