[java]-[cloud]基础篇-Spring Cloud Alibaba、Nacos注册与发现

Spring Cloud Alibaba是什么?

​ Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

主要功能

服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。

分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。

阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。

阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

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

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

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

Dubbo:ApacheDubbo™ 是一款高性能 Java RPC 框架。

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

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS:阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

Alibaba Cloud SMS:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

学习 程序猿DD-翟永超-Spring Cloud Alibaba基础教程

为什么不使用Spring Cloud

​ 因为需要考虑Eureka 宣布闭源的问题。然而官方说的是 Eureka 2.0 的开源工作已经停止,依赖于开源库里面的 Eureka 2.x 分支构建的项目或者相关代码,风险自负!Spring Cloud 还是在 1.x 上面开发的,但有必要考虑到这一点所以可以使用Spring Cloud Alibaba

使用 Nacos Discovery Starter 完成微服务应用的服务注册与发现

组件版本关系

声明版本

1、在 公共项目dependencyManagement 中添加如下配置

<dependencyManagement>
    <dependencies>
        <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>

引入依赖

2、然后在 dependencies 中添加依赖,引入 Nacos Discovery Starter

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

配置地址

3、其次,修改各个服务的/src/main/resources/application.yml配置文件中配置 Nacos Server 地址

 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

开启服务

4、然后在SpringBoot启动类添加@EnableDiscoveryClient 注解开启服务注册与发现功能

启动Nacos

5、最后启动 Nacos Server,首先需要获取 Nacos Server,支持直接下载和源码构建两种方式。

直接下载:Nacos Server 下载页

源码构建:进入 Nacos Github 项目页面,将代码 git clone 到本地自行编译打包。

下载完后,运行启动 Server,进入解压后文件夹或编译打包好的文件夹,找到如下相对文件夹 nacos/bin,并对照操作系统实际情况之下如下命令。

Linux/Unix/Mac 操作系统,执行命令 sh startup.sh -m standalone
Windows 操作系统,执行命令 cmd startup.cmd

6、Nacos Server 启动后,则可以启动项目,然后进入Nacos监控页面,则可以查看服务节点已经成功注册到 Nacos Server

http://127.0.0.1:8848/nacos
用户名和密码默认都为nacos

Nacos文档

使用SpringCloud-OpenFeign远程调用服务

引入依赖

1.创建项目时引入依赖(谁需要调用服务则需要引入依赖)

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

编写接口

2.编写一个接口,告诉SpringCloud这个接口需要调用远程服务

@FeignClient("指定需要调用服务名")
public interface TestFeignService {
    @RequestMapping("需要调用远程服务的controller方法全路径")
    //方法名和返回值,参数需要和远程调用方法一致
    public R testFeignMethod();
    
}

开启调用

3.在项目启动类添加注解

@EnableFeignClients("这里写上面创建接口的全包名")

使用服务

4.调用远程服务

@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private TestFeignService testFeignService;

    @RequestMapping("/test")
    public R test() {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("张三");

        R memberCoupons = testFeignService.testFeignMethod();
        return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
   		 }
    }

测试调用

5.接下来就可以启动项目测试输入http://localhost:8000/member/member/test 成功页面

调用过程

​ 调用过程:会先根据@EnableFeignClients注解指定的接口的全包名找到接口,然后通过@FeignClient注解指定的需要调用服务名找到服务(调用者和被调用者都需要注册到Nacos中),在根据方法名和指定的方法全路径找到远程服务方法进行调用。

使用 Nacos Config Starter 完成微服务应用的服务注册与发现

引入依赖

1、在公共项目pom.xml文件中添加依赖

2、在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据

 spring.application.name=服务名
 spring.cloud.nacos.config.server-addr=127.0.0.1:8848

SpringBoot中有以下两种配置文件bootstrap (.yml 或者 .properties),application (.yml 或者 .properties)

  • 1、加载顺序上的区别: 在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于applicaton。bootstrap主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
  • 2、应用场景:bootstrap.yml 和application.yml 都可以用来配置参数。 bootstrap配置文件可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。 application 配置文件可以用来定义应用级别的,主要用于 Spring Boot 项目的自动化配置。bootstrap 配置文件有以下几个应用场景:使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息,一些固定的不能被覆盖的属性,一些加密/解密的场景。

发布配置

3、完成上述两步后,使用的 Nacos自带控制台发布配置

  • dataId和group在项目启动日志控制台中可以找到:
    例:Loading nacos data, dataId:‘gulimall-coupon.properties’, group: 'DEFAULT_GROUP

  • 修改group需要在配置文件中添加spring.cloud.nacos.config.group=MY_GROUP
    注:该配置必须放在 bootstrap.properties 文件中

还可以在命令行中发布配置:

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=user.id=1%0Auser.name=james%0Auser.age=17"

注入配置

3、发布成功配置后启动应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加@RefreshScope 打开动态刷新功能

 @RefreshScope
 class SampleController {

 	@Value("${user.name}")
 	String userName;

 	@Value("${user.age}")
 	int age;
   
    @RequestMapping("/testNacosConfig")
    public R testNacosConfig(){
        return R.ok().put("userName",userName).put("age",age);
    }
 }

读取配置

4、启动项目打开自定义路径可以看到读取到之前配置的属性值

{
"msg": "success",
"code": 0,
"userName": "DAIHAO",
"age": 18
}

修改配置则只需要在Nacos Cofig中修改配置重新发布即可,@RefreshScope注解会动态刷新读取配置中心的配置

Nacos概念

1、命名空间:配置隔离;

  • 默认:public(保留空间);默认新增的所有配置都在public空间。

  • 1)、开发,测试,生产:利用命名空间来做环境隔离。
    注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置

spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
  • 2)、每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

2、配置集:即所有的配置的集合。一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。

3、配置集ID:Nacos 中的某个配置集的 ID( Data ID)。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。

4、配置分组:默认所有的配置集都属于:DEFAULT_GROUP;
    项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod

5、同时加载多个配置集

  • 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
  • 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
  • 3)、在这里插入图片描述以前SpringBoot任何方法从配置文件中获取值,都能使用。配置中心有的优先使用配置中心中的

将配置集拆分开

可分别配置在开发环境下不同服务的配置

数据源配置

mybatis配置

在bootstrap.properties配置文件中配置要读取的配置

还有一些概念有可以官方文档查看Nacos文档

Nacos和zookeeper

特性 zookeeper nacos
一致性协议 CP CP + AP
健康检查 Keep Alive tcp/http/mysql/client beat
负载均衡 权重/selector/metadata
多数据中心 不支持 支持
跨注册中心同步 不支持 支持
雪崩保护
访问协议 tcp http/dns
k8s集成 不支持 支持
dubbo集成 支持 支持

Nacos原理

心跳机制

每5秒对心跳请求ip地址更新心跳时间,有个定时任务每5s会检查是不是太久没心跳,如果没心跳就下线掉这个实例

怎么发起的心跳请求:nacos定时向所有的nacos服务中心服务器发送心跳

Nacos服务注册发现步骤

1、服务提供者将注册信息写入到Nacos注册中心的服务注册表中

2、服务注册中心将服务提供者的实例交给Service Holder(服务持有容器)处理,服务实例将会挂载在Service Holder的空间下

3、服务注册成功后,提供者将与服务中心维持心跳,未能及时发送心跳的服务将会被剔除

4、服务发现支持两种场景

消费者可以直接向注册中心发送获取某个服务实例的请求,这种情况下注册中心将返回所有可用的服务实例给消费者,但是一般不推荐这种情况。

服务的消费者向注册中心订阅某个服务,并提交一个监听器,当注册中心中服务发生变更时,监听器会收到通知,这时消费者更新本地的服务实例列表,以保证所有的服务均是可用的。

负载均衡

负载均衡有很多中实现方式,包括轮询法,随机方法法,对请求ip做hash后取模等等,从负载的维度考虑又分为:服务端负载均衡和客户端负载均衡。

Nacos 的客户端在获取到服务的完整实例列表后,会在客户端进行负载均衡算法来获取一个可用的实例,模式使用的是随机获取的方式。

转载自:https://blog.csdn.net/D_A_I_H_A_O/article/details/105399936

posted on 2023-03-09 21:30  共感的艺术  阅读(46)  评论(0编辑  收藏  举报