天天看点

springcloud学习-19 Spring Cloud Alibaba、Nacos服务注册和配置中心【周阳springcloud2020学习笔记】

Spring Cloud Alibaba了解

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。

此项目包含开发分布式应用微服务的必需组件,方便开发者通过 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:Apache Dubbo™ 是一款高性能 Java RPC 框架。
  • Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
  • Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
  • Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。

    您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

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

Nacos服务注册和配置中心

Nacos:

英文全称Dynamic Naming and Configuration Service,是指该注册/配置中心都是以服务为核心。(Nacos就是注册中心+配置中心的组合)

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。

作用:

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

各种注册中心比较:

框架 CAP模型 控制台管理 社区活跃度
eureka AP 支持
zookeeper CP 不支持
consul CP 支持
nacos AP 支持

一、安装并运行Nacos

1.环境要求:Java8+Maven环境

2.https://github.com/alibaba/nacos/releases/tag/1.1.4

3.解压安装包,直接运行bin目录下的startup.cmd

4.命令运行成功后直接访问http://localhost:8848/nacos

账号密码都是nacos

二、Nacos作为服务注册中心演示

1.基于Nacos的服务提供者

1)新建module:alibaba-nacos-provider-payment9001

2)pom

  • 父pom
<!-- 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>

- 本模块pom
<dependencies>

    <!-- 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-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- devtools -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>

    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

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

    <!-- fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>

 </dependencies>
           

3)yml

server:
  port: 9001

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

management:
  endpoints:
    web:
      exposure:
        include: '*'
           

4)主启动

@EnableDiscoveryClient
@SpringBootApplication
public class NacosPayment9001 {
    public static void main(String[] args) {
        SpringApplication.run(NacosPayment9001.class,args);
    }
}
           

5)业务类

@RestController
@RequestMapping("/payment")
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

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

6)测试

  • http://lcoalhost:9001/payment/nacos/1
  • 查看nacos控制台
  • nacos服务注册中心+服务提供者9001都ok了

7)nacos的负载均衡,参照9001新建9002,步骤同上

2.基于Nacos的服务消费者

1)新建Module:alibaba-nacos-consumer-order83

2)pom

<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
     <!--公共模块-->
    <dependency>
        <groupId>cn.chen.demo</groupId>
        <artifactId>api-common</artifactId>
        <version>${project.version}</version>
    </dependency>
    <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>

   <!-- devtools工具 -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-devtools</artifactId>
       <scope>runtime</scope>
       <optional>true</optional>
   </dependency>

   <!-- lombok -->
   <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
       <optional>true</optional>
   </dependency>

   <!-- test -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
   </dependency>
</dependencies>
           

3)yml

server:
  port: 83

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

service-url:
  nacos-user-service: http://nacos-payment-provider
           

4)主启动

@EnableDiscoveryClient
@SpringBootApplication
public class NacosOrder83 {
    public static void main(String[] args) {
        SpringApplication.run(NacosOrder83.class,args);
    }
}
           

5)业务类

  • ApplicationContextConfig
@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}
           
  • NacosOrderController
@RestController
@Slf4j
@RequestMapping("/consumer")
public class NacosOrderController {
    @Resource
    private RestTemplate restTemplate;

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

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

}
           

6)测试

nacos控制台查看

http://localhost:83/consumer/payment/nacos/13

83访问9001/9002,轮询负载OK

springcloud学习-19 Spring Cloud Alibaba、Nacos服务注册和配置中心【周阳springcloud2020学习笔记】
springcloud学习-19 Spring Cloud Alibaba、Nacos服务注册和配置中心【周阳springcloud2020学习笔记】
springcloud学习-19 Spring Cloud Alibaba、Nacos服务注册和配置中心【周阳springcloud2020学习笔记】
springcloud学习-19 Spring Cloud Alibaba、Nacos服务注册和配置中心【周阳springcloud2020学习笔记】

Nacos支持AP和CP模式的切换

三、Nacos作为服务配置中心演示

Nacos作为配置中心-基础配置

1.建module:alibaba-config-nacos-client3377

2.pom

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

    <!-- devtools -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <!-- lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!-- test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>
           

3.yml:配置两个

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

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

1)bootstrap.yml

#nacos注册中心
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置,目前只支持 properties 和 yaml 类型
           

2)application.yml

#nocaos注册配置
spring:
  profiles:
    active: dev
           

4.主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClient3377
{
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClient3377.class, args);
    }
}
           

5.业务类

@RestController
@RefreshScope //实现配置自动刷新
@RequestMapping("/nacosclient")
public class ConfigClientController
{
	@Value("${config.info}")
	private String configInfo;

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

6.在Nacos中添加配置信息

  • Nacos中的匹配规则:Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则
  • 配置管理->配置列表->新增 nacos-config-client-dev.yaml

    1)设置DataId

公式:

  • prefix 默认为 spring.application.name 的值
  • spring.profile.active 既为当前环境对应的 profile,可以通过配置项 spring.profile.active 配置
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 配置

    【公式对应

    ${spring.application.name} -> bootstrap.yml中nacos-config-client

    ${spring.profile.active} -> application.yml中dev

    ${spring.cloud.nacos.config.file-extension} -> bootstrap.yml中yaml

    即 nacos-config-client-dev.yaml

2)配置内容

config:
    info: "test config for dev. From nacos config center. No.1 "
           

7.启动3377。

访问http://localhost:3377/nacosclient/config/info

正常,ok了。

四、Nacos集群和持久化配置(重要)

springcloud学习系列目录