SpringCloud Alibaba,Nacos

零、SpringCloudAlibaba简介

Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

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

作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:
在这里插入图片描述

各个组件:
在这里插入图片描述
阿里开源组件

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。

一、 Nacos概述

官方地址:https://nacos.io/zh-cn/

github地址:https://github.com/alibaba/nacos

1.1 什么是Nacos

Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

1.2 为什么用Nacos

常见的注册中心:

  1. Eureka(原生,2.0遇到性能瓶颈,停止维护)
  2. Zookeeper(支持,专业的独立产品。例如:dubbo)
  3. Consul(原生,GO语言开发)
  4. Nacos

相对于 Spring Cloud Eureka 来说,Nacos 更强大。

Nacos = Spring Cloud Eureka + Spring Cloud Config

Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

1.3 Nacos可以干什么

Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。

Nacos主要提供以下四大功能:

  1. 服务发现和服务健康监测
  2. 动态配置服务
  3. 动态DNS服务
  4. 服务及其元数据管理

二、Nacos快速开始

2.1. 下载及安装

你可以通过源码和发行包两种方式来获取 Nacos。

您可以从 https://github.com/alibaba/nacos/releases 下载 nacos-server-$version.zip 包。

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin

2.2. 启动nacos服务

  • Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

	sh startup.sh -m standalone
  • Windows

启动命令:

startup.cmd -m standalone

或者双击startup.cmd运行文件。(可能报异常 建议执行命令)

之后访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
在这里插入图片描述
出现naocs不能正常使用解决办法:

检测nacos状态:http://localhost:8848/nacos/v1/ns/instance

如果提示:server is DOWN now, please try again later!

解决办法:(1)、停止naocos (2)、删除naocs安装程序,data目录下的protocol文件夹,重启服务即可

2.3. 注册中心

创建生产者和消费者客户端去连接注册中心(实质上没有生产者与消费者,都是一个个对等的微服务)。

  • 生产者注册到nacos

依赖:

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.9.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.dong</groupId>
	<artifactId>nacos-provider</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>nacos-provider</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>

		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>

		<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>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Hoxton.SR2</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>com.alibaba.cloud</groupId>
				<artifactId>spring-cloud-alibaba-dependencies</artifactId>
				<version>2.2.0.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

配置文件application.yml

server:
  port: 8001
spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#myName: hello nacos  # 云端与本地冲突时,会优先加载云端的配置

然后在主启动类中添加@EnableDiscoveryClient注解。

  • 消费者注册到nacos

消费者注册到nacos跟生产者差不多,也分3步:

  1. 添加依赖:同生产者

  2. 在application.yml中配置nacos的服务名及服务地址:同生产者。

  3. 在引导类(NacosConsumerApplication.java)中添加@EnableDiscoveryClient注解:同生产者

这里消费者端口配置的是9001,然后远程调用生产者
在这里插入图片描述

三、 配置中心

在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。

如果微服务架构中没有使用统一配置中心时,所存在的问题:

  • 配置文件分散在各个项目里,不方便维护。比如redis地址变更之后,需要去各个服务中修改Redis地址

  • 配置内容安全与权限

  • 更新配置后,项目需要重启

nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。

3.1 macos中心,创建统一配置

在这里插入图片描述

dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
1、 prefix 默认为所属工程配置spring.application.name 的值(即:nacos-provider),也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
2、 spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}/
3、 file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

Group:指定分组

配置内容:指定配置中的值,然后可以从本地项目中拉取值。实现配置信息集中管理,比如注册中心地址,redis链接地址等等。


3.2 从配置中心读取配置

  1. 引入依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. bootstrap.yml 中配置 Nacos server 的地址和应用名
spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848       
  application:
    name: provider

这里没有指定配置中心的配置文件,那么默认加载的是与spring.application.name名称一样的配置

  1. controller层中注入配置中心的值
    可以通过 Spring Cloud 原生注解 @RefreshScope 实现配置值自动更新:

@RestController
@RefreshScope// 注册中心修改值后,这里能马上刷新到
public class ProviderController {

    @Value("${myName}")
    private String msg;

    @GetMapping("/hello")
    public String hi() {
        return msg + "<br>" + redisUrl + "<br>" + jdbcUrl;
    }
}

在这里插入图片描述
在注册中心修改值后,这里刷新页面也能马上查看到更改后的值,因为@RefreshScope 注解

3.3 命名空间切换

在实际开发中,通常有多套不同的环境(默认只有public),那么这个时候可以根据指定的环境来创建不同的 namespce,例如,开发、测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。以此来实现多环境的隔离。

3.4 加载多配置文件

偶尔情况下需要加载多个配置文件。如果redis配置,jdbc配置等在不同的配置文件中。
如下图

在这里插入图片描述

jdbc.properties配置中:jdbc.url=xxxxxx

redis.properties配置中:redis.url=yyyy

  cloud:
    #nacos注册中心配置
    nacos:
      config:
        #nacos注册中心地址
        server-addr: localhost:8848
        name: provider # 指定配置文件名称  DataId,  不写时,默认与application.name一致
        namespace: 84c90b39-8826-48bc-bef4-d66ae40e1c73  # 命名空间切换,指定命名空间,要复制命名的id过来
        file-extension: yml #指定nacos中配置文件为yml类型文件(文件扩展名),  不指定时默认扩展名为properties
#        extensionConfigs:   这样也可以指定配置多个配置文件
#          - data-id: redis.properties
#            refresh: true
#          - data-id: db.properties
#            refresh: true
        extension-configs[0]:
          data-id: redis.properties
          group: GROUP1  # 不指定默认为 DEFAULT_GROUP
          refresh: true  # 开启动态刷新,注册中心的值改变了,项目中能马上读取到最新的值。在代码里面还要加上@RefreshScope注解
        extension-configs[1]:
          data-id: db.properties
          refresh: true

注意老版本:是用ext-config

3.5 配置的分组

在实际开发中,除了不同的环境外。不同的微服务或者业务功能,可能有不同的redis及mysql数据库。

区分不同的环境我们使用名称空间(namespace),区分不同的微服务或功能,使用分组(group)。

当然,你也可以反过来使用,名称空间和分组只是为了更好的区分配置,提供的两个维度而已。

3.6 项目中总配置

bootstrap.yml 文件中

# 云端配置文件

spring:
  application:
    name: provider
  devtools:
    restart:
      enabled: true
      additional-paths: src/main/hava
  cloud:
    #nacos注册中心配置
    nacos:
      config:
        #nacos注册中心地址
        server-addr: localhost:8848
        name: provider # 指定配置文件名称  DataId,  不写时,默认与application.name一致
        namespace: 84c90b39-8826-48bc-bef4-d66ae40e1c73  # 命名空间切换,指定命名空间,要复制命名的id过来
        file-extension: yml #指定nacos中配置文件为yml类型文件(文件扩展名),  不指定时默认扩展名为properties
#        extensionConfigs:   这样也可以指定配置多个配置文件
#          - data-id: redis.properties
#            refresh: true
#          - data-id: db.properties
#            refresh: true
        extension-configs[0]:
          data-id: redis.properties
          group: GROUP1  # 不指定默认为 DEFAULT_GROUP
          refresh: true  # 开启动态刷新,注册中心的值改变了,项目中能马上读取到最新的值
        extension-configs[1]:
          data-id: db.properties
          refresh: true
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值