目录

0:学习SpringCloudAlibaba(2023.x分支)

1:安装Nacos(2.3.2)

2:什么是Nacos

2.1:什么是Nacos 

2.2:案例架构

4:服务提供者81、82使用案例

4.1:提供者8081和8082的pom

4.2: 提供者8081和8082的pom的controller

4.3: 提供者8081和8082的properties

4.4: 提供者8081和8082的main方法

 4.5:启动查看

5:消费者80使用案例

5.1:消费者8080的pom

5.2:消费者8080的properties

5.3:消费者8080的controller

5.4:消费者8003的mian方法

5.5:启动查看

5.6:调用8080返回不同的端口号,证明8080负载调用了8001和8002

6:动态配置使用

6.1:8080的导入配置包

6.2:8080的properties

6.3:nacos服务器新建配置

6.4:8080controller方法

6.5:命名空间、分组隔离

7:Nacos的cap问题(支持AP和CP的切换)

8:nocas的集群和持久化(具体部署请查阅官网)


0:学习SpringCloudAlibaba(2023.x分支)

SpringCloud Alibaba是基于SpringCloud的一个微服务框架,它提供了对分布式服务的完整支持,包括服务注册与发现、配置中心、服务熔断保护、分布式事务处理等。SpringCloud Alibaba的目标是让分布式服务更加易用,减少开发人员的工作量。 

1:springcloud官网的Eurake、Feign、Hystrix、Zuul、Config、Bus都已经停止了更新,进入维护阶段。导致后劲乏力

2:国产的SpringCloudAlibaba,兼容性能强,组件少,一个组件能代替springcloud的好几个组件,减少学习成本

3:国产的SpringCloudAlibaba在阿里中,能够应对双十一的压力,证明产品可靠性高

4:国产的SpringCloudAlibaba,学习使用更加简单方便,易于学习,页面管理也很方便。

springCloud阿里巴巴2023.0.1.0  官网地址https://sca.aliyun.com/en/

适配jdk17 、Spring Boot 3.2.*、Spring Cloud 2023.x及更高版本springboot3.2.*

本章节我们基于最新版的2023.0.1.0版本来学习

1:安装Nacos(2.3.2)

下载:官网Releases · alibaba/nacos · GitHub下载版本2.3.3

解压:解压到自己的文件夹下边

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

sh startup.sh -m standalone

查看:http://localhost:8848/nacos/#/login 账户密码都是nocas

nacos支持CP和AP模式,但是默认是AP模式,也就是高可用模式。

2:什么是Nacos

官网快速开始:Nacos 快速开始 | Nacos 官网

Nacos主要功能就是服务发现和配置管理

2.1:什么是Nacos 

nocas是SpringCloudAlibaba的一个组件,主要用来实现服务注册,服务发现,动态配置管理服务发现是微服务体系结构中的关键组件之一。

在这样的体系结构中,为每个客户端手动配置服务列表可能是艰巨的任务,并且使动态扩展极为困难。Nacos Discovery帮助您自动将服务注册到Nacos服务器,并且Nacos服务器会跟踪服务并动态刷新服务列表。此外,Nacos Discovery注册服务实例的一些元数据,例如主机,端口,运行状况检查URL,Nacos主页。

nocas=Eurake(服务注册服务发现)+config(配置文件统一管理,但不能统一推送)+Bus(消息队列实现配置文件统一推送)

2.2:案例架构

在案例中8081,8082,8080向nocas注册服务,然后8081、8082作为相同的服务集群,给8003调用

给8080调用负载均衡调用8081和8082,得到服务器的端口号

4:服务提供者81、82使用案例

父类项目pom配置



    <!--父工程 springboot 2.1.3-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
      
    </parent>

    <!--统一jar的版本管理-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>

    </properties>

    <!--父工程管理子项目  子项目不用指定版本号 子项目需要引入具体的需求包-->
    <dependencyManagement>
        <dependencies>
            <!--springcloud 包Greenwich-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springcloud阿里巴巴包 采用2.1-->
            <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>



  

</project>

4.1:提供者8081和8082的pom

  <properties>
        <java.version>17</java.version>
        <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
    </properties>


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



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

4.2: 提供者8081和8082的pom的controller

该controller只提供一个返回端口的方法,没有业务逻辑,专注与架构

 @Value("${server.port}")
    String port;
    @GetMapping(value = "/pay/port")
    public String nacos_port() {
        System.out.println("Nacos的端口:"+port);
        return "端口号:"+port;
    }

4.3: 提供者8081和8082的properties

server:
  port: 8081 #端口号8081和8082
spring:
  application:
    name: PayService
  datasource:
    url: jdbc:mysql://localhost:3306/SpringCloud2024?useUnicode=true&characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      minIdle: 10 #最小
      max-active: 20 #最大存活连接
      max-wait: 6000 #等待超时时间
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #nacos的地址

4.4: 提供者8081和8082的main方法

@SpringBootApplication
@EnableDiscoveryClient //nacos的服务发现注解
public class SpringCloud_Alibaba_Pay8081 {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloud_Alibaba_Pay8081.class, args);
    }
}

 4.5:启动查看

5:消费者8080使用案例

5.1:消费者8080的pom

   

    <!--
    1:springCloud阿里巴巴2023.0.1.0 官网https://sca.aliyun.com/en/
    适用于Spring Boot 3.2
    -->
    <properties>
        <java.version>17</java.version>
        <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
        <spring-cloud.version>2023.0.3</spring-cloud.version>
    </properties>


<!--  nacos服务注册发现 消费者必须引入loadbalancer-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-openfeign-core</artifactId>
        </dependency>



 <dependencyManagement>
        <dependencies>
            <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>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>


    </dependencyManagement>

5.2:消费者8080的properties

server:
  port: 8080
spring:
  application:
    name: SpringCloudAlibaba_Consumer1
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #nacos的地址

5.3:消费者8080的controller

该controller通过resttemple调用服务,得到端口号

@RestController
@RefreshScope //动态刷新获取config,config的注解
public class Controller {

    /**
     * 调用nocas上注册的服务
     * 采用restTemplate1+robbin的LoadBalanced注解
     * @return
     */
    @Resource
    private RestTemplate restTemplate1;

    @RequestMapping(value = "/get")
    public String add (){
        String url="http://huyiju-nacosservice/add";
        System.out.println("进入调用");
        return restTemplate1.getForObject(url,String.class);

    }
}


@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}
/**
 * 通过RestTemplate
 * 订单服务Controller的服务8080  ---> 调用远程的8081、8082的支付服务
 */
@RestController
public class OrderControllerRestTemplate { 

    //Nacos的注册服务地址 地址是服务的名字
    public final String payUrl = "http://PayService/pay/";
    @Resource
    RestTemplate restTemplate;

    @GetMapping(value = "/consumer/pay/port")
    public String getPort() {
        String port = restTemplate.getForEntity(payUrl + "port",String.class).getBody();
        return port;
    }
}



@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced //需要配置负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder().build();
    }
}

5.4:消费者8003的mian方法

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启feign客户端注解
//(basePackages = "org.example.cloudapi_commoms.Apis") 
public class SpringCloudAlibabaConsumer1Application {
	public static void main(String[] args) {
		SpringApplication.run(SpringCloudAlibabaConsumer1Application.class, args);
	}
}

5.5:启动查看

5.6:调用8080返回不同的端口号,证明8080负载调用了8001和8002

 

6:动态配置使用

我们使用8080来获取nocas的动态配置

6.1:8080的导入配置包

        <!--  nacos服务配置管理 依赖jar-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--开启Spring Cloud 应用程序启动时加载bootstrap配置文件-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

6.2:8080的properties

spring:
  application:
    name: SpringCloudAlibaba-Consumer1
  cloud:
    nacos:
      discovery: #服务注册
        server-addr: 127.0.0.1:8848 #nacos的服务注册地址
      config: #配置中心
        server-addr: 127.0.0.1:8848 #nacos的配置中心地址
        file-extension: yaml #文件后缀
        prefix: SpringCloudAlibaba-Consumer1
  profiles: #默认文件名字是 SpringCloudAlibaba-Consumer1-test.yml
    active: test #这个是指定配置中心的上生效文件的  -test

6.3:nacos服务器新建配置

​​

6.4:8080controller方法

/**
 * nacos的动态配置管理测试
 */
@RestController
@RefreshScope //动态刷新 修改了立马可知
public class OrderControllerConfig {


    //配置管理,可以修改配置文件测试
    @Value("${config.info}")
    private String config_info;
    
    @GetMapping(value = "/feign/pay/info")
    public String getInfo() {
        System.out.println("动态配置管理");
        return "返回值:"+config_info;
    }


}

在测试的过程中,即使nacos挂了,消费者也能够调用服务提供者,因为消费者本地会从nacos注册中心中下载一份服务列表到本机,所以即使nacos挂了,也能调用。但是这是不能注册新的服务了。这就是注册表缓存。

6.5:命名空间、分组隔离

新建命名空间:

新建yaml:

修改配置:

spring:
  application:
    name: SpringCloudAlibaba-Consumer1
  cloud:
    nacos:
      discovery: #服务注册
        server-addr: 127.0.0.1:8848 #nacos的服务注册地址
      config: #配置中心
        server-addr: 127.0.0.1:8848 #nacos的配置中心地址
        file-extension: yaml #文件后缀
        prefix: SpringCloudAlibaba-Consumer1
        group: dev_group #分组id
        namespace: c25e3f5d-f945-4617-9b9c-9070fd2b3ba9 #新建命名空间nacos生成id
  profiles: #默认文件名字是 SpringCloudAlibaba_Consumer1-test.yml
    active: dev #这个是指定配置中心的上生效文件的  -test

7:Nacos的cap问题(支持AP和CP的切换)

7.1:AP模式

  • Nacos AP 模式基于 Distro 协议去中心化、无 Leader
  • 服务注册:客户端连任意节点 → 写内存 → 立即成功 → 异步同步(有的集群节点还没有注册上服务)
  • 服务发现:客户端拉取列表连接任意一个集群节点获取服务列表 → 本地缓存服务列表 → 定时更新(一般3秒)
  • 服务调用:本地负载均衡直连实例,不经过 Nacos
  • 核心保证:A 可用性 + P 分区容错,数据最终一致
  • 适合 99% 微服务场景:互联网、电商、中台、企业应用

7.2:CP模式

Nacos CP 模式基于 Raft 一致性算法实现,核心是:强一致、有 Leader、写必须过半确认、牺牲部分可用性换一致性

Nacos的AP和CP模式切换
C:是所有节点在同一时间看到的数据是一致,数据一致行
A:是所有请求都会收到响应,Nocas高可用性

何时选用哪种模式?

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud 和 Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式。CP模式下支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

8:nocas的集群和持久化(具体部署请查阅官网)

官方推荐nocas在生产环境尽量使用集群,3台以上的nocas服务中心,一个mysql数据库用来维持数据一致性。一个niginx代理3台nocas服务,只需访问nignx地址进入nocas服务页面

在这里插入图片描述​​
 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐