其实说完springcloud-spring和耐非的一些微服务工具集组件,一套成型的微服务系统就可以搭起来了,不过还是必须要研究研究springcloud alibaba的相关组件,很遗憾有些好组件以前都没用过,比如nacos和sentinel,这俩也是这次主要要看的。

springcloud alibaba的概念和springcloud一样,也是一套微服务的工具集,是用来解决微服务系统中的解决方案,相比于springcloud-spring和耐非,他又对一些组件进行了优化。举个栗子, 比如说nacos就既可以做服务注册中心和配置中心,而且不用写代码,阿里直接会把软件提供使用(这个软件程序本质也是springboot项目)。所以以后就会针对不同组件,使用不同公司组件从而构成目前最优、最主流的微服务系统,贴一下图:

1.PNG

新建一个springcloud alibaba父项目,引一下版本控制依赖,注意我这里一开始springcloud引的是H版本,springboot是2.2.5,因为后面遇到了一个nacos的bug所以就都升级了,版本对照关系见springcloud的官网:

https://spring.io/projects/spring-cloud#overview

 <properties>
        <!--定义版本号-->
        <spring.cloud.version>2020.0.2</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!--继承springboot父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
    </parent>

    <!--维护依赖-->
    <dependencyManagement>
        <!--维护springcloud-->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        <!--维护springcloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>

接着就可以看组件了,先看nacos:

阿里的,官方文档中文的,https://nacos.io/zh-cn/,概念:Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

总结:Nacos就是微服务架构中服务注册中心以及统一配置中心,用来替换原来的(eureka,consul)以及config组件。这节就主要说说这个组件的安装使用和一些相关细节吧。

1、安装

下载地址:https://github.com/alibaba/nacos/releases,我这里安装windows的1.4.1版,下载完到nacos/bin目录下使用以下命令来进行非集群启动(单独启动)

startup.cmd -m standalone

起来后访问http://localhost:8848/nacos/ ,用户名密码都是nacos,然后进入首页

2.PNG

2、开发nacosclient注册到nacos上

nacos的优点之一就是不用以代码方式实现服务注册中心和配置中心的server端了,那么只需要专注开发微服务然后注册到nacos上就行了,很简单,和以前一样,引依赖、写配置、加注解。

 <dependencies>

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

        <!--引入nacos client的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

    </dependencies>

#指定当前服务端口
server.port=8989
#指定服务名称 唯一 推荐大写
spring.application.name=NACOSCLIENT
#指定nacos服务地址
spring.cloud.nacos.server-addr=localhost:8848
#指定注册中心地址
spring.cloud.nacos.discovery.server-addr=${spring.cloud.nacos.server-addr}
#暴露所有web端点
management.endpoints.web.exposure.include=*
#指定向nacos server注册服务名称
spring.cloud.nacos.discovery.service=${spring.application.name}

@EnableDiscoveryClient  //开启服务注册  这个注解可以省略不写

项目启动后,发现服务就注册上了:

3.PNG

3、服务间通信调用

还是用openfeign

4、使用nacos作为配置中心

引依赖,写配置(这里写的配置是微服务到配置中心拉文件的配置内容)、加注解(在控制类里加自动刷新的注解)

我先是在nacos上建立了微服务对应的配置文件(启动参数包括获取value的参数等都在配置文件里),这步操作相当于去远程库托管,然后就是在配置中心里去个性化,这么说不恰当,其实就是对这个配置文件设置各种唯一调用凭据(分组。。),之后会说到,命名空间、Data Id、Group还有文件后缀名等都能来做区分。我这里就建了个花里胡哨的康康。

4.PNG

5.PNG

然后就是在微服务里写配置去拉取:

<!--引入配置中心依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--读取bootstrap配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

#告诉 config server地址
spring.cloud.nacos.config.server-addr=192.168.6.1:8848
#告诉从哪个命名空间获取配置
spring.cloud.nacos.config.namespace=ed97a966-dfd7-4836-abbe-d1ab79213e46
#告诉从哪个组进行配置获取
spring.cloud.nacos.config.group=qqq
#从这个组中拉取哪个配置文件
spring.cloud.nacos.config.name=whatsup-prod
#拉取这个配置哪个后缀的配置文件
spring.cloud.nacos.config.file-extension=properties

#按教程来不行,一直注入不到value,最后我把springcloud和springboot版本都升级了,然后引入了读bootstrap的依赖后才行。。。
# https://blog.csdn.net/qq_41953714/article/details/116267984

@RefreshScope   //允许远端配置修改自动刷新

都对上就可以获取nacos上配置文件内容了,给接口发个请求看看,可以看到端口和@value内容都获取到了:

6.PNG

然后修改下配置文件中内容,看下是否可以实现自动刷新,把jinlongyu改成了longyujin,再次访问接口可以发现已刷新:

7.PNG

8.PNG

有一个深坑,我昨天整了好久,那就是版本问题,一开始我用的springcloud H sr6 吧,springboot用的2.2.5,@value在启动后死活获取不到,然后把application.properties重命名成了bootstrap.properties也不行,加了读取bootstrap文件的依赖发现一直爆红,查询发现需要springboot还是springcloud高版本才会有这个依赖的写法,索性就把springcloud升级到了2020.0.2,springboot升到了2.5.0,然后可以获取到@value,问题成功解决。

5、一些配置中心的细节

在上面都简单用过,这里就直接贴概念了:

DataId:好像有两种写法,我在配置文件里写的是其中一种:name+后缀,另一种分了三段,把name还拆成了name+开发环境。

命名空间:namespace命名空间是nacos针对于企业级开发设计用来针对于不同环境的区分,比如正在企业开发时有测试环境,生产环境,等其他环境,因此为了保证不同环境配置实现隔离,提出了namespace的概念,默认在nacos中存在一个public命名空间所有配置在没有指定命名空间时都在这个命名空间中获取配置,在实际开发时可以针对于不能环境创建不同的namespace空间。默认空间不能删除!

配置分组(group):配置分组是对配置集进行分组,通过一个有意义的字符串(如 Buy 或 Trade )来表示,不同的配置分组下可以有相同的配置集(Data ID)。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。

微服务配置文件中的配置项一定要和nacos配置中心的设置对应上!

6、nacos持久化

在0.7版本之前,在单机模式时nacos使用嵌入式数据库(derby)实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,mysql可以用可视化工具,方便看,所以就持久化到mysql里了。

还是用windows装mysql,装完后只需要将nacos/config/application.properties中mysql内容修改成自己的就行(还需要自己手动建库,nacos中有sql,直接执行就插表),例如:

spring.datasource.platform=mysql
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?
    	characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
			&useUnicode=true&useSSL=false&serverTimezone=UTC
	db.user=root
	db.password=Root!Q2w

然后重启nacos,一开始啥配置内容都没有了,因为已经持久化到mysql了,以前的debry就没了,新建一个,发现相关内容已被记进数据库。

9.PNG

7、nacos高可用

集群就不做了,太吃内存,简单说下步骤:

集群解决问题:1、并发访问压力 2、单节点故障问题

linux服务器搭建nacos集群步骤:

集群部署说明,里头有nacos的集群架构图。

10.PNG

然后下个ng对这三个地址做下slb就完事了,参照我自己这篇可以整一下:SLB+nginx负载均衡宕机模拟,微服务的配置文件里写ng slb的地址即可(最好是域名)。

注:做集群的话,nacos的启动方式就要以集群方式启动了。


标题:再战SpringCloud(8)
作者:jyl
地址:http://jinyunlong.xyz/articles/2021/07/28/1627440892339.html