springcloudalibaba——nacos(代码片段)

cj_eryue cj_eryue     2023-01-06     575

关键词:

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

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

诞生:2018.10.31,Spring Cloud Alibaba 正式入驻了Spring Cloud官方孵化器,并在Maven 中央库发布了第一个版本。

能干嘛

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

父工程引入:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.5.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

一、下载和安装

为什么叫Nacos

  • 前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。

是什么

  • 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  • Nacos: Dynamic Naming and Configuration Service
  • Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus

能干嘛

  • 替代Eureka做服务注册中心
  • 替代Config做服务配置中心

去哪下

Releases · alibaba/nacos · GitHub

安装

  • 本地Java8+Maven环境已经OK先
  • 官网下载Nacos
  • 解压安装包,直接运行bin目录下的startup.cmd
  • 命令运行成功后直接访问http://localhost:8848/nacos,默认账号密码都是nacos

新版本需要修改配置:

 

二、注册中心

2.1 构建服务提供者

新建 cloudalibaba-provider-payment9001

父工程引入

<dependencyManagement>
    <dependencies>
        <!--spring cloud alibaba 2.1.0.RELEASE-->
        <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>
    </dependencies>
</dependencyManagement>

本工程pom:

<dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合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>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

yml:

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'
package com.cjian.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/24 16:45
 */
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 
    public static void main(String[] args) 
        SpringApplication.run(PaymentMain9001.class, args);
    

package com.cjian.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/24 16:45
 */
@RestController
public class PaymentController 
    @Value("$server.port")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/id")
    public String getPayment(@PathVariable("id") Integer id) 
        return "nacos registry, serverPort: "+ serverPort+"\\t id"+id;
    

2.2 测试

启动9001,访问   http://localhost:9001/payment/nacos/1 和 http://localhost:9002/payment/nacos/1 (为了下一章节演示nacos的负载均衡,参照9001新建9002了)


nacos控制台

2.3.构建服务消费者

新建 cloudalibaba-consumer-nacos-order83

<dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringBoot整合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>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider
package com.cjian.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/24 17:20
 */
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83

    public static void main(String[] args)
    
        SpringApplication.run(OrderNacosMain83.class,args);
    

package com.cjian.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/24 17:20
 */
@Configuration
public class ApplicationContextConfig

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate()
    
        return new RestTemplate();
    

package com.cjian.springcloud.controller;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/24 17:21
 */
@RestController
@Slf4j
public class OrderNacosController 

    @Resource
    private RestTemplate restTemplate;

    @Value("$service-url.nacos-user-service")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/id")
    public String paymentInfo(@PathVariable("id") Long id)
    
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    

服务均注册正常:

2.4 测试

访问  http://localhost:83/consumer/payment/nacos/1

 

三、配置中心

新建服务:cloudalibaba-config-nacos-client3377

<dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <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>
        <!--一般基础配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置


# $spring.application.name-$spring.profile.active.$spring.cloud.nacos.config.file-extension
# nacos-config-client-dev.yaml

application.yml  

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: info
package com.cjian.springclud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/26 9:35
 */
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377

    public static void main(String[] args) 
        SpringApplication.run(NacosConfigClientMain3377.class, args);
    

package com.cjian.springclud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description:
 * @author: CJ
 * @time: 2021/9/26 9:36
 */
@RestController
@RefreshScope //支持Nacos的动态刷新功能。
public class ConfigClientController

    @Value("$config.info")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() 
        return configInfo;
    

在Nacos中添加配置信息

Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则

官网文档

 新增配置:

 测试:

启动83,访问 http://localhost:3377/config/info

自带动态刷新

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。

 

问题 - 多环境多项目管理

问题1:

实际开发中,通常一个系统会准备

dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:

一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?

默认情况:Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

Nacos默认的Namespace是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务:一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ) ,给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。

DataID配置 

指定spring.profile.active和配置文件的DatalD来使不同环境下读取不同的配置

默认空间+默认分组+新建dev和test两个DatalD

 新建  nacos-config-client-test.yaml

修改application.yml配置:

spring:
  profiles:
    #active: dev # 表示开发环境
    active: test # 表示测试环境
    #active: info

 测试:访问 http://localhost:3377/config/info

Group分组方案 

新建两个DATA ID为nacos-config-client-info.yaml,group 分别为 DEV_GROUP和TEST_GROUP

修改 bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP

在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST GROUP

application.yml

spring:
  profiles:
    #active: dev # 表示开发环境
    #active: test # 表示测试环境
    active: info

重启后访问: http://localhost:3377/config/info

Namespace空间方案 

新建dev的Namespace

 

新增配置:

active环境为dev (开发环境)

 bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP
        namespace: DEV

 测试:  http://localhost:3377/config/info

四、持久化和集群配置

待整理~ 

springcloudalibaba基础教程:nacos配置的加载规则详解(代码片段)

前情回顾:《SpringCloudAlibaba基础教程:使用Nacos实现服务注册与发现》《SpringCloudAlibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)》《SpringCloudAlibaba基础教程:使用Nacos作为配置中心》上一篇,我们学习了如... 查看详情

springcloudalibaba之nacos组件(代码片段)

文章目录1、概述2、父项目搭建3、Nacos介绍3.1、是什么3.2、干什么3.3、服务注册与发现框架对比3.4、CP和AP4、Nacos服务注册4.1、Nacos服务提供者项目搭建4.2、Nacos服务消费者项目搭建4.3、结果分析5、Nacos配置中心5.1、Nacos配置中心基... 查看详情

微服务springcloudalibaba之nacos篇,nacos就是注册中心+配置中心的组合

...务,面试前如何快速熟悉微服务第二篇:微服务SpringCloudAlibaba之Nacos篇,Nacos就是注册中心+配置中心的组合第三篇:微服务SpringCloudAlibaba之Sentinel篇,使用熔断器防止雪崩第四篇:SpringClou 查看详情

springcloudalibaba——nacos(代码片段)

SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。依托SpringCloudAlibaba,您只需要添加一些... 查看详情

springcloudalibaba——nacos(代码片段)

SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。依托SpringCloudAlibaba,您只需要添加一些... 查看详情

微服务-springcloudalibaba-nacos服务注册

参考技术ASpringCloudAlibaba使用的是nacos作为服务注册,和Eureka对比一下,看看孰优孰劣。可以对比一下,nacos设计应该和eureka是互相参考的,设计原理基本一样。和eureka相比,几乎一模一样,不同的是eureka本身需要开发者组装起来... 查看详情

“基于springcloudalibaba的微服务架构实战:nacos配置管理“(代码片段)

引言SpringCloudAlibaba是SpringCloud和Alibaba集团联合推出的开源微服务框架,旨在为Java开发者提供一种简单、易用、高效的微服务解决方案。Nacos是一个面向云原生应用的动态服务发现、配置管理和服务管理平台,提供了服务... 查看详情

商城项目04_springcloudalibaba概述nacos作为注册配置中心声明式远程调用feign(代码片段)

文章目录①.SpringCloudAlibaba简介②.SpringCloudAlibaba-Nacos作为注册中心③.声明式远程调用Feign④.SpringCloudAlibaba-Nacos作为配置中心①.SpringCloudAlibaba简介①.SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式... 查看详情

springcloudalibaba实战之nacos服务注册和发现

...务实例的自动化注册与发现,是微服务治理的核心,学习SpringCloudAlibaba,首先要了解框架中的服务注册和发现组件——Nacos。一、SpringCloud服务注册和发现组件1.SpringCloudEureka闭源风波在SpringCloud的子项目中,SpringCloudNetflix提... 查看详情

视频作品《[springcloudalibaba]微服务之注册中心nacos》上线了

1.场景描述第二个视频作品出炉了,《[SpringCloudAlibaba]微服务之注册中心nacos》上线了,有需要的朋友可以直接点击链接观看。(如需购买,请通过本文链接购买)2.课程内容课程地址:https://edu.51cto.com/sd/a6ff4课程目录:第一章课... 查看详情

springcloudalibaba基础教程:使用nacos实现服务注册与发现

自SpringCloudAlibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然SpringCloudAlibaba还没能纳入SpringCloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于SpringCloudAlibaba中的几项主要... 查看详情

springcloudalibaba实战(6:nacos-server服务搭建)(代码片段)

...更新中……大家好,我是三分恶。这一节我们来学习SpringCloudAlibaba体系中一个非常重要的组件——Nacos。1、Nacos简介Nacos官方网站:https://nacos.io/zh-cn/1.1、什么是NacosNacos是阿里巴巴开源的 查看详情

springcloudalibaba微服务组件nacos配置中心

...式系统中的外部化配置提供服务器端和客户端支持。使用SpringCloudAlibabaNacosConfig,您可以在Na 查看详情

springcloud-springcloudalibaba之nacos(代码片段)

阅读本文可先参考博文https://blog.csdn.net/MinggeQingchun/article/details/125613600Nacos(英文全称:DynamicNamingandConfigurationService),是由阿里巴巴团队使用Java语言开发并于2018年7月推出来的开源项目(Nacos&#x 查看详情

springcloudalibaba初体验nacos服务注册与发现

一、服务注册添加依赖:<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.0.RELEASE</version&g 查看详情

springcloudalibaba微服务组件nacos配置中心(代码片段)

...式系统中的外部化配置提供服务器端和客户端支持。使用SpringCloudAlibabaNacosConfig,您可以在Na 查看详情

springcloudalibaba微服务组件nacos配置中心(代码片段)

...式系统中的外部化配置提供服务器端和客户端支持。使用SpringCloudAlibabaNacosConfig,您可以在Na 查看详情

springcloud微服务springcloudalibaba整合nacos实战(代码片段)

...1下载安装包4.2 修改脚本启动模式4.3  启动nacos服务五、SpringCloudAlibaba整合Nacos5.1 Spring Cloud Alibaba版本选型5.2 实验整合案例说明5.3 整合完整过程5.3.1创建聚合工程,包括两个子模块5.3.2 根pom引入如下依赖5.3.3 子模块导入... 查看详情